PostgreSQL 8.5 alpha

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

Bodově z jednotlivých vývojových verzí PostgreSQL řady 8.5:

Commitfest 8.5/1

  • odstraneni základních prekazek pro psani UDF v C++
  • parametrizace vypisu provadeciho planu - umoznuje regresni testy planneru
  • COPY WITH CSV FORCE QUOTE *
  • fix "could not reattach to shared memory" on Windows
  • ruční nastavení statistik sloupce ALTER TABLE ... ALTER COLUMN ... SET DISTINCT
  • zobrazeni hodnot klicu, ktere zpusobuji chybu "duplicitni klice"
  • vice vlaknovy pgbench
  • Deferrable unique constraints
  • strojově rozpoznatelný formát pro výpis prováděcího plánu
postgres=# explain (format xml) select 10;
                        QUERY PLAN                        
----------------------------------------------------------
 <explain xmlns="http://www.postgresql.org/2009/explain">
   <Query>
     <Plan>
       <Node-Type>Result</Node-Type>
       <Startup-Cost>0.00</Startup-Cost>
       <Total-Cost>0.01</Total-Cost>
       <Plan-Rows>1</Plan-Rows>
       <Plan-Width>0</Plan-Width>
     </Plan>
   </Query>
 </explain>
(1 row)

postgres=# explain (format json) select 10;
          QUERY PLAN          
------------------------------
 [
   {
     "Plan": {
       "Node Type": "Result",
       "Startup Cost": 0.00,
       "Total Cost": 0.01,
       "Plan Rows": 1,
       "Plan Width": 0
     }
   }
 ]
(1 row)
  • podpora formátu EEEE ve funkci to_char,

Commitfest 8.5/2

  • podpora UNICODE v PL/Pythonu,
  • zobrazení chybového kontextu v PL/Perl-u,
  • odstranění OUTER JOINu v případech, kdy vnitřní část spojení (ve výsledku nepoužitého) je dotaz do tabulky podmíněný podmínkou aktivující unikátní index (t. spojení nemá žádný efekt) - cílem je optimalizace primitivně generovaných SQL dotazů:
postgres=# explain select x.a from x left join y on x.a = y.a;
                       QUERY PLAN                        
---------------------------------------------------------
 Seq Scan on x  (cost=0.00..1443.00 rows=100000 width=4)
(1 row)
  • povolen zápis do proměnných odpovídajícím IN parametrům v PL/pgSQL,
  • možnost parametrizace příkazu COPY seznamem příznaků oddělených čárkou,
  • anonymní PL bloky - možnost použít PL kód bez nutnosti registrace funkce,
 DO $$
 DECLARE r record;
 BEGIN 
     FOR r IN SELECT rtrim(roomno) AS roomno, comment FROM Room ORDER BY roomno
     LOOP
         RAISE NOTICE '%, %', r.roomno, r.comment;
     END LOOP;
 END$$ LANGUAGE plpgsql;
 NOTICE:  001, Entrance
 NOTICE:  002, Office
 NOTICE:  003, Office
 NOTICE:  004, Technical
 NOTICE:  101, Office
 NOTICE:  102, Conference
 NOTICE:  103, Restroom
 NOTICE:  104, Technical
 NOTICE:  105, Office
 NOTICE:  106, Office
  • Vylepšení contrib modulu hstore - modul, který slouží k ukládání, indexaci a vyhledání v seznamech dvojic - klíč, hodnota. Odstraněn 64KB limit, konverze hodnot typu hstore z/do pole, recordu, řádku. Funkce pro iteraci nad seznamem klíčů,
postgres=# SELECT * FROM foo;
 a  | b  |   c    
----+----+--------
 10 | 20 | Pavel
 30 | 40 | Zdenek
(2 rows)

postgres=# select (each(hstore(foo))).* from foo;
 key | value  
-----+--------
 a   | 10
 b   | 20
 c   | Pavel
 a   | 30
 b   | 40
 c   | Zdenek
(6 rows)

CREATE OR REPLACE FUNCTION trgfce() 
RETURNS trigger AS $$
DECLARE r record; 
BEGIN 
  FOR r IN SELECT (each(hstore(NEW))).* 
  LOOP 
    RAISE NOTICE 'key:%, value: %', r.key, r.value; 
  END LOOP; 
  RETURN new; 
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER trg BEFORE INSERT ON foo FOR EACH ROW EXECUTE PROCEDURE trgfce();

postgres=# INSERT INTO foo VALUES(80,90,'Zbynek');
NOTICE:  key:a, value: 80
NOTICE:  key:b, value: 90
NOTICE:  key:c, value: Zbynek
INSERT 0 1
  • ALTER DEFAULT PRIVILEGES - Možnost nastavit výchozí práva pro nově vytvářené objekty databáze, autor - Petr Jelínek,
  • Podpora escape zápisu UNICODE znaků \Uxxxx nebo \Uxxxxxxxx (místo x... šestnáctibit nebo třicetdvabit hex číslo),
  • Podpora kombinované a jmenné notace volání funkcí:
create function dfunc(a int, b int, c int = 0, d int = 0)
  returns table (a int, b int, c int, d int) as $$
  select $1, $2, $3, $4;
$$ language sql;
select (dfunc(10,20,30)).*;
 a  | b  | c  | d 
----+----+----+---
 10 | 20 | 30 | 0
(1 row)

select (dfunc(10 as a, 20 as b, 30 as c)).*;
 a  | b  | c  | d 
----+----+----+---
 10 | 20 | 30 | 0
(1 row)
 
select * from dfunc(10 as a, 20 as b);
 a  | b  | c | d 
----+----+---+---
 10 | 20 | 0 | 0
(1 row)

select * from dfunc(10 as b, 20 as a);
 a  | b  | c | d 
----+----+---+---
 20 | 10 | 0 | 0
(1 row)

select * from dfunc(1,2);
 a | b | c | d 
---+---+---+---
 1 | 2 | 0 | 0
(1 row)

select * from dfunc(1,2,3 as c);
 a | b | c | d 
---+---+---+---
 1 | 2 | 3 | 0
(1 row)
  • možnost nastavit systémové proměnné databáze per databázi a uživatele:
ALTER ROLE worker_bee SET maintenance_work_mem = 100000;
ALTER ROLE fred IN DATABASE devel SET client_min_messages = DEBUG;
  • hromadné nastavení práv (autor: Petr jelínek):
GRANT/REVOKE ON ALL TABLES/SEQUENCES/FUNCTIONS IN SCHEMA
  • podpora UTF dekorací (rámečky) v psql
postgres=# select * from (values(10,20,30),(40,50,60)) x(a,b,c);
 a  │ b  │ c  
────┼────┼────
 10 │ 20 │ 30
 40 │ 50 │ 60
(2 rows)

postgres=# \pset linestyle ascii
Line style is ascii.
postgres=# select * from (values(10,20,30),(40,50,60)) x(a,b,c);
 a  | b  | c  
----+----+----
 10 | 20 | 30
 40 | 50 | 60
(2 rows)
  • podpora UPDATE triggrů pro vybrané sloupce,
CREATE TRIGGER before_upd_a_stmt_trig BEFORE UPDATE OF a ON main_table
  FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func('before_upd_a_stmt');

Meziobdobí

  • integrace SQL parseru do plpgsql - tento patch umožní identifikovat kolize plpgsql proměnných a SQL identifikátorů,
postgres=# 
create or replace function foo(a integer) 
returns void as $$
declare r record; 
begin 
  for r in 
    select a from omega where omega.a = foo.a 
  loop 
    raise notice '%', i; 
  end loop; 
end; 
$$ language plpgsql;
CREATE FUNCTION
Time: 2,082 ms
postgres=# select foo(10);
ERROR:  column reference "a" is ambiguous
LINE 1: select a from omega where omega.a = foo.a
               ^
DETAIL:  It could refer to either a PL/pgSQL variable or a table column.
QUERY:  select a from omega where omega.a = foo.a
CONTEXT:  PL/pgSQL function "foo" line 1 at FOR over SELECT rows
  • contrib modul unaccent - modul pro ořezávání UTF diakritiky, funkce a fulltext slovník
postgres=# \i /usr/local/pgsql/share/contrib/unaccent.sql 
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE TEXT SEARCH TEMPLATE
CREATE TEXT SEARCH DICTIONARY
postgres=# \df
                                       List of functions
 Schema │      Name       │ Result data type │          Argument data types          
────────┼─────────────────┼──────────────────┼───────────────────────────────────────
 public │ unaccent        │ text             │ regdictionary, text                   
 public │ unaccent        │ text             │ text                                  
 public │ unaccent_init   │ internal         │ internal                              
 public │ unaccent_lexize │ internal         │ internal, internal, internal, internal
(4 rows)

postgres=# select unaccent('žluťoučký kůň');
   unaccent    
───────────────
 zlutoucky kun
(1 row)

Commitfest 8.5/3

  • hook pro CREATE ROLE, contrib modul passwordcheck pro ověření síly hesla,
  • podpora podmíněných triggerů - klauzle WHEN pro příkaz CREATE TRIGGER,
CREATE TRIGGER modified_any 
   BEFORE UPDATE OF a 
   ON main_table
 FOR EACH ROW 
  WHEN (OLD.* IS DISTINCT FROM NEW.*) 
  EXECUTE PROCEDURE trigger_func('modified_any');
  • Použití UTF znaků pro signalizaci pokračování řádku - explicitní přechod na nový řádek
                                  a                                  │                                  a                                   
─────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────
 PostgreSQL je šířen pod BSD licencí, která je nejliberálnější ze vš…│ PostgreSQL je šířen pod BSD licencí, která je nejliberálnější ze vše…
…ech open source licencí. Tato licence umožňuje neomezené bezplatné …│…ch open source licencí. Tato licence umožňuje neomezené bezplatné po…
…používání, modifikaci a distribuci PostgreSQL a to ať pro komerční …│…užívání, modifikaci a distribuci PostgreSQL a to ať pro komerční neb…
…nebo nekomerční využití. PostgreSQL můžete šířit se zdrojovými kódy…│…o nekomerční využití. PostgreSQL můžete šířit se zdrojovými kódy neb…
… nebo bez nich, zdarma nebo komerčně.                              ↵│…o bez nich, zdarma nebo komerčně.                                   ↵
 PostgreSQL umožňuje běh uložených procedur napsaných v několika pro…│ PostgreSQL umožňuje běh uložených procedur napsaných v několika prog…
…gramovacích jazycích, v Perlu, v Pyhon, v jazyku C nebo v speciální…│…ramovacích jazycích, v Perlu, v Pyhon, v jazyku C nebo v speciálním …
…m PL/pgSQL, jazyku vycházejícím z PL/SQL fy. Oracle. Existují Postg…│…PL/pgSQL, jazyku vycházejícím z PL/SQL fy. Oracle. Existují PostgreS…
…reSQL varianty JDBC, ODBC, dbExpress, Open Office, PHP, .NET, Perl …│…QL varianty JDBC, ODBC, dbExpress, Open Office, PHP, .NET, Perl nati…
…nativních rozhraní. K PostgreSQL existuje překladač Embedded SQL pr…│…vních rozhraní. K PostgreSQL existuje překladač Embedded SQL pro C a…
…o C a C++. Dále existuje experimentální podpora SQL/PSM - standardi…│… C++. Dále existuje experimentální podpora SQL/PSM - standardizované…
…zovaného jazyka pro návrh uložených procedur v ANSI SQL.            │…ho jazyka pro návrh uložených procedur v ANSI SQL.
(1 row)
  • ecpg:podpora dynamických kurzorů
 strcpy(msg, "prepare");
 exec sql prepare st_id1 from :stmt1;

 strcpy(msg, "declare");
 exec sql declare :curname3 cursor for st_id1;

 strcpy(msg, "open");
 exec sql open :curname3;

 strcpy(msg, "fetch from");
 exec sql fetch from :curname3 into :id, :t;
 printf("%d %s\n", id, t);

 strcpy(msg, "fetch");
 exec sql fetch :curname3 into :id, :t;
 printf("%d %s\n", id, t);

 strcpy(msg, "fetch 1 from");
 exec sql fetch 1 from :curname3 into :id, :t;
 printf("%d %s\n", id, t);
  • anonymní procedurální blok v PLPerlu
DO $$
  $a = 'This is a test';
  elog(NOTICE, $a);
$$ LANGUAGE plperl;
  • nový parametr pro CONNECT - application_name (APPNAME) - další dodatečná informace, kterou lze použít při monitorování provozu,
  • opravy REGEXP pro UTF8 (case insensitive),
-- pred opravou
postgres=# SELECT 'žluťoučký' ~* '.Luť.*';
 ?column? 
──────────
 t
(1 row)

postgres=# SELECT 'žluťoučký' ~* 'ŽLuť.*';
 ?column? 
──────────
 f
(1 row)

-- po oprave
postgres=# SELECT 'žluťoučký' ~* 'ŽLuť.*';
 ?column? 
----------
 t
(1 row)
  • knihovny klienta jsou překládány s podporou thread-safety jako default,
  • podpora obecných vylučujících omezujících pravidel - zobecnění pravidla UNIQUE,
CREATE TABLE circles (
    c circle,
    EXCLUDE USING gist (c WITH &&)
);

postgres=# create table omega(a integer, exclude (a with =));
NOTICE:  CREATE TABLE / EXCLUDE will create implicit index "omega_a_exclusion" for table "omega"
CREATE TABLE
Time: 56,056 ms
postgres=# insert into omega values(10);
INSERT 0 1
Time: 1,456 ms
postgres=# insert into omega values(10);
ERROR:  conflicting key value violates exclusion constraint "omega_a_exclusion"
DETAIL:  Key (a)=(10) conflicts with existing key (a)=(10).
  • výpis prováděcího plánu ve formátu YAML,
  • možnost nastavení přístopových práv k BLOB objektům:
SELECT lo_create(1001);
 lo_create 
-----------
      1001
(1 row)

GRANT ALL ON LARGE OBJECT 1001 TO PUBLIC;
GRANT SELECT ON LARGE OBJECT 1003 TO regressuser2;
GRANT SELECT,UPDATE ON LARGE OBJECT 1004 TO regressuser2;
GRANT ALL ON LARGE OBJECT 1005 TO regressuser2;
GRANT SELECT ON LARGE OBJECT 1005 TO regressuser2 WITH GRANT OPTION;
  • podpora polí pro PLPythonu
CREATE FUNCTION test_type_conversion_array_int4(x int4[]) RETURNS int4[] AS $$
plpy.info(x, type(x))
return x
$$ LANGUAGE plpythonu;
SELECT * FROM test_type_conversion_array_int4(ARRAY[0, 100]);
INFO:  ([0, 100], <type 'list'>)
CONTEXT:  PL/Python function "test_type_conversion_array_int4"
 test_type_conversion_array_int4 
---------------------------------
 {0,100}
(1 row)

SELECT * FROM test_type_conversion_array_int4(ARRAY[0,-100,55]);
INFO:  ([0, -100, 55], <type 'list'>)
CONTEXT:  PL/Python function "test_type_conversion_array_int4"
 test_type_conversion_array_int4 
---------------------------------
 {0,-100,55}
(1 row)
  • EXPLAIN ANALYZE (BUFFERS) - výpis prováděcího plánu zobrazuje využití cache,
postgres=# explain (analyze, buffers) select * from foo where a = 10;
                                         QUERY PLAN                                          
---------------------------------------------------------------------------------------------
 Seq Scan on foo  (cost=0.00..2.25 rows=1 width=4) (actual time=0.060..0.060 rows=0 loops=1)
   Filter: (a = 10)
   Buffers: shared hit=1
 Total runtime: 0.105 ms
(4 rows)
  • explicitní určení pořadí záznamů v agregační funkci:
postgres=# select array_agg(distinct a order by a desc), array_agg(a order by a) from foo;
-[ RECORD 1 ]------------------------------------------------
array_agg | {9652,8078,7671,7642,5048,4650,3886,2450,732,647}
array_agg | {647,732,2450,3886,4650,5048,7642,7671,8078,9652}
  • Bruce commitl zásadní patch - PL/pgSQL je dostupný bez dodatečné instalace - zapomeňte na CREATE LANGUAGE plpgsql,
  • Hot Standby - počáteční patch povolující read only spojení do db během obnovy db (recovery) - jedná se o první formu vestevěné replikace do pg (pravděpodobně asynchronní master-slave), autorem je Simon Riggs,

Meziobdobí

  • Možnost nezadávát název indexu a nechat systém vygenerovat unikátní normalizovaný název:
-- nazev indexu neuveden - system pouzije concur_heap_expr_idx
CREATE INDEX CONCURRENTLY on concur_heap((f2||f1));
  • Zahrnutí statistik potomků do statistik rodiče,
  • Parametry seq_page_cost a random_page_cost pro jednotlivé tablespaces,
  • Modifikované VACUUM FULL - lépe řeší díry po velkých blokových operacích,
  • Podpora 64bit na MS Windows,

PostgreSQL 9.0/4

  • Podpora SQLDA v ecpg
  • Původní full vacuum bylo úplně odstraněno
  • Podpora DESCRIBE v ecpg
  • Refaktoring plper
  • Informace o vuyžití bufferů v tabulce pg_stat_statements
  • Streaming replication
  • out of scope cursors for ecpg
  • escapované proměnné v psql