PostgreSQL 8.5 alpha
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