Aktuality komplet

Z PostgreSQL
Skočit na navigaci Skočit na vyhledávání

Aktualizace mediawiki

25.2.2009 Během minulého týdne došlo k přesunutí site http://www.pgsql.cz, aktualizaci na novou verzi Mediawiki, a migraci do domény http://www.postgres.cz. Během této doby došlo několikrát k omezení dostupnosti, za což se dodatečně omlouváme. V novém prostředí se jako backend používá PostgreSQL - což můžete vidět např. na fulltextu.

Detaily ohledně připravované konference

1.1.2009 Prague PostgreSQL Developers' Day 2009 naleznete na adrese http://www.postgres.cz/p2d2/2009/

Analytické (window) funkce v CVS HEAD

29.12.2008 Tom Lane před několika hodinami commitnul (http://archives.postgresql.org/pgsql-committers/2008-12/msg00208.php) patch Hitoshi Harady, který přidává podporu pro analytické funkce dle specifikace SQL 2008.

Příklad (vypůjčený od Hitoshiho):

sample=# SELECT * FROM empsalary;
  depname  | empno | salary | enroll_date 
-----------+-------+--------+-------------
 develop   |    10 |   5200 | 2007-08-01
 sales     |     1 |   5000 | 2006-10-01
 personnel |     5 |   3500 | 2007-12-10
 sales     |     4 |   4800 | 2007-08-08
 sales     |     6 |   5500 | 2007-01-02
 personnel |     2 |   3900 | 2006-12-23
 develop   |     7 |   4200 | 2008-01-01
 develop   |     9 |   4500 | 2008-01-01
 sales     |     3 |   4800 | 2007-08-01
 develop   |     8 |   6000 | 2006-10-01
 develop   |    11 |   5200 | 2007-08-15
(11 rows)
sample=# SELECT depname, empno, salary, sum(salary) OVER (PARTITION BY depname) FROM empsalary;
  depname  | empno | salary |  sum  
-----------+-------+--------+-------
 develop   |    10 |   5200 | 25100
 develop   |     7 |   4200 | 25100
 develop   |     9 |   4500 | 25100
 develop   |     8 |   6000 | 25100
 develop   |    11 |   5200 | 25100
 personnel |     2 |   3900 |  7400
 personnel |     5 |   3500 |  7400
 sales     |     3 |   4800 | 20100
 sales     |     1 |   5000 | 20100
 sales     |     4 |   4800 | 20100
 sales     |     6 |   5500 | 20100
(11 rows)

Další příklady použití jsou třeba na wikipedii - http://en.wikipedia.org/wiki/Select_(SQL)#ROW_NUMBER.28.29_window_function nebo na http://www.gavinsherry.org/talks/window_talk.pdf

CVS HEAD obsahuje podporu pro def. parametry funkcí

4.12.2008 Pro letošní rok jsem s pg skončil - commit http://archives.postgresql.org/pgsql-committers/2008-12/msg00061.php obsahuje poslední patch, který jsem poslal pro 8.4

postgres=# CREATE FUNCTION foo(a int = 1, b int = 2, c int = 3) returns int as $$select $1+$2+$3$$ language sql immutable strict;
CREATE FUNCTION
postgres=# select foo();
 foo 
-----
   6
(1 row)

postgres=# select foo(0);
 foo 
-----
   5
(1 row)

postgres=# select foo(0,0);
 foo 
-----
   3
(1 row)

postgres=# select foo(0,0,0);
 foo 
-----
   0
(1 row)

Po novém roce opět v Praze

28.11.2008 Po letošním úspěchu konference Prague PostgreSQL Developers' Day jsme se rozhodli uspořádat další ročník, Prague PostgreSQL Developers' Day 2009 proběhne v únoru opět v Praze. Druhý ročník konference Prague PostgreSQL Developers' Day se uskuteční 12. února 2009, podobně jako letos byla za místo konání vybrána budova Fakulty elektrotechnické ČVUT na Karlovo náměstí.

Ukázka použití rekurzivních dotazů

20.11.2008 Už jste viděli Mandelbrota v SQL?

So based on Graeme Job's T-SQL hack over at thedailywtf.com I adapted the
T-SQL code to Postgres and got this. Thought others might find it amusing.

WITH RECURSIVE Z(IX, IY, CX, CY, X, Y, I) AS (
                SELECT IX, IY, X::float, Y::float, X::float, Y::float, 0
                FROM (select -2.2 + 0.031 * i, i from generate_series(0,101) as i) as xgen(x,ix),
                     (select -1.5 + 0.031 * i, i from generate_series(0,101) as i) as ygen(y,iy)
                UNION ALL
                SELECT IX, IY, CX, CY, X * X - Y * Y + CX AS X, Y * X * 2 + CY, I + 1
                FROM Z
                WHERE X * X + Y * Y < 16::float
                AND I < 100
          )
    SELECT array_to_string(array_agg(SUBSTRING(' .,,,-----++++%%%%@@@@#### ', LEAST(GREATEST(I,1),27), 1)),'')
    FROM (
          SELECT IX, IY, MAX(I) AS I
          FROM Z
          GROUP BY IY, IX
          ORDER BY IY, IX
         ) AS ZT
    GROUP BY IY
    ORDER BY IY;

Poslední commitfest verze 8.4

15.11.2008 Vývoj pokračuje, v 8.4 se objeví funkce LIMIT a OFFSET dle ANSI SQL 2008, a hlavně integrované funkce array_agg a unnest:

postgres=# select * 
              from generate_series(1,100) 
             offset 10 rows 
             fetch next 5 rows only;


postgres=# select unnest(array[1,2,3]);
 unnest 
--------
      1
      2
      3
(3 rows)

postgres=# select * from unnest(array[1,2,3]);
 unnest 
--------
      1
      2
      3
(3 rows)

Účetnictví pro Linux nad PostgreSQL

24.10.2008 Účetní systém WinStrom 10 je implementován v Javě nad PostgreSQL - tudíž je portabilní (a je k dispozici i pro Linux a MacOS). Více na blogu http://blog.softeu.cz/winstrom-10-pod-poklickou/.

Pozor na 8.3.4

24.10.2008 - Pozor na verzi 8.3.4 - opravou byla zanesena nová chyba, která má za následek poškození GiST indexů - (ty jsou využívané zejména fulltextem nebo PostGISem). Pokud používáte tyto technologie, zůstaňte ještě na 8.3.3 a počkejte na opravu v 8.3.5. Chyba se projeví pouze po zrušení záznamů. Pokud pouze přidáváte záznamy, tak se u Vás tato chyba neprojeví. Pokud již používáte 8.3.4 a také používáte GiST index, pravidelně reindexujte.

PostgreSQL Beer Party

10.10.2008 Na 23. října je svolána tradiční PostgreSQL Beer Party - opět s úvodními prezentacemi Zdeňka Kotaly a Pavla Stěhuleho. Prosíme účastníky o přihlášení se na adrese http://www.pgsql.cz/index.php/Pgday2008 . Rái bychom zamluvili adekvátní stůl v hospodě (by to nedopadlo, jako posledně).

V 8.4 je již implementována podpora rekurzivních dotazů

10.10.2008 Vývojová verze obsahuje podporu Common Table Expressions (zkráceně CTE). Více na http://en.wikipedia.org/wiki/Common_table_expressions. Podpora CTE je již v core kódu, takže je již téměř jisté, že se objeví v konečné verzi.

Malý příklad:

postgres=# SELECT * FROM users ;
  name  |  boss  
--------+--------
 Libor  | 
 Vráťa  | Libor
 Petra  | Vráťa
 Martin | Vráťa
 Marek  | Martin
 Pavel  | Martin
 Marcel | Petra
(7 rows)
-- jednodušší varianta
postgres=# WITH RECURSIVE tb AS 
              (SELECT * FROM users WHERE boss IS NULL -- inicializační část
               UNION 
               SELECT u.* FROM users u, tb WHERE tb.name = u.boss) -- rekurzivní (opakující se) dotaz
               SELECT * FROM tb; -- závěrečný filtr
  name  |  boss  
--------+--------
 Libor  | 
 Vráťa  | Libor
 Petra  | Vráťa
 Martin | Vráťa
 Marek  | Martin
 Pavel  | Martin
 Marcel | Petra
(7 rows)

-- komplexní dotaz, včetně hloubky rekurze, cesty a grafického znázornění org. struktury
postgres=# WITH RECURSIVE tb AS 
              (SELECT 0 AS deep, name AS path, * 
                  FROM users 
                 WHERE boss IS NULL 
               UNION 
               SELECT deep + 1 AS deep, path || e'\\' || u.name AS path, u.* 
                  FROM users u, tb 
                 WHERE tb.name = u.boss) 
              SELET *, repeat('  ', deep) || name AS desc 
                 FROM tb 
                ORDER BY path;
 deep |           path           |  name  |  boss  |     desc     
------+--------------------------+--------+--------+--------------
    0 | Libor                    | Libor  |        | Libor
    1 | Libor\Vráťa              | Vráťa  | Libor  |   Vráťa
    2 | Libor\Vráťa\Martin       | Martin | Vráťa  |     Martin
    3 | Libor\Vráťa\Martin\Marek | Marek  | Martin |       Marek
    3 | Libor\Vráťa\Martin\Pavel | Pavel  | Martin |       Pavel
    2 | Libor\Vráťa\Petra        | Petra  | Vráťa  |     Petra
    3 | Libor\Vráťa\Petra\Marcel | Marcel | Petra  |       Marcel
(7 rows)

Firebird Developers' Day 2008

Závěrečnou přednášku na Firebird Developers's Day bude mít Pavel Stěhule viz http://www.dbsvet.cz/view.php?cisloclanku=2008100102 .

PGDay 2008

Po roce se opět setkávají přední vývojáři a uživatelé v italském Pratu na konferenci PGDay. Během PGDay paralelně poběží přednášky, semináře, prezentace, školení a workshopy. Seznam přednášejících http://www.pgday.org/en/speakers je bohatý a nechybí na něm ani zástupce z ČR Zdeněk Kotala. Bezplatná registrace spočívá ve vyplnění formuláře https://register.pgday.org/accounts/login/?next=/ .

První půl rok práce na 8.4

17.7.2008 Po dokončení 8.3 jsem si myslel, že v 8.4 bude více o stabilizaci kódu - nyní se ukazuje, že by 8.4 mohla být absolutní bomba. Už nyní je commitováno docela dost zajímavých patchů: EXCEPTION USING, prefixové vyhledání akcelerované fulltext. indexem, zalamování dlouhých řetězců ve výpisu. Poměrně seriózně se pracuje na podpoře CTE (rekurzivní dotazy), analytických funkcí a podpoře linkovaných serverů - dotaz do externích databází.

Aktuálně si můžete vyzkoušet podporu tzv. variadických funkcí (funkce s variabilním počtem parametrů). Tyto funkce lze volat klasicky, nebo s variadickým parametrem typu pole, který supluje reálné parametry:

create or replace function ifnull(variadic anyarray) 
returns anyelement as $$
select $1[i] 
   from generate_subscripts($1,1) g(i) 
  where $1[i] is not null 
  limit 1;
$$ language sql immutable;

postgres=# select ifnull(null, 1,2,3,4);
 ifnull 
--------
      1
(1 row)

postgres=# select ifnull(variadic array[null,1,2]);
 ifnull 
--------
      1
(1 row)

Neúplná implementace funkce decode (Oracle):

create or replace function decode(anyelement, variadic anyarray) 
returns anyelement as $$
select $2[i*2] 
   from generate_subscripts($2,1) g(i) 
  where $1 = $2[(i-1)*2+1]
$$ language sql immutable;

Výpadek pgsql.cz

1. a 2. července došlo k migraci na aktuální verzi mediawiki a nechtěně k vynucené jednodenní nedostupnosti. Z důvodu ochrany proti wiki spamu je aktivován CAPTCHA filtr. Původní uživatelské účty byly zrušeny - je třeba si založit nové.

PostgreSQL má dvanáct let

A to je důvod k oslavě :). 12 června 1996 byly vytvořeny první dvě elektronické konference a proveden první upload kódu. Při této příležitosti se bude 12. června 2008 konat Second PostgreSQL Beer Party. Posezení u pivka budou předcházet dvě krátké prezentace. První, Zdeňka Kotaly, který se vrátil z PGConu2008. Druhá, Pavla Stěhuleho, o nových funkcích verze 8.4. Detaily (místo a čas) budou upřesněny na adrese Second PostgreSQL Beer Party.


p.s. Kdo jste tam fotili, pošlete mi fotky, pls.

Největší SQL databáze na světě je postavená nad PostgreSQL

24.5.2008 Yahoo představilo svou petabajtovou databázi postavenou na vlastní modifikaci databáze PostgreSQL.

Využití EXECUTE USING pro rozepsání proměnné typu RECORD v PL/pgSQL (PostgreSQL 8.4)

10.5.2008 Iterace napříč položkami složeného typu je možná, v podstatě pouze v dynamických jazycích plperl nebo plpython, pltcl ... Pro PL/pgSQL bylo něco takového nemožné. S novou funkcionalitou obsaženou v 8.4 můžeme iteraci provést (hodnoty musíme ovšem převést na společný typ):

create or replace function foo() returns trigger as $$
declare
 t text;
begin
 for i in 1 .. tg_argv[0] loop
   execute 'select cast ( $1 . ' || tg_argv[i] || ' as text)'
     into t using new;
   raise notice '% = %', tg_argv[i], t;
 end loop;
 return new;
end $$ language plpgsql;

Autor: Tom Lane

Další možnost je dynamické blokování části predikátů SQL příkazů. Dejme tomu, že máme dialogové okno, které generuje omezující podmínku s možností tuto podmínku nezadat. Klasické řešení je v tomto případě predikát nezapsat. Což ale vede k variabilnímu SQL příkazům, a to je cesta, kterou nemohu doporučit. Pokud se použije predikát v následujícím tvaru, optimalizér sám vyřadí predikát:

create or replace function search_name(_name varchar)
returns setof persons as $$
begin   
  return query execute 'SELECT * FROM persons WHERE $1 is null OR name = $1' using _name;
  return;
end;
$$ language plpgsql;

Kód z příkladu je po všech stránkách ekvivalentní kódu:

  sql := SELECT * FROM persons ';
  if _name is not null then
    if strpos(sql,'WHERE') = 0 then
      sql := sql || ' WHERE ';
    end if;
    sql := sql || 'name = \'' || _name || '\'';
  end if;

PostgreSQL 7.4 končí

2.5.2008 začínají se objevovat varování na fakt, že během 12 měsíců skončí podpora verze 7.4. Ukončení podpory znamená ukončení údržby, tj. žádné další bezpečnostní patche, žádné další opravy chyb. Všem uživatelům této verze se doporučuje upgrade na PostgreSQL 8.2.x nebo 8.3.x.

Student Agency používá PostgreSQL

8.4.2008 více ve článku http://www.dbsvet.cz/view.php?cisloclanku=2008040801.

TRUNCATE triggery v 8.4

28.3.2008 Simmon Riggs začlenil patch umožňující podchytit statement triggerem operaci TRUNCATE. To by mělo zjednodušit a zrychlit správu Slony replikovaných databází - zatím byl příkaz TRUNCATE označen jako nebezpečný, jelikož provedení tohoto příkazu nespustilo žádný trigger a tudíž se změny v tabulkách (vymazání obsahu) nereplikovalo.

Inline SRF funkcí v 8.4 (parametrizovatelné pohledy)

24.3.2008 SRF funkce byly vždy pro planner černá skříňka, což pochopitelně mohlo vést ke generování neoptimálního prováděcího plánu (automaticky se předpokládalo, že SRF funkce vrátí 1000 řádek). Pokud funkce obsahuje pouze jeden SELECT a pokud je IMMUTABLE, pak se provede inlining, tj. dotaz se z funkce převede do dotazu:

postgres=# create table tb(a integer);
CREATE TABLE
postgres=# create or replace function gg(int) 
           returns setof tb as $$ 
             select * from tb where a = $1
           $$ language sql immutable;
CREATE FUNCTION
-- 8.2
postgres=# explain select * from gg(10) g(i) where i = 20;
                        QUERY PLAN                        
----------------------------------------------------------
 Function Scan on gg g  (cost=0.00..15.00 rows=5 width=4)
   Filter: (i = 20)
(2 rows)
-- 8.4
postgres=# explain select * from gg(10) g(i) where i = 20;
                       QUERY PLAN                        
---------------------------------------------------------
 Result  (cost=0.00..40.00 rows=1 width=4)
   One-Time Filter: false
   ->  Seq Scan on tb  (cost=0.00..40.00 rows=1 width=4)
         Filter: (a = 10)
(4 rows)

Díky této funkci se již nemusíme bát parametrizovatelných pohledů.

Zjednodušení přechodu na 8.3

6.3.2008 Na blogu Petera Eisentrauta http://people.planetpostgresql.org/peter/index.php?/archives/18-Readding-implicit-casts-in-PostgreSQL-8.3.html je ke stazeni skript, ktery doplni do 8.3 implicitni pretypovani ze starsich verzich (pozn. v 8.3 se zrusila nektera "problematicke" implicitni pretypovani, coz muze pusobit problemy). Instalaci skriptu by mely zmizet asi nejhorsi problemy s migraci.

8.3 je venku, školení PostgreSQL na rootu

4.2.2008 Po více než roce byla uvolněna nová verze PostgreSQL - blíže v presskitu a popisu vlastností. 25.3.2005 pořádá root školení PostgreSQL.


Aktualizace pgfsck a první ostrý release 8.3

4.1.2008 byla uvolněna nová verze pgfsck, což je utilitka, která dokáže přečíst data z datových souborů PostgreSQL. Kromě toho umí identifikovat poškozené záznamy, jejichž zobrazení má za následek pád serveru a zvládne dump z poškozených datových souborů (dokáže obnovit i smazané záznamy, v případě, že nedošlo k provedení příkazu VACUUM). Jinak tato utilitka má řadu omezení, ale když Vás nezachrání ona, tak pak už nic.

Datum oficiálního uvolnění ostré verze 8.3 bylo stanoveno na 4. února 2008 - tedy v pondělí.

Výkonostní porovnání 8.2 a 8.3

Stefan Kaltenbrunner zveřejnil výsledky benchmarků PostgreSQL 8.3 a 8.2. Podle nich se dá usuzovat, že 8.3 je s defaultní konfigurací téměř tak rychlá, jako 8.2 s vyladěnou konfigurací, a po úpravách v conf je více než 2x rychlejší než 8.2. Z jeho postgresql.conf (testovací server měl 12G RAM!).

  • checkpoint_segments=192
  • maintenance_work_mem=128MB
  • shared_buffers=1536MB
  • wal_buffers=1024kB
  • effective_cache_size=3084MB
  • filesystem(ext3) mounted with noatime

8.3 bude až po novém roce

Jak to tak vypadá, na novou verzi si ještě budeme pár týdnů počkat. Během testování Bety3 se objevil relativně závažný problém s výkonností, kdy byla v určitém testu 8.3 o 20% pomalejší než 8.2. Problém se odstranil, ale díky tomu, že nešlo o triviální opravu, bude ještě Beta4. Tím by se vydání posunulo do časů vánočních (ještě 3RC), tudíž se přidá ještě jeden týden. Nijak zvlášť z toho nadšený nejsem, od feature freeze uběhlo 8 měsíců. Na druhou stranu 8.3 se vypořádává s řadou dost zásadních problémů, takže nabourání cyklu lze omluvit. Koneckonců naboural se jen cyklus vývojářů. Z pohledu uživatele Postgres vychází opět zhruba po roce.

Nová konference pro PostgreSQL

30.11.2007 Jsem založil na Googlu skupinu PostgreSQL-cz http://groups.google.com/group/postgresql-cz?hl=cs. Všichni jsou vítáni.

Beta 3 PostgreSQL 8.3 je k dispozici

Poslední betaverze nové je ke stažení na obvyklých místech. V této betě byla rozšířena dokumentace a přidán modul zajišťující kompatibilitu s TSearch2.

Komunitní testování PostgreSQL 8.3 bylo zahájeno

8.10.2007 byla uvolněna k testování beta1 PostgreSQL 8.3. Pokud chcete pomoci vývojovému týmu, prosíme, vyzkoušejte si také tuto novou verzi. Jsme vděční za jakékoli hlášení o chybách či problémech. Pouze s Vaší pomocí může být tato verze stejně tak bezpečná, spolehlivá a bez chyb jako předchozí verze.

Verze 8.3 přináší víc novinek a rozšíření stávájících možností než jakákoli předchozí verze. Proto je nutné věnovat v této verzi větší pozornost testování než kdykoliv dříve. Počítáme a doufáme, že si tuto verzi stáhnete a vyzkoušíte v testovacím prostředí Vaší aplikace.

Tato verze přináší:

  • zřetelně konzistentnější výkon díky HOT, rozložení zátěže Checkpointů, JIT bgwriter, asynchronního potvrzování a dalších technik,
  • integraci fulltextu do databáze se zjednodušenou konfigurací a snadným přidáváním vlastních slovníků,
  • podporu SQL/XML (možnost generovat XML dokumenty přímo v databázi),
  • možnost ukládat logy databáze v CSV formátu,
  • automatické přeplánování nakešovanch prováděcích plánů,
  • podporu výčtových typů, univerzálních jedinečných identifikátorů, a pole kompozitních typů,
  • GSSAPI a SSPI autentifikaci (integrovaná autentifikace na MS Windows),

a celou řadu dalších novinek. Kompletní seznam naleznete v poznámkách k verzi (release notes). Této verzi je také věnován článek "PostgreSQL 8.3: nejen razantní navýšení výkonu" na http://www.root.cz.

Jak brzo se tato testovací verze změní ve finální, záleží na testování naší komunitou uživatelů. Co možná nejdříve, prosím, se zapojte do testování:

  • testujte instalaci a konfiguraci nové verze,
  • vyzkoušejte nové vlastnosti, separátně nebo v kombinaci,
  • testujte migraci Vašich starších aplikací na tuto verzi,
  • testujte iintegraci ovladačů a dalších db nástrojů,
  • spusťte výkonnostní testy nad novou databází,
  • pokud pracujete ve Visual C++, zkuste přeložit PostgreSQL v tomto prostředí,

Podívejte se na stránku 8.3 Beta, kde naleznete další informace ohledně souborů ke stažení, testování, dokumentace, nahlášených chybách a nevyřešených problémech. Betu PostgreSQL 8.3 si nyní můžete stáhnout jako instalační soubor pro Win32 nebo ve formě zdrojových kódů.

Josh Berkus v Praze

Josh Berkus, přední popularizátor PostgreSQL, bude přednášet na téma "PostgreSQL Use Cases and Performance" 24.9. v 17:00 na Fa. elektrotechnické ČVUT (Karlovo nám, Praha). Přednášce bude od 15:00 předcházet diskuze o současných a budoucích projektech PostgreSQL. Všichni příznivci PostgreSQL jsou srdečně zváni. Letáček o akci je ke stažení z adresy.

Vývojová verze podporuje updateable kurzory

Pomalu se blíží konec vývojového cyklu, a do core se dostávají dlouho odkládané patche. Kolik jich ještě zbývá můžete vidět na wiki http://developer.postgresql.org/index.php/Todo:PatchStatus. Updateable kurzory využijí hlavně návrháři driverů pro různé jazyky. Stávající recordsety v ADO nebo ADO.NET mohly být pouze read-only. Navíc infrastrukturu, která byla vytvořena pro jejich implementaci, je možné použít pro budoucí implementaci updatable pohledů. Aktuální implementace podporuje ANSI SQL92, kdy kurzor je updateable pouze tehdy pokud se jedná o SELECT do jedné tabulky. ANSI SQL200x dovoluje updateable kurzory i v určitých případech na sloučených tabulkách, což zatím ani výhledově nebude podporováno. Každý jednoduchý kurzor (žádná agregace, žádné spojení) je přirozeně modifikovatelný, a tudíž se nevyžaduje explicitní nastavení příznaku FOR UPDATE (něco jiného je žádost o zamykání vrácených řádků příkazu SELECT klauzulí FOR UPDATE).

CREATE OR REPLACE FUNCTION test_c() RETURNS void AS $$
DECLARE
  c CURSOR FOR SELECT * FROM test_c_table FOR UPDATE;
  _a integer;
BEGIN
  OPEN c;
  LOOP
    FETCH NEXT FROM c INTO _a;
    EXIT WHEN NOT FOUND;
    If _a % 2 <> 0 THEN
      UPDATE test_c_table SET a = a + 100 WHERE CURRENT  OF c;
    END IF;
    RAISE NOTICE '%',_a;
  END LOOP;
  CLOSE c;
END;
$$ LANGUAGE plpgsql;

První PostgreSQL Beer Party

se koná 11. května 2007 v Praze. Jedná se o neformální setkání uživatelů PostgreSQL z Prahy a dalekého okolí. Detaily na First PostgreSQL Beer Party.

Nové dubnové školení v rámci Akademie Root.cz

Ve spolupráci s redakcí roota jsme pro Vás připravili školení (poněkud netradičně o MySQL) s názvem a tematikou Uložené procedury v MySQL. Toto školení povede Pavel Stěhule.

Konec problémů s neplatnými prováděcími plány

Ve vývojářské verzi 8.3 si můžete vyzkoušet vyřešení "věčného" problému neplatných prováděcích plánů v případě zrušení a opětovného vytvoření databázových objektů (primárně dočasných tabulek) v PL/pgSQL.

Nebezpečí použití příznaku SECURITY DEFINER

Ukazuje se, že nerozvážné použití příznaku SECURITY DEFINER může vést k provedení libovolného kódu s právy vlastníka procedury. Postup útoku je následující. Útočník si zjistí název a parametry libovolné procedury označené příznakem SECURITY DEFINER. Poté si napíše vlastní škodící funkci se stejným názvem a stejnými parametry a tu umístí do svého schématu nebo do schématu public. Poté modifikuje systémovou proměnnou search_path, kde upřednostní své schéma, což ostatně je ve výchozím nastavení ($user, public). Poté zavolá funkci s SEC. DEFINER příznakem, která spustí funkci útočníka s právy vlastníka procedury. Tato chyba je zneužitelná lokálně, útočník musí mít uživatelský účet a právo EXECUTE k některé z těchto rizikových funkcí.

Jednoduchou obranou je na začátku každé rizikové funkce explicitní nastavení systémové proměnné search_path. Toto řešení není účinné pro SQL procedury.

Interview s Joshem Berkusem

si můžete přečíst na http://www.midstorm.org/~telles/modules/news/article.php?storyid=122

V 8.3 si můžete vyzkoušet SQL/XML funkce

Vývojová verze PostgreSQL nyní obsahuje podporu funkcí generujících XML dle standardu SQL/XML.

root=# insert into foo VALUES (10,20),(30,40);
INSERT 0 2

root=# SELECT xmlserialize(document xmlelement(name xx,xmlagg(xmlforest(a,b))) as text) from foo;
                  xmlelement                   
-----------------------------------------------
 <xx><a>10</a><b>20</b><a>30</a><b>40</b></xx>
(1 row)

Další školení v rámci Akademie Root.cz

Tentokrát na téma "Vývoj uložených procedur v prostředí PL/pgSQL". Více na http://www.root.cz/texty/ulozene-procedury-v-postgresql/

K dispozici je PostgreSQL 8.2

Jen o pár týdnu Firebird předběhl PostgreSQL. Nová verze je k dispozici ke stažení na obvyklých místech.

Uvolněna Beta1 PostgreSQL 8.2

Betu si můžete stáhnout z ftp://ftp.cz.postgresql.org/pgsql/source/v8.2beta1. Kromě znatelně vyššího výkonu (v pgbench 75%) tato verze obsahuje i chuťovky jako je table value constructor (multivalue insert), klauzuli returning (Oracle), SQL2003 agregační funkce, nativní podporu LDAPu a řadu dalších (TSearch podporuje UTF8 atd).

Školení PostgreSQL

Podrobnosti naleznete na http://www.root.cz/texty/skoleni-postgresql/

Výroční konference

O víkendu 8-9. července proběhla výroční konference věnovaná PostreSQL. Již nyní jsou k dispozici slajdy z několika přednášek:

http://www.alcove.com.au/~swm/hacking_intro_v1.pdf
http://www.alcove.com.au/~swm/hacking_intro_handout.pdf

Vývojová verze podporuje Table Value constructor a multivalue insert

postgres=# values(10,20,30), (40,50,60), (70,80,90);
 column1 | column2 | column3
---------+---------+---------
      10 |      20 |      30
      40 |      50 |      60
      70 |      80 |      90
(3 rows)
postgres=# select * from (values(10,20,30), (40,50,60), (70,80,90)) as a(a,b,c) join (values(1),(2)) as b(d) on true;
 a  | b  | c  | d
----+----+----+---
 10 | 20 | 30 | 1
 40 | 50 | 60 | 1
 70 | 80 | 90 | 1
 10 | 20 | 30 | 2
 40 | 50 | 60 | 2
 70 | 80 | 90 | 2
(6 rows)

Vyvojova verze podporuje frazi RETURNING v prikazech INSERT, UPDATE, DELETE

UPDATE foo SET f3 = f3*2
  FROM int8_tbl i
  WHERE foo.f1 = i.q1
  RETURNING *;
 f1  |  f2   |  f3  |  f4  | q1  | q2  
------+-------+------+------+-----+-----
 123 | child | 1998 | 1098 | 123 | 456
(1 row)
 
DELETE FROM foo
  USING int8_tbl i
  WHERE foo.f1 = i.q2
  RETURNING *;
  f1  |  f2   |  f3  |  f4  | q1  | q2  
------+-------+------+------+-----+-----
  123 | child | 1998 | 1098 | 123 | 456
(1 row)

Vývojová verze PostgreSQL podporuje multiparametrické agregační funkce

create or replace function ff(ab) returns text as $$ 
begin 
  return array_to_string($1.data, $1.sep); 
end; $$ language plpgsql;

create or replace function fs(ab, varchar, varchar) returns ab as $$ 
declare x ab; 
begin 
  if $1.sep is null then 
    x.sep := $3; x.data := '{}'; 
  else 
    x.sep := $1.sep; 
    x.data := $1.data; 
  end if; 
  x.data := array_append(x.data, $2); 
  return x; 
end; 
$$ language plpgsql;

create aggregate csum(varchar,varchar) (
  sfunc = fs, 
  stype = ab, 
  finalfunc = ff
);

Tato agregační funkce je zákonitě pomalá (opakovaně dochází k vytváření pole x.data) nicméně může se hodit z důvodu kompatibility třeba s MySQL.