<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="cs">
	<id>http://postgres.cz/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PavelStehule</id>
	<title>PostgreSQL - Příspěvky [cs]</title>
	<link rel="self" type="application/atom+xml" href="http://postgres.cz/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=PavelStehule"/>
	<link rel="alternate" type="text/html" href="http://postgres.cz/wiki/Speci%C3%A1ln%C3%AD:P%C5%99%C3%ADsp%C4%9Bvky/PavelStehule"/>
	<updated>2026-05-20T15:00:08Z</updated>
	<subtitle>Příspěvky</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>http://postgres.cz/index.php?title=PostgreSQL&amp;diff=1592</id>
		<title>PostgreSQL</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PostgreSQL&amp;diff=1592"/>
		<updated>2026-05-20T04:00:21Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Software |                                                                                                                                                   &lt;br /&gt;
  name = PostgreSQL |                                                                                                                                                  &lt;br /&gt;
  logo = |                                                                                                                                                             &lt;br /&gt;
  screenshot = [[Image:Logo180.jpg]] |                                                                                                                                 &lt;br /&gt;
  caption = The &#039;&#039;&#039;PostgreSQL&#039;&#039;&#039; Logo |                                                                                                                                &lt;br /&gt;
  developer = PostgreSQL&amp;lt;br&amp;gt;Global Development Group |                                                                                                           &lt;br /&gt;
  latest_release_version = [https://www.postgresql.org/docs/release/18.4/ 18.4] |                                                                                                                      &lt;br /&gt;
  latest_release_date = 14. května 2026 |                                                                                                                            &lt;br /&gt;
  operating_system = Unix, Microsoft Windows |                                                                                                                         &lt;br /&gt;
  license = PostgreSQL licence |                                                                                                                                              &lt;br /&gt;
  website = [http://www.postgresql.org/ www.postgresql.org] |                                                                                                          &lt;br /&gt;
}}&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title=PostgreSQL&lt;br /&gt;
|titlemode=append&lt;br /&gt;
|keywords=Postgres, PostgreSQL, Czech, česky&lt;br /&gt;
|description=Informace o databázi PostgreSQL pro začátečníky i pokročilé&lt;br /&gt;
}}&lt;br /&gt;
[[PostgreSQL]] (nebo zkráceně Postgres) je plnohodnotným relačním databázovým systémem s otevřeným zdrojovým kódem. Má za sebou téměř třicet let aktivního vývoje a má vynikající pověst pro svou spolehlivost a bezpečnost. Běží nativně na všech rozšířených operačních systémech (Linux, BSD, MacOS, Windows) včetně některých dnes už méně rozšířených systémů (AIX, Solaris). Stoprocentně splňuje podmínky [[Slovník#ACID|ACID]], plně podporuje cizí klíče, operace JOIN, pohledy, spouště a uložené procedury. Obsahuje většinu SQL92 a SQL99 datových typů, např. INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, INTERVAL a TIMESTAMP. Nechybí ani podpora moderních datových typů jako je JSON nebo XML.&lt;br /&gt;
 &lt;br /&gt;
Vývojáři PostgreSQL se snaží o [http://www.postgresql.org/docs/current/static/features.html respektování a implementaci standardu ANSI SQL] - k dispozici jsou vlastnosti popsané v ANSI/SQL 200x (např. rekurzivní a analytické dotazy), ANSI/SQL 201x a ANSI/SQL 202x. K systému existuje kvalitní volně [http://www.postgresql.org/docs/9.4/interactive/index.html dostupná dokumentace] včetně českých překladů [[Frequently Asked Questions|FAQ]] a [[Instalace a provoz nativní PostgreSQL v Microsoft Windows|FAQ]] pro o.s. fy. Microsoft. Výkonnostně nezaostává za srovnatelnými komerčními systémy a v [[Postgres MSSQL|častokrát je i předčí]]. [[Desatero|&#039;&#039;&#039;Deset rad jak efektivně používat PostgreSQL&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;background-color: #eeeee0; border: solid thin lightgrey; padding:15px;  width:70%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&amp;quot;U našich klientů provozujeme tisíce instalací PostgreSQL na často pochybných strojích. Provozujeme je od malých netboocích až výkonných clusterech. A ještě jsme nezaznamenali jediný případ ztráty dat, který by byl způsobený PostgreSQL&amp;quot; - Petr Ferschmann, CEO, Internetové ekonomické systémy FlexiBee, [https://www.abra.eu/flexi/ FlexiBee Systems s.r.o.]&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&amp;quot;Večer trávený nad PL/PgSQL, které se dá používat a je k němu dobrá dokumentace, což o psaní stored procedur ve FirebirdSQL napsat nemohu ani omylem.﻿&amp;quot; - MaReK Olšavský&#039;&#039;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL lze jednoduše [[Instalace PostgreSQL|nainstalovat]] ze všech veřejných depozitářů linuxových distribucí (případně [https://www.postgresql.org/download/ repozitáře vyhrazeného pro PostgreSQL]). Vždy aktuální instalační soubor pro Microsoft Windows lze PostgreSQL stáhnout z [http://www.enterprisedb.com/products-services-training/pgdownload#windows archivu EnterpriseDB].&lt;br /&gt;
&lt;br /&gt;
PostgreSQL je šířen pod [[1.03 Pod jakou licencí je PostgreSQL|BSD]] licencí, která je nejliberálnější ze všech open source licencí. &amp;lt;b&amp;gt;Tato licence umožňuje neomezené bezplatné používání, modifikaci a distribuci PostgreSQL a to ať pro komerční nebo nekomerční využití.&amp;lt;/b&amp;gt; PostgreSQL můžete šířit se zdrojovými kódy nebo bez nich, zdarma nebo komerčně. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;htmlet2&amp;gt;postgresql&amp;lt;/htmlet2&amp;gt; &lt;br /&gt;
&lt;br /&gt;
PostgreSQL umožňuje běh uložených procedur napsaných v několika programovacích jazycích, v [[PL/Perlu - Untrusted Perl|Perlu]], v Pyhon, v jazyku [[Návrh a realizace UDF v c pro PostgreSQL|C]] nebo v speciálním [[PL/pgSQL]], jazyku vycházejícím z PL/SQL fy. Oracle. Existují PostgreSQL varianty [https://jdbc.postgresql.org/ JDBC], ODBC, dbExpress, [http://dba.openoffice.org/drivers/postgresql/index.html Open Office], PHP, [https://www.npgsql.org/ .NET], [http://search.cpan.org/~turnstep/DBD-Pg/Pg.pm Perl] nativních rozhraní. K PostgreSQL existuje překladač Embedded SQL pro C a C++.&lt;br /&gt;
&lt;br /&gt;
Předchůdcem systému PostgreSQL byl systém [http://en.wikipedia.org/wiki/Ingres_(database) Ingres (Interactive Graphics and Retrieval System)], vyvinutý na kalifornské univerzitě v Berkeley v letech 1977 - 1985. Jeho nástupce byl vyvíjen pod vedením [http://en.wikipedia.org/wiki/Michael_Stonebraker Prof. Michaela Stonebrakera] jako objektově-relační databázový server pod názvem [[Historie projektu PostgreSQL#POSTGRES|Postgres]]. Z toho později firma Illustra vytvořila komerční produkt, který byl později převzat Informixem. Původní Postgres byl doplněn o podporu jazyka [[Úvod do PostgreSQL SQL|SQL]] a byl označen Postgres95. V létě 1996 Marc Fournier, Bruce Momjian a Vadim B. Mikheev pokračovali na vývoji Postgres95 už jako open source a nezávisle na univerzitě. Systém byl postupně opravován a po odstranění nejhorších problémů začala implementace nových vlastností. Na konci roku 1996 byl projekt přejmenován na PostgreSQL a byla uvolněna verze 6.0. &lt;br /&gt;
&lt;br /&gt;
Počínaje osmičkovou řadou PostgreSQL obsahuje vlastnosti, které očekáváme od tzv. enterprise produktů: stabilní výkon, [[Slovník#MVCC|MVCC]], [[Slovník#TOAST|TOAST]], [[Slovník#WAL|WAL]], Save Points, Point In Time Recovery, dvoufázové potvrzování, Partitioning, podporu SMP, informační schémata, částečné a funkcionální indexy, [[Slon nezapomíná (co nás čeká v PostgreSQL 8.3)#Podpora_SQL.2FXML|podporu SQL/XML]], [[Slon nezapomíná (co nás čeká v PostgreSQL 8.3)#Integrace_TSearch2|integrovaný fulltext]], integrovanou autentifikaci v prostředí MS Windows. [http://www.pgsql.cz/files/postgresql84.pdf verze 8.4.] (více  v článku [[PostgreSQL v roce 2009 (PostgreSQL 8.4)]]), přináší funkce funkce na které jsme zvyklí z nejlepších komerčních databázových systémů - namátkou [[Aktuality#V_8.4_je_ji.C5.BE_implementov.C3.A1na_podpora_rekurzivn.C3.ADch_dotaz.C5.AF|Common Table Expressions]], podporu locales pro každou databázi, některé stávající funkce jsou rozšířeny, optimalizovány (podpora SEMIJOINu, ANTIJOINu, statistik pro fulltext). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;background-color: #eeeee0; border: solid thin lightgrey; padding:20px;  width:400px; float: left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&amp;quot;Zkušenosti s PostgreSQL jsou zatím výborné. Odpadly nám problémy s pády SQL serveru a s neaktivitou serveru při odpoledním zálohování. Také se výrazně zrychlila odezva programů, zejména díky rychlejšímu provádění SELECT příkazů.&amp;quot; - zkušenosti vývojářů ekonomického systému po migraci na PostgreSQL.&#039;&#039; &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[PostgreSQL 9.0 - nový začátek|Verze 9.0]] přináší integrovanou replikaci, podmíněné a sloupcové triggery, klauzuli ORDER BY v agregačních funkcích, JOIN removal (odstranění nepotřebnách relací z prováděcích plánů). [[PostgreSQL 9.1 - aneb stále vpřed|verze 9.1]] obsahuje podporu COLLATEs, integraci s SE-Linuxem, synchronní replikaci, upravený režim SERIALIZABLE, podporu cizích tabulek dle standardu SQL/MED, cyklus FOREACH v PL/pgSQL a řadu dalších funkcí.Ve [[PostgreSQL 9.2 (2012)|verzi 9.2]] se setkáme s index only scanem, datovým typem range, datovým typem JSON, podporou SP_GIST indexů. Ve [[PostgreSQL 9.3 (2013)|verzi 9.3]] je k dispozici např. podpora DDL triggerů, klauzule LATERAL, kontrolní součty datových stránek. [[PostgreSQL 9.4 (2014): transakční sql json databáze|Verze 9.4]] přináší podmíněné agregační funkce a agregační funkce na seřazených datech (median), nerelační datový typ jsonb (další generace typu HStore), možnost konfigurace pomocí SQL příkazů (ALTER SYSTEM).  [[PostgreSQL 9.5 (2015) držte si klobouky, zrychlujeme|Verze 9.5]] přináší GROUPING SETS, UPSERT, práva na úrovni řádku (Row Level Security), vyšší výkon pod extrémní zátěží, online komprimaci transakčního logu. [[PostgreSQL 9.6 (2016) odteď paralelně|verze 9.6]] umožňuje využít pro jeden dotaz více CPU. [[PostgreSQL 10 (2017) - drsně rozběhnutý slon|Verze 10]] přináší zlepšení partitioningu, integraci logické replikace, podpoře více sloupcových statistik. Ve [[PostgreSQL 11 (2018)|verzi 11]] můžeme používat příkaz CALL a v procedurách explicitně commitovat. V této verzi díky paralelnímu hashjoinu dosáhneme rychlejších analytických výpočtů. Přínosem je i dynamičtější partitioning. [[PostgreSQL 12 (2019)|Verze 12]] přináší podporu JSONPath, podporu nedeterministických locales (např. case insensitive) a další způsob práce s více sloupcovými statistikami. [[PostgreSQL 13 (2020)|Verze 13]] pak přináší přepsanou hash agregaci, efektivnější ukládání klíčů v indexu (deduplikace), a výrazně rychlejší vykonávání výrazů v PLpgSQL. Ve [[PostgreSQL 14 (2021)|verzi 14]]  jsou  na statistiky nad výrazy, je efektivnější vyhledávání hodnoty v dlouhém seznamu hodnot, je menší bloatingu indexů, a konečně je i úplná podpora výrazů na levé straně přiřazovacího příkazu (v PL/pgSQL). [[PostgreSQL 15 (2022)|Verze 15]] přidává ANSI SQL příkaz MERGE a další možnosti nastavení přístupových práv. [[PostgreSQL 16 (2023)|Verze 16]] přináší řadu optimalizací a pokračuje v implementaci SQL/JSON. [[PostgreSQL 17 (2024)|Verze 17]] přináší podporu inkrementálního backupu a finišuje podporu SQL/JSON. [[PostgreSQL 18 (2025)|Verze 18]] podporuje index skip skan a vyšší redukci zbytečných spojení (joinů) v dotazech. Aktuálně se dokončuje [[PostgreSQL 19 (2026)|verze 19]], která zavádí příkaz REPACK, přínáší podporu SQL/PGQ (jazyk pro operace nad grafy) a extenzi pg_plan_advice (alternativa plan hintů z Oracle). Díky tomu je PostgreSQL solidní a bezpečnou platformou pro vývoj aplikací (informační, řídící a monitorovací systémy, výzkum, aplikace pro státní a komunální správu).&lt;br /&gt;
&lt;br /&gt;
viz [https://www.postgresql.org/about/featurematrix/ Feature Matrix] &lt;br /&gt;
&lt;br /&gt;
Předností systému PostgreSQL je rozšiřitelnost. Systém může být bezproblémově rozšiřován o nové datové typy, funkce operátory, agregační funkce, procedurální jazyky. Díky tomu mohly vzniknout následující rozšíření: [http://postgis.refractions.net/ PostGIS] - podpora pro geografické informační systémy, [https://www.timescale.com/ Timescale] - podpora pro data časových řad nebo [https://www.citusdata.com/ Citus] - umožní používat Postgres jako distribuovanou databázi. Na serverech [https://github.com/topics/postgresql-extension GitHub] nebo [http://pgxn.org/ PGXN] je k dispozici několik desítek doplňků včetně doplňků rozšířující o funkcionalitu  MySQL, SQL Serveru a [[Oracle functionality|Oraclu]]. Uživatelé také [[Postgres_Informix|oceňují vynikající uživatelskou podporu]] (ať začátečníků nebo pokročilých uživatelů).&lt;br /&gt;
&lt;br /&gt;
Za vývojem PostgreSQL stojí skupina nezávislých vývojářů a uživatelů, ke které se kdokoliv může připojit. A to přihlášením do diskusního fóra a následnou participací na projektu: patche, podporou uživatelů, psaním a překladem dokumentace atd. &lt;br /&gt;
&lt;br /&gt;
PostgreSQL je faktickým &#039;&#039;průmyslovým standardem&#039;&#039; - existují komerční databáze postavené nad komunitním PostgreSQL - [http://en.wikipedia.org/wiki/Netezza Netezza],[http://en.wikipedia.org/wiki/Greenplum GreenPlum], [http://en.wikipedia.org/wiki/EnterpriseDB EnterpriseDB], [https://www.timescale.com/ Timescale], [https://blog.yugabyte.com/ YugabyteDB]. Můžeme se setkat s databázemi, které používají protokol kompatibilní s PostgreSQL - H2 nebo databáze, které přebírají interface PostgreSQL - např. [http://en.wikipedia.org/wiki/Vertica Vertica]. Analytická souborová databáze [https://duckdb.org/ DuckDB] - příbírá SQL gramatiku (syntax) z PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
=CSPUG - Czech and Slovak PostgreSQL Users Group=&lt;br /&gt;
Za účelem podpory sdružování uživatelů PostgreSQL vznikla v roce 2010 obecně prospěšná společnost (dle zákona č. 634/2004 Sb. o správních poplatcích) Sdružení českých a slovenských uživatelů PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
Autorem zde uložených dokumentů (a&amp;amp;nbsp;překladatelem FAQ) je [[Pavel Stěhule]].&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=PostgreSQL&amp;diff=1591</id>
		<title>PostgreSQL</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PostgreSQL&amp;diff=1591"/>
		<updated>2026-05-20T03:59:20Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox_Software |                                                                                                                                                   &lt;br /&gt;
  name = PostgreSQL |                                                                                                                                                  &lt;br /&gt;
  logo = |                                                                                                                                                             &lt;br /&gt;
  screenshot = [[Image:Logo180.jpg]] |                                                                                                                                 &lt;br /&gt;
  caption = The &#039;&#039;&#039;PostgreSQL&#039;&#039;&#039; Logo |                                                                                                                                &lt;br /&gt;
  developer = PostgreSQL&amp;lt;br&amp;gt;Global Development Group |                                                                                                           &lt;br /&gt;
  latest_release_version = [https://www.postgresql.org/docs/release/18.4/ 18.4] |                                                                                                                      &lt;br /&gt;
  latest_release_date = 14. května 2026 |                                                                                                                            &lt;br /&gt;
  operating_system = Unix, Microsoft Windows |                                                                                                                         &lt;br /&gt;
  license = PostgreSQL licence |                                                                                                                                              &lt;br /&gt;
  website = [http://www.postgresql.org/ www.postgresql.org] |                                                                                                          &lt;br /&gt;
}}&lt;br /&gt;
{{#seo:&lt;br /&gt;
|title=PostgreSQL&lt;br /&gt;
|titlemode=append&lt;br /&gt;
|keywords=Postgres, PostgreSQL, Czech, česky&lt;br /&gt;
|description=Informace o databázi PostgreSQL pro začátečníky i pokročilé&lt;br /&gt;
}}&lt;br /&gt;
[[PostgreSQL]] (nebo zkráceně Postgres) je plnohodnotným relačním databázovým systémem s otevřeným zdrojovým kódem. Má za sebou téměř třicet let aktivního vývoje a má vynikající pověst pro svou spolehlivost a bezpečnost. Běží nativně na všech rozšířených operačních systémech (Linux, BSD, MacOS, Windows) včetně některých dnes už méně rozšířených systémů (AIX, Solaris). Stoprocentně splňuje podmínky [[Slovník#ACID|ACID]], plně podporuje cizí klíče, operace JOIN, pohledy, spouště a uložené procedury. Obsahuje většinu SQL92 a SQL99 datových typů, např. INTEGER, NUMERIC, BOOLEAN, CHAR, VARCHAR, DATE, INTERVAL a TIMESTAMP. Nechybí ani podpora moderních datových typů jako je JSON nebo XML.&lt;br /&gt;
 &lt;br /&gt;
Vývojáři PostgreSQL se snaží o [http://www.postgresql.org/docs/current/static/features.html respektování a implementaci standardu ANSI SQL] - k dispozici jsou vlastnosti popsané v ANSI/SQL 200x (např. rekurzivní a analytické dotazy), ANSI/SQL 201x a ANSI/SQL 202x. K systému existuje kvalitní volně [http://www.postgresql.org/docs/9.4/interactive/index.html dostupná dokumentace] včetně českých překladů [[Frequently Asked Questions|FAQ]] a [[Instalace a provoz nativní PostgreSQL v Microsoft Windows|FAQ]] pro o.s. fy. Microsoft. Výkonnostně nezaostává za srovnatelnými komerčními systémy a v [[Postgres MSSQL|častokrát je i předčí]]. [[Desatero|&#039;&#039;&#039;Deset rad jak efektivně používat PostgreSQL&#039;&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;background-color: #eeeee0; border: solid thin lightgrey; padding:15px;  width:70%;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&amp;quot;U našich klientů provozujeme tisíce instalací PostgreSQL na často pochybných strojích. Provozujeme je od malých netboocích až výkonných clusterech. A ještě jsme nezaznamenali jediný případ ztráty dat, který by byl způsobený PostgreSQL&amp;quot; - Petr Ferschmann, CEO, Internetové ekonomické systémy FlexiBee, [https://www.abra.eu/flexi/ FlexiBee Systems s.r.o.]&#039;&#039;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&#039;&#039;&amp;quot;Večer trávený nad PL/PgSQL, které se dá používat a je k němu dobrá dokumentace, což o psaní stored procedur ve FirebirdSQL napsat nemohu ani omylem.﻿&amp;quot; - MaReK Olšavský&#039;&#039;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
PostgreSQL lze jednoduše [[Instalace PostgreSQL|nainstalovat]] ze všech veřejných depozitářů linuxových distribucí (případně [https://www.postgresql.org/download/ repozitáře vyhrazeného pro PostgreSQL]). Vždy aktuální instalační soubor pro Microsoft Windows lze PostgreSQL stáhnout z [http://www.enterprisedb.com/products-services-training/pgdownload#windows archivu EnterpriseDB].&lt;br /&gt;
&lt;br /&gt;
PostgreSQL je šířen pod [[1.03 Pod jakou licencí je PostgreSQL|BSD]] licencí, která je nejliberálnější ze všech open source licencí. &amp;lt;b&amp;gt;Tato licence umožňuje neomezené bezplatné používání, modifikaci a distribuci PostgreSQL a to ať pro komerční nebo nekomerční využití.&amp;lt;/b&amp;gt; PostgreSQL můžete šířit se zdrojovými kódy nebo bez nich, zdarma nebo komerčně. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;htmlet2&amp;gt;postgresql&amp;lt;/htmlet2&amp;gt; &lt;br /&gt;
&lt;br /&gt;
PostgreSQL umožňuje běh uložených procedur napsaných v několika programovacích jazycích, v [[PL/Perlu - Untrusted Perl|Perlu]], v Pyhon, v jazyku [[Návrh a realizace UDF v c pro PostgreSQL|C]] nebo v speciálním [[PL/pgSQL]], jazyku vycházejícím z PL/SQL fy. Oracle. Existují PostgreSQL varianty [https://jdbc.postgresql.org/ JDBC], ODBC, dbExpress, [http://dba.openoffice.org/drivers/postgresql/index.html Open Office], PHP, [https://www.npgsql.org/ .NET], [http://search.cpan.org/~turnstep/DBD-Pg/Pg.pm Perl] nativních rozhraní. K PostgreSQL existuje překladač Embedded SQL pro C a C++.&lt;br /&gt;
&lt;br /&gt;
Předchůdcem systému PostgreSQL byl systém [http://en.wikipedia.org/wiki/Ingres_(database) Ingres (Interactive Graphics and Retrieval System)], vyvinutý na kalifornské univerzitě v Berkeley v letech 1977 - 1985. Jeho nástupce byl vyvíjen pod vedením [http://en.wikipedia.org/wiki/Michael_Stonebraker Prof. Michaela Stonebrakera] jako objektově-relační databázový server pod názvem [[Historie projektu PostgreSQL#POSTGRES|Postgres]]. Z toho později firma Illustra vytvořila komerční produkt, který byl později převzat Informixem. Původní Postgres byl doplněn o podporu jazyka [[Úvod do PostgreSQL SQL|SQL]] a byl označen Postgres95. V létě 1996 Marc Fournier, Bruce Momjian a Vadim B. Mikheev pokračovali na vývoji Postgres95 už jako open source a nezávisle na univerzitě. Systém byl postupně opravován a po odstranění nejhorších problémů začala implementace nových vlastností. Na konci roku 1996 byl projekt přejmenován na PostgreSQL a byla uvolněna verze 6.0. &lt;br /&gt;
&lt;br /&gt;
Počínaje osmičkovou řadou PostgreSQL obsahuje vlastnosti, které očekáváme od tzv. enterprise produktů: stabilní výkon, [[Slovník#MVCC|MVCC]], [[Slovník#TOAST|TOAST]], [[Slovník#WAL|WAL]], Save Points, Point In Time Recovery, dvoufázové potvrzování, Partitioning, podporu SMP, informační schémata, částečné a funkcionální indexy, [[Slon nezapomíná (co nás čeká v PostgreSQL 8.3)#Podpora_SQL.2FXML|podporu SQL/XML]], [[Slon nezapomíná (co nás čeká v PostgreSQL 8.3)#Integrace_TSearch2|integrovaný fulltext]], integrovanou autentifikaci v prostředí MS Windows. [http://www.pgsql.cz/files/postgresql84.pdf verze 8.4.] (více  v článku [[PostgreSQL v roce 2009 (PostgreSQL 8.4)]]), přináší funkce funkce na které jsme zvyklí z nejlepších komerčních databázových systémů - namátkou [[Aktuality#V_8.4_je_ji.C5.BE_implementov.C3.A1na_podpora_rekurzivn.C3.ADch_dotaz.C5.AF|Common Table Expressions]], podporu locales pro každou databázi, některé stávající funkce jsou rozšířeny, optimalizovány (podpora SEMIJOINu, ANTIJOINu, statistik pro fulltext). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;background-color: #eeeee0; border: solid thin lightgrey; padding:20px;  width:400px; float: left;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&amp;quot;Zkušenosti s PostgreSQL jsou zatím výborné. Odpadly nám problémy s pády SQL serveru a s neaktivitou serveru při odpoledním zálohování. Také se výrazně zrychlila odezva programů, zejména díky rychlejšímu provádění SELECT příkazů.&amp;quot; - zkušenosti vývojářů ekonomického systému po migraci na PostgreSQL.&#039;&#039; &lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[PostgreSQL 9.0 - nový začátek|Verze 9.0]] přináší integrovanou replikaci, podmíněné a sloupcové triggery, klauzuli ORDER BY v agregačních funkcích, JOIN removal (odstranění nepotřebnách relací z prováděcích plánů). [[PostgreSQL 9.1 - aneb stále vpřed|verze 9.1]] obsahuje podporu COLLATEs, integraci s SE-Linuxem, synchronní replikaci, upravený režim SERIALIZABLE, podporu cizích tabulek dle standardu SQL/MED, cyklus FOREACH v PL/pgSQL a řadu dalších funkcí.Ve [[PostgreSQL 9.2 (2012)|verzi 9.2]] se setkáme s index only scanem, datovým typem range, datovým typem JSON, podporou SP_GIST indexů. Ve [[PostgreSQL 9.3 (2013)|verzi 9.3]] je k dispozici např. podpora DDL triggerů, klauzule LATERAL, kontrolní součty datových stránek. [[PostgreSQL 9.4 (2014): transakční sql json databáze|Verze 9.4]] přináší podmíněné agregační funkce a agregační funkce na seřazených datech (median), nerelační datový typ jsonb (další generace typu HStore), možnost konfigurace pomocí SQL příkazů (ALTER SYSTEM).  [[PostgreSQL 9.5 (2015) držte si klobouky, zrychlujeme|Verze 9.5]] přináší GROUPING SETS, UPSERT, práva na úrovni řádku (Row Level Security), vyšší výkon pod extrémní zátěží, online komprimaci transakčního logu. [[PostgreSQL 9.6 (2016) odteď paralelně|verze 9.6]] umožňuje využít pro jeden dotaz více CPU. [[PostgreSQL 10 (2017) - drsně rozběhnutý slon|Verze 10]] přináší zlepšení partitioningu, integraci logické replikace, podpoře více sloupcových statistik. Ve [[PostgreSQL 11 (2018)|verzi 11]] můžeme používat příkaz CALL a v procedurách explicitně commitovat. V této verzi díky paralelnímu hashjoinu dosáhneme rychlejších analytických výpočtů. Přínosem je i dynamičtější partitioning. [[PostgreSQL 12 (2019)|Verze 12]] přináší podporu JSONPath, podporu nedeterministických locales (např. case insensitive) a další způsob práce s více sloupcovými statistikami. [[PostgreSQL 13 (2020)|Verze 13]] pak přináší přepsanou hash agregaci, efektivnější ukládání klíčů v indexu (deduplikace), a výrazně rychlejší vykonávání výrazů v PLpgSQL. Ve [[PostgreSQL 14 (2021)|verzi 14]]  jsou  na statistiky nad výrazy, je efektivnější vyhledávání hodnoty v dlouhém seznamu hodnot, je menší bloatingu indexů, a konečně je i úplná podpora výrazů na levé straně přiřazovacího příkazu (v PL/pgSQL). [[PostgreSQL 15 (2022)|Verze 15]] přidává ANSI SQL příkaz MERGE a další možnosti nastavení přístupových práv. [[PostgreSQL 16 (2023)|Verze 16]] přináší řadu optimalizací a pokračuje v implementaci SQL/JSON. [[PostgreSQL 17 (2024)|Verze 17]] přináší podporu inkrementálního backupu a finišuje podporu SQL/JSON. [[PostgreSQL 18 (2025)|Verze 18]] podporuje index skip skan a vyšší redukci zbytečných spojení (joinů) v dotazech. Aktuálně se dokončuje verze 19, která zavádí příkaz REPACK, přínáší podporu SQL/PGQ (jazyk pro operace nad grafy) a extenzi pg_plan_advice (alternativa plan hintů z Oracle). Díky tomu je PostgreSQL solidní a bezpečnou platformou pro vývoj aplikací (informační, řídící a monitorovací systémy, výzkum, aplikace pro státní a komunální správu).&lt;br /&gt;
&lt;br /&gt;
viz [https://www.postgresql.org/about/featurematrix/ Feature Matrix] &lt;br /&gt;
&lt;br /&gt;
Předností systému PostgreSQL je rozšiřitelnost. Systém může být bezproblémově rozšiřován o nové datové typy, funkce operátory, agregační funkce, procedurální jazyky. Díky tomu mohly vzniknout následující rozšíření: [http://postgis.refractions.net/ PostGIS] - podpora pro geografické informační systémy, [https://www.timescale.com/ Timescale] - podpora pro data časových řad nebo [https://www.citusdata.com/ Citus] - umožní používat Postgres jako distribuovanou databázi. Na serverech [https://github.com/topics/postgresql-extension GitHub] nebo [http://pgxn.org/ PGXN] je k dispozici několik desítek doplňků včetně doplňků rozšířující o funkcionalitu  MySQL, SQL Serveru a [[Oracle functionality|Oraclu]]. Uživatelé také [[Postgres_Informix|oceňují vynikající uživatelskou podporu]] (ať začátečníků nebo pokročilých uživatelů).&lt;br /&gt;
&lt;br /&gt;
Za vývojem PostgreSQL stojí skupina nezávislých vývojářů a uživatelů, ke které se kdokoliv může připojit. A to přihlášením do diskusního fóra a následnou participací na projektu: patche, podporou uživatelů, psaním a překladem dokumentace atd. &lt;br /&gt;
&lt;br /&gt;
PostgreSQL je faktickým &#039;&#039;průmyslovým standardem&#039;&#039; - existují komerční databáze postavené nad komunitním PostgreSQL - [http://en.wikipedia.org/wiki/Netezza Netezza],[http://en.wikipedia.org/wiki/Greenplum GreenPlum], [http://en.wikipedia.org/wiki/EnterpriseDB EnterpriseDB], [https://www.timescale.com/ Timescale], [https://blog.yugabyte.com/ YugabyteDB]. Můžeme se setkat s databázemi, které používají protokol kompatibilní s PostgreSQL - H2 nebo databáze, které přebírají interface PostgreSQL - např. [http://en.wikipedia.org/wiki/Vertica Vertica]. Analytická souborová databáze [https://duckdb.org/ DuckDB] - příbírá SQL gramatiku (syntax) z PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
=CSPUG - Czech and Slovak PostgreSQL Users Group=&lt;br /&gt;
Za účelem podpory sdružování uživatelů PostgreSQL vznikla v roce 2010 obecně prospěšná společnost (dle zákona č. 634/2004 Sb. o správních poplatcích) Sdružení českých a slovenských uživatelů PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
-----&lt;br /&gt;
Autorem zde uložených dokumentů (a&amp;amp;nbsp;překladatelem FAQ) je [[Pavel Stěhule]].&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=PL/pgSQL&amp;diff=1590</id>
		<title>PL/pgSQL</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PL/pgSQL&amp;diff=1590"/>
		<updated>2026-05-10T03:52:03Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: /* Přidáno ve verzi 17 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;RDBMS PostgreSQL umožňuje (stejně jako většina obdobných RDBMS) navrhovat a používat tzv. uložené procedury (Stored procedure). Uložená procedura je kód, který je uložen a spouštěn SQL serverem. Pro PostgreSQL můžeme uložené procedury psát v některém z následujících programovacích jazyků: SQL, Perl, Python, TCL, PL/pgSQL. Ačkoliv je PL/pgSQL pouze jedním z jazyků, který můžeme použít při návrhu uložených procedur, je patrně nejpoužívanější. Jedná se o jednoduchý programovací jazyk navržený pouze pro psaní uložených procedur RDBMS PostgreSQL. Ideově vychází z PL/SQL fy. Oracle. Velkou výhodou je [[automatické kešování prováděcích plánů v PL/pgSQL|automatické kešování prováděcích plánů]]. Nevýhodou, že jej nemůžeme použít k návrhu vlastních datových typů.&lt;br /&gt;
&lt;br /&gt;
Tento dokument předpokládá, že používáte PostgreSQL 8.1 a vyšší.  &lt;br /&gt;
&lt;br /&gt;
== Kdy nepoužívat PL/pgSQL ==&lt;br /&gt;
&lt;br /&gt;
Ne vždy lze použít uložené procedury. Podmínkou pro přenesení kódu do uložených procedur je absolutní neinteraktivita a bezestavovost. Jelikož většina aplikací jistý stupeň interakce vyžaduje, je nepravděpodobné a jak zkušenosti uživatelů napovídají i neefektivní psát aplikace čistě v uložených procedurách. SQL server nemůže nahradit aplikační server, pouze částečně, a je na úvaze uživatele aby zvážil všechna pro a proti.&lt;br /&gt;
&lt;br /&gt;
Stejně tak jako mají uložené procedury svá omezení ma svá omezení jazyk PL/pgSQL. V několika určitých případech nelze PL/pgSQL použít buďto z nedostatečnosti jazyka (PL je příliš statický) nebo z důvodu neefektivity. &lt;br /&gt;
&lt;br /&gt;
PL/pgSQL není vhodné používat k inicializaci velkých polí - důvodem je pomalý zápis do pole. Pokud není zbytí je mnohem rychlejší prvky pole vytvořit pomocí konverze tabulky, kterou vytvoříme SRF funkcí, na pole. Například nejrychlejší způsob vytvoření pole vzestupných hodnot je SELECT ARRAY(SELECT * FROM generate_series(1,100));. Funkce generate_series je SRF funkce generujcí posloupnost hodnot ze zadaného intervalu.&lt;br /&gt;
&lt;br /&gt;
Rychlostí nevyniká ani iterační sestavení řetězce. Pokud nejste spokojeni s rychlostí funkce, zkuste ještě následující trik. Svou funkci převeďte na SRF funkci - část, kde slučujete řetězce nahraďte příkazem RETURN NEXT část_řetězce. Konečné sloučení provedete mimo tělo funkce pomocí funkce array_to_string.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION generate_string(integer) RETURNS SETOF varchar AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  FOR _i IN 1 .. $1 LOOP &lt;br /&gt;
    RETURN NEXT &#039;&amp;lt;item&amp;gt;&#039;||_i||&#039;&amp;lt;/item&amp;gt;&#039;;&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  RETURN;&lt;br /&gt;
END; $$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
SELECT array_to_string(&lt;br /&gt;
  ARRAY(SELECT * FROM generate_string(1000)), &#039;&#039;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
PL/pgSQL nepodporuje žádné I/O operace, a ani se nepředpokládá, že by je v blizké budoucnosti byly podporovány - PL/pgSQL existuje pouze v trusted variantě. Řešením je použít některý z untrusted jazyků jako je plperlu nebo plpython.&lt;br /&gt;
&lt;br /&gt;
PL/pgSQL není vhodný k návrhnu univerzálních triggerů. V PL/pgSQL neexistuje možnost jak převést hodnotu typu RECORD na pole (Položka typu RECORD je přístupná pouze prostřednictvím statického identifikáturu známého v době kompilace, pole je přístupné prostřednictvím dynamického indexu). Tudíž neexistuje žádná možnost jak dynamicky iterovat skrz všechny položky typu RECORD, nebo dynamicky přistupovat k typu RECORD. Řešením je opět využít jiný programovací jazyk, tentokrát však postačí trusted varianty.&lt;br /&gt;
=== Jak nepoužívat PL/pgSQL ===&lt;br /&gt;
Asi nejdůležitější je uvědomit si, že plpgsql je interpret bez vlastní &amp;quot;aritmetické&amp;quot; jednotky. Veškeré výrazy převádí na triviální SQL příkazy - jejich vyhodnocení je řádově rychlejší než u plných SQL příkazů, nicméně stále řádově pomalejší než u vestavěné funkcionality. Je zásadní používat vestavěnou funkcionalitu kdekoliv, kde je to možné a kde je to výhodné. Jako ukázku špatného kódu uvádím kód, který jsem nalezl na internetu - jde o kontrolu telefonního čísla:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create or replace function kontrola_telefonniho_cisla (text)&lt;br /&gt;
returns boolean as $$&lt;br /&gt;
declare&lt;br /&gt;
  text alias for $1;&lt;br /&gt;
  znak text;&lt;br /&gt;
  i    int4;&lt;br /&gt;
begin&lt;br /&gt;
  i=1;&lt;br /&gt;
  while true loop&lt;br /&gt;
    if length (text) != 16 then exit; end if;&lt;br /&gt;
    znak := substring(text from i for 1);&lt;br /&gt;
    if znak != &#039;+&#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak &amp;lt; &#039;0&#039; or znak&amp;gt;&#039;9&#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak &amp;lt; &#039;0&#039; or znak&amp;gt;&#039;9&#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak &amp;lt; &#039;0&#039; or znak&amp;gt;&#039;9&#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak != &#039; &#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak &amp;lt; &#039;0&#039; or znak&amp;gt;&#039;9&#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak &amp;lt; &#039;0&#039; or znak&amp;gt;&#039;9&#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak &amp;lt; &#039;0&#039; or znak&amp;gt;&#039;9&#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak != &#039; &#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak &amp;lt; &#039;0&#039; or znak&amp;gt;&#039;9&#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak &amp;lt; &#039;0&#039; or znak&amp;gt;&#039;9&#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak &amp;lt; &#039;0&#039; or znak&amp;gt;&#039;9&#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak != &#039; &#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak &amp;lt; &#039;0&#039; or znak&amp;gt;&#039;&#039;9&#039;&#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak &amp;lt; &#039;0&#039; or znak&amp;gt;&#039;9&#039; then exit; end if;&lt;br /&gt;
    i:=i+1; znak := substring(text from i for 1);&lt;br /&gt;
    if znak &amp;lt; &#039;0&#039; or znak&amp;gt;&#039;9&#039; then exit; end if;&lt;br /&gt;
    return true;&lt;br /&gt;
  end loop;&lt;br /&gt;
  raise exception e&#039;Chybny znak \&#039;%\&#039; s poradim %. Telefonni cislo zadavejte ve tvaru +XXX XXX XXX XXX&#039;,znak,i;&lt;br /&gt;
  return false; -- &amp;lt;&amp;lt; mrtvy kod&lt;br /&gt;
end;&lt;br /&gt;
$$ language plpgsql; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tato ukázka obsahuje celou řadu chyb - použití názvu typu jako identifikátor, zbytečně dlouhý kód - minimálně vnořený cyklus by dokázal kód razantně zkrátit, vysledkem je řetězec obsahující nečíselné znaky, což nepraktické, a  principiálně tato funkce měla být napsána úplně jinak. Tato varianta by možná odpovídala kódu v C případně Fortranu, ale je absolutně nevhodná pro moderní jazyky. Když už, tak použijme regulární výrazy:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create or replace function kontrola_telefonniho_cisla (text)&lt;br /&gt;
returns boolean as $$&lt;br /&gt;
begin&lt;br /&gt;
  if not $1 ~  e&#039;^\\+\\d{3}\\ \\d{3} \\d{3} \\d{3}$&#039; then&lt;br /&gt;
    raise exception &#039;Chybny vstup pro telefonni cislo &amp;quot;%&amp;quot;. Ocekavan je vstup ve tvaru +999 999 999 999&#039;;&lt;br /&gt;
  end if;&lt;br /&gt;
  return true; &lt;br /&gt;
end;&lt;br /&gt;
$$ language sql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Osobně bych ještě z řetězce kontrolu napsal o něco méně restriktivní, povolil devítimístná čísla, a jako výsledek vracel čistý řetězec devíti nebo dvanácti číslic:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION normalise_phone_number(text)&lt;br /&gt;
RETURNS text AS $$&lt;br /&gt;
DECLARE aux text := translate($1, &#039; &#039;,&#039;&#039;);&lt;br /&gt;
BEGIN&lt;br /&gt;
  IF aux ~ e&#039;^\\+\\d{12}$&#039; THEN&lt;br /&gt;
    RETURN substring(aux FROM 2);&lt;br /&gt;
  ELSEIF aux ~ e&#039;^\\d{9}$&#039; THEN&lt;br /&gt;
    RETURN aux;&lt;br /&gt;
  ELSE&lt;br /&gt;
    RAISE EXCEPTION &#039;Unexpected format of phone number &amp;quot;%&amp;quot;.&#039;, $1;&lt;br /&gt;
  END IF;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Použití:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# select normalise_phone_number(&#039;+420 222 222 222&#039;);&lt;br /&gt;
 normalise_phone_number &lt;br /&gt;
------------------------&lt;br /&gt;
 420222222222&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# select normalise_phone_number(&#039;+420 222 222222&#039;);&lt;br /&gt;
 normalise_phone_number &lt;br /&gt;
------------------------&lt;br /&gt;
 420222222222&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# select normalise_phone_number(&#039;+420 22 222222&#039;);&lt;br /&gt;
ERROR:  Unexpected format of phone number &amp;quot;+420 22 222222&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
postgres=# select normalise_phone_number(&#039;724 191 000&#039;);&lt;br /&gt;
 normalise_phone_number &lt;br /&gt;
------------------------&lt;br /&gt;
 724191000&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Začátečnickou chybou je používání uložených procedur v situacích, kdy si vystačíme s jinými prostředky - např. použití triggeru místo unikátního indexu:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- špatne použití triggeru&lt;br /&gt;
CREATE OR REPLACE FUNCTION kontrola_unikatnosti()&lt;br /&gt;
RETURNS TRIGGER AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  IF EXISTS(SELECT * FROM tab WHERE id = NEW.id) THEN&lt;br /&gt;
    RAISE ERROR &#039;id neni unikatni&#039;;&lt;br /&gt;
  END IF;&lt;br /&gt;
  RETURN NEW;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
-- správně použití unikátního indexu&lt;br /&gt;
CREATE UNIQUE INDEX ON tab(id);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Kdy je SQL rychlejší než PLpgSQL? ===&lt;br /&gt;
Odpověď je jednoduchá - vždy, když dokážeme využít vestavěnou funkcionalitu. Ve svých školení používám jako jedno zadání implementaci bublesortu. Bublesort představuje jeden z jednodušších nicméně netriviálních algoritmů vhodných pro výuku programovacího jazyka. Sám o sobě se bublsort nehodí pro větší objem dat (nad 1000 hodnot). A to bez ohledu na to, zda je implementace v PLpgSQL nebo v C. Pg používá &amp;lt;i&amp;gt;quicksort&amp;lt;/i&amp;gt;, který je efektivnější pro větší množiny. Setkal jsem se, a setkávám se s tím, že vývojáři používají bublesort nevhodně - např. pro několik desítek stovek tisíc řádků. Implementace v SQL bude mnohem výhodnější:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION sort(anyarray)&lt;br /&gt;
RETURNS anyerray AS $$&lt;br /&gt;
SELECT array(SELECT unnest($1) ORDER BY 1);&lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Představení jazyka PL/pgSQL ==&lt;br /&gt;
PL/pgSQL nezavádí nové typy a vlastní funkce. Obojí sdílí s RDBMS. Funkce v PL/pgSQL mohou obsahovat většinu parametrizovaných SQL příkazů: pro správu tabulek, databází i jednotlivých záznamů. PL/pgSQL má konstrukci pro iteraci napříč množinou záznamů specifikovanou příkazem SELECT. V PL/pgSQL můžeme konstruovat SQL příkazy a pak je nechat provádět. Autoři PL/pgSQL se zjevně inspirovali jazykem PL/SQL, který je nativní prog. jazyk pro RDBMS Oracle, a tak není příliš obtížné konvertovat uložené procedury z Oracle do PostgreSQL a naopak.&lt;br /&gt;
&lt;br /&gt;
V PostgreSQL můžeme PL/pgSQL použít k implementaci vlastních agregačních i normálních funkcí, operátorů, k implementaci procedur triggerů. Možnosti vytváření uložených procedur se každou novou verzí zvětšují, proto se i vyvýjí příkaz CREATE FUNCTION, kterým definujeme novou funkci.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE [OR REPLACE] FUNCTION název ([IN|OUT|INOUT] název typ [,...]) &lt;br /&gt;
  RETURNS návr_typ AS $$&lt;br /&gt;
    {tělo funkce}&lt;br /&gt;
  $$ LANGUAGE plpgsql&lt;br /&gt;
  [IMMUTABLE | STABLE | VOLATILE]&lt;br /&gt;
  [CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT]&lt;br /&gt;
  [EXTERNAL SECURITY INVOKER | EXTERNAL SECURITY DEFINER]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Doporučuji psát kód funkcí v libovolném textovém editoru produkujícím čistý text. Kód uložit do souboru a v psql příkazem \i název_souboru provést příkaz (příkazy) uložené v souboru vedoucí k vytvoření funkce. Rozhodně nedoporučuji psát funkce přímo v psql.&lt;br /&gt;
&lt;br /&gt;
K tomu abychom mohli používat PL/pgSQL musí být tento jazyk tzv. povolen pro danou databázi. Příkaz createlang -l vaše_db by měl vypsat tabulku obsahující řádek plpgsql | t. Pokud vrácená tabulka tento řádek neobsahuje, musí se používání PL/pgSQL pro danou databázi povolit příkazem (příkaz může provést pouze uživatel s právy Postgres super uživatele).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
createlang plpgsql vaše_db&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Jestliže PL/pgSQL používat můžete, zkuste si napsat jednoduchou funkci Součet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION Soucet(a int, b int) RETURNS int AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  /*&lt;br /&gt;
    Moje první triviální PL/pgSQL funkce.&lt;br /&gt;
  */&lt;br /&gt;
  RETURN a + b;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;&lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
Pokud funkci přepíšete bezchybně, pak můžete funkci otestovat příkazem SELECT soucet(10,10). V sloupci soucet (jmenuje se stejně, jako funkce) se objeví hodnota 20. Komentáře se v PL/pgSQL zapisují stejně, jako v SQL - jednořádkové začínají zdvojenou pomlčkou, víceřádkové mají C notaci, tj. /* komentář */. Provádění každé funkce v PL/pgSQL musí být ukončeno příkazem RETURN&lt;br /&gt;
&lt;br /&gt;
Funkce má dvě části - deklaraci proměnných (ta zatím nebyla použitá) a vlastní tělo, tj. seznam příkazů (blok) oddělených středníkem vložený mezi dvojici klíčových slov BEGIN a END. Příkaz RETURN ukončí vykonávání funkce a jako výsledek vrátí hodnotu výrazu. Starší verze PostgreSQL nepodporovaly pojmenované parametry funkce. Podporován byl pouze tzv. poziční zápis, s kterým se ještě můžete setkat (symbol $ a číslo pořadí parametru). Výchozím atribut pro parametry funkce je IN. Každý takový parametr je konstanta. Bloky se, na rozdíl od Pascalu, nepoužívají k vymezení rozsahu konstrukcí IF, WHILE, FOR, LOOP, ale pouze k vymezení existence lokálních proměnných.&lt;br /&gt;
&lt;br /&gt;
V PostgreSQL lze funkce přetěžovat, tj. můžeme mít definováno několik funkcí lišících se od sebe počtem a typy argumentů. U všech identifikátorů, stejně tak i u klíčových slov, lze bez omezení používat velká i malá písmena. Při kompilaci se veškeré řetězce vyjma řetězců mezi zdvojenými apostrofy převádí na malá písmena.&lt;br /&gt;
&lt;br /&gt;
Operátor přiřazení má v PL/pgSQL podobu symbolu :=. Kromě toho lze proměnné přiřadit výsledek SQL dotazu konstrukcí SELECT INTO&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT INTO cíl výraz FROM ...;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Cílem může být proměnná typu record nebo row, nebo seznam proměnných. Při provádění se kontroluje zda cíl odpovídá výrazu (počtem a typy). Pokud je výsledkem více řádků, pak se použíjí hodnoty z prvého řádku. Proměnná typu RECORD nikdy není nastavena na NULL. Pokud je výsledkem prázdná množina, je proměnným přiřazena hodnota NULL.&lt;br /&gt;
&lt;br /&gt;
Kromě testu na NULL, který nemusí být vždy jednoznačný, můžeme testovat hodnotu vestavěné proměnné FOUND, která obsahuje hodnotu TRUE, pokud dotaz vrátil alespoň jeden řádek. Také lze po každém SQL příkazu uložit počet zpracovaných řádek do proměnné příkazem GET&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET DIAGNOSTICS promenna = ROW_COUNT;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Test proměnné FOUND lze provést pouze po příkazu SELECT INTO. Následující dva příklady vrací počet řádek v tabulce jména. V prvním případě se pro provedení SQL příkazu použila konstrukce PERFORM. Ta slouží k vykonání SQL příkazu nebo funkce v těch případech, kdy nedochází k dalšímu zpracování vrácené hodnoty.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION radku1() RETURNS int AS $$&lt;br /&gt;
  DECLARE r int;&lt;br /&gt;
  BEGIN&lt;br /&gt;
    PERFORM * FROM jmena;&lt;br /&gt;
    GET DIAGNOSTICS r = ROW_COUNT;&lt;br /&gt;
    RETURN r;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION radku2() RETURNS int AS $$&lt;br /&gt;
  DECLARE r int;&lt;br /&gt;
  BEGIN&lt;br /&gt;
    SELECT INTO r count(*) FROM jmena;&lt;br /&gt;
    RETURN r;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Za příkazem DECLARE můžeme deklarovat seznam dvojic proměnná typ oddělených středníkem. Kromě toho lze proměnné přiřadit hodnotu (počítá se při každém vstupu do bloku), lze ji zákazát přiřazení hodnoty NULL a také ji můžeme označit jako konstantní. Při porušení těchto pravidel,prostředí PL/pgSQL přeruší běh procedury. Všechny proměnné označené jako NOT NULL musí mít určenou DEFAULT hodnotu.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DECLARE jméno [CONSTANT] typ [NOT NULL][DEFAULT|(:=)konstanta|parametr funkce]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kromě běžných typů můžeme použít typ RECORD, který může obsahovat řádek libovolné tabulky nebo tzv. odvozené typy. Ty vycházejí buďto z řádku konkrétní tabulky (název_tab%ROWTYPE), sloupce (název_tab.jm_sloupce%TYPE) nebo dříve deklarované proměnné (proměnná%TYPE). K jednotlivým položkám typu RECORD nebo řádek se přistupuje skrze tečkovou notaci, tj. proměnná.položka.&lt;br /&gt;
&lt;br /&gt;
Kód PL/pgSQL může obsahovat libovolný SQL příkaz. Příkladem může být funkce vracející název měsíce na základě jeho indexu. Vývojáři v PL/pgSQL by se měli vyvarovat kolizí názvů PL/pgSQL proměnných a databázových objektů - důsledkem těchto kolizí mohou být relativně obtížně detekovatelné chyby. Jednou z řešení je používání prefixů na proměnné PL/pgSQL. V tomto případě symbolu podtržítka &amp;quot;_&amp;quot;. Na uživatele znalé PL/SQL tu číhá jedna zrada. Zatímco v Oracle má v případě kolize názvu (název sloupce je stejný jako název lokální proměnné) přednost název sloupce, v PostgreSQL je tomu přesně naopak. V Oracle můžete konflikt názvu vyřešit upřesněním definičního bloku proměnné. Ten sice v PostgreSQL můžete použít také, vzhledem k větší prioritě lokálních proměnných konflikt nevyřešíte. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION MonthName1 (_month INTEGER) RETURNS VARCHAR(10) AS $$&lt;br /&gt;
  DECLARE vysledek RECORD;&lt;br /&gt;
  BEGIN&lt;br /&gt;
    IF _month &amp;lt;1 OR _month &amp;gt; 12 THEN&lt;br /&gt;
      RAISE EXCEPTION E&#039;Parametr je mimo přípustné meze\n&#039;;&lt;br /&gt;
    END IF;&lt;br /&gt;
    SELECT INTO vysledek &lt;br /&gt;
      CASE _month&lt;br /&gt;
        WHEN  1 THEN &#039;Leden&#039;&lt;br /&gt;
        WHEN  2 THEN &#039;Únor&#039;&lt;br /&gt;
        WHEN  3 THEN &#039;Březen&#039;&lt;br /&gt;
        WHEN  4 THEN &#039;Duben&#039;&lt;br /&gt;
        WHEN  5 THEN &#039;Květen&#039;&#039;&lt;br /&gt;
        WHEN  6 THEN &#039;Červen&#039;&lt;br /&gt;
        WHEN  7 THEN &#039;Červenec&#039;&lt;br /&gt;
        WHEN  8 THEN &#039;Srpen&#039;&lt;br /&gt;
        WHEN  9 THEN &#039;Září&#039;&lt;br /&gt;
        WHEN 10 THEN &#039;Říjen&#039;&lt;br /&gt;
        WHEN 11 THEN &#039;Listopad&#039;&lt;br /&gt;
        WHEN 12 THEN &#039;Prosinec&#039;&lt;br /&gt;
      END::VARCHAR(10) AS retval;&lt;br /&gt;
    RETURN vysledek.retval;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tím libovolným SQL příkazem byl v tomto příkladě příkaz CASE. Ačkoliv se vrací pouze řetězec, je nutno použít typ RECORD, jelikož příkaz CASE vždy vrací RECORD (byť o jednom prvku). Kromě příkazu CASE se v příkladu použije konstrukce IF THEN END IF a příkaz RAISE EXCEPTION. Konstrukce IF THEN END IF je jasná. Prvním argumentem příkazu RAISE je úroveň vyjímky. K dispozici jsou tři možnosti: DEBUG - zapíše se do logu, NOTICE - oznámí se uživateli, EXCEPTION - přeruší se vykonávání funkce. Druhým parametrem je text chybového hlášení (text zapisujeme mezi zdovojené apostrofy). Pokud se v textu objeví symbol %, pak se tento symbol nahradí odpovídající proměnnou, která se předá jako třetí, čtvrtý, atd. argument. &lt;br /&gt;
&lt;br /&gt;
RAISE NOTICE se běžně používá pro zobrazení ladících hlášení, zobrazení obsahu proměnných. V podstatě je to jediný ladící prostředek, který je k dispozici. &lt;br /&gt;
&lt;br /&gt;
Všimněte si, že příkaz CASE je parametrizován, tj. obsahuje proměnnou. Parametry lze použít u všech SQL příkazů, všude tam, kde se vyskytuje nějaká hodnota. Nelze parametrizovat názvy sloupců a tabulek. Toto omezení lze obejít (za cenu sníženého výkonu a zvýšené pracnosti) tzv. dynamickými dotazy (viz. níže příklad EXECUTE).&lt;br /&gt;
&lt;br /&gt;
Pokud chceme přistupovat z PL/pgSQL funkcí do dočasných tabulek, je použití EXECUTE nezbytné. Jednou vytvořené prováděcí plány si drží id dočasných tabulek, která se však již mohou být neplatná. Název tabulky je v tomto případě nedůležitý, tj. pokud tabulku zrušíme a vytvoříme pod stejným názvem, bude mít nová tabulka jiné id než zrušená tabulka.&lt;br /&gt;
&lt;br /&gt;
Následující příklad vytvoří a naplní tabulku s hodnotami fce sin v zadaném rozsahu. Používá konstrukci WHILE a parametrizovaný SQL příkaz INSERT. Tabulka tabsin se vytvoří pouze v případě, že dosud neexistovala.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION tabsin(_p1 float, _p2 float, _p3 float) RETURNS void AS $$&lt;br /&gt;
  DECLARE _i float = _p1; _do float = _p2; _krok float = _p3;&lt;br /&gt;
  BEGIN&lt;br /&gt;
    IF NOT EXISTS(SELECT relname FROM pg_class&lt;br /&gt;
      WHERE relname = &#039;tabsin&#039; AND relkind = &#039;r&#039; AND pg_table_is_visible(oid)) THEN&lt;br /&gt;
      RAISE NOTICE &#039;Vytvářím tabulku tabsin&#039;;&lt;br /&gt;
      CREATE TEMP TABLE tabsin (x NUMERIC(5,4) PRIMARY KEY, fx NUMERIC(5,4));&lt;br /&gt;
    ELSE &lt;br /&gt;
      RAISE NOTICE &#039;Ruším všechny zaznamy v tabulce tabsin&#039;;&lt;br /&gt;
      TRUNCATE TABLE tabsin;&lt;br /&gt;
    END IF;&lt;br /&gt;
    WHILE _i &amp;lt; _do LOOP&lt;br /&gt;
      INSERT INTO tabsin VALUES(CAST(_i AS NUMERIC(5,4)), SIN(_i));&lt;br /&gt;
      _i := _i + _krok;&lt;br /&gt;
    END LOOP;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vytvoření tabulky pro interval od -1 do 1 s krokem 0.0001 provede příkaz select tabsin(-1.0, 1.0, 0.0001). Provádění cyklu je rychlé. INSERT dvaceti tisíců řádek trvá na zhruba dvě vteřiny na mém 1.6G notebooku. Požadovanou hodnotu funkce zjistíme příkazem SELECT&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM tabsin WHERE x=0.1234;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Cyklus LOOP ... END LOOP můžeme opustit příkazem EXIT s volitelným návěstím (specifikuje cyklus, který má být přerušen) a volitelnou podmínkou. Návěstí cyklu můžeme volitelně uvést v místě ukončení cyklu.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;&amp;lt;hlavni&amp;gt;&amp;gt;&lt;br /&gt;
  LOOP&lt;br /&gt;
    EXIT hlavni WHEN c &amp;gt; 10;&lt;br /&gt;
    RAISE NOTICE &#039;&#039;%&#039;&#039;, c;&lt;br /&gt;
    c := c + 1;&lt;br /&gt;
  END LOOP hlavni;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Návrh vlastních PL/pgSQL funkcí ==&lt;br /&gt;
To nejdůležitější na PL/pgSQL funkcích (resp. všech UDF funkcích) je fakt, že je můžeme použít v dotazech - zjednodušší se tím celý proces zpracování dat. Údaje můžeme zprocesovat ještě na serveru.&lt;br /&gt;
&lt;br /&gt;
Jedna z funkcí, která v PostgreSQL chybí je určení velikonoc. Používá se pro určení státních svátků v plánovacích funkcích. Použil jsem Carterterův algoritmus pro určení velikonoční neděle.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION velnedele(_rok INTEGER) RETURNS DATE AS $$&lt;br /&gt;
DECLARE B INTEGER; D INTEGER; E INTEGER; Q INTEGER;&lt;br /&gt;
  DD INTEGER; MM INTEGER;&lt;br /&gt;
BEGIN&lt;br /&gt;
    IF _rok &amp;lt; 1900 OR _rok &amp;gt; 2099 THEN&lt;br /&gt;
      RAISE EXCEPTION &#039;Out of range&#039;;&lt;br /&gt;
  END IF;&lt;br /&gt;
  B := 255 - 11 * ($1 % 19); D := ((B - 21) % 30) + 21;&lt;br /&gt;
  IF D &amp;gt; 38 THEN D := D - 1; END IF;&lt;br /&gt;
  E := ($1 + $1/4 + D + 1) % 7; Q := D + 7 - E;&lt;br /&gt;
  IF Q &amp;lt; 32 THEN DD:=Q; MM := 3; ELSE DD := Q - 31; MM := 4; END IF;&lt;br /&gt;
  RETURN to_date(to_char(DD, &#039;00&#039;) || &lt;br /&gt;
    to_char(MM, &#039;00&#039;) || to_char(_rok,&#039;0000&#039;), &#039;DD MM YYYY&#039;);&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE STRICT; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Dalším případem, kdy je použití UDF funkce prakticky nezbytností, je použití čistících funkcí pro párování záznamů v tabulce. Tyto funkce představují poslední záchranu, když máme provádět výběry nad historickými databázemi, kde si nikdo nelámal hlavu s doménovou integritou. V přikladu pracuji s sloupcem hodnot, kde ekvivalentní by mohly být záznamy: Vyhl, Vyhl., Vyhláška, Vyhl.č.j., vyhl. čj., občas chybí mezera, sem tam jsou navíc.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION clean(VARCHAR) RETURNS VARCHAR AS $$&lt;br /&gt;
DECLARE pom varchar DEFAULT $1;&lt;br /&gt;
BEGIN pom := to_ascii(lower(trim(both FROM pom)));&lt;br /&gt;
  pom = replace(pom,&#039;c.&#039; ,&#039; &#039;);&lt;br /&gt;
  pom = replace(pom,&#039;j.&#039; ,&#039; &#039;);&lt;br /&gt;
  pom = replace(pom,&#039;cj.&#039;,&#039; &#039;);&lt;br /&gt;
  pom = replace(pom,&#039;cj &#039;,&#039; &#039;);&lt;br /&gt;
&lt;br /&gt;
  pom = replace(pom,&#039;vyhl.&#039;,&#039;vyhlaska &#039;);&lt;br /&gt;
  pom = replace(pom,&#039;vyhl &#039;,&#039;vyhlaska &#039;);&lt;br /&gt;
  pom = replace(pom,&#039;.&#039;,&#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
  WHILE position(&#039;  &#039; IN pom) &amp;lt;&amp;gt; 0 LOOP&lt;br /&gt;
    pom := replace(pom, &#039;  &#039;,&#039; &#039;);&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  RETURN trim(both FROM pom);&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Použití PL/pgSQL pro správu databáze ==&lt;br /&gt;
&lt;br /&gt;
Vhodně navržené uložené procedury znatelně zjednoduší správu databáze. Následující funkci používám pro vyčištění RDBMS od databází, které vytvoří studenti během semestru. Pokud se funkce spustí bez parametrů zobrazí nápovědu, stejně tak, pokud nesouhlasí počet argumentů.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION drop_students_databases() RETURNS INTEGER AS $$&lt;br /&gt;
DECLARE&lt;br /&gt;
  helpstr VARCHAR(300);&lt;br /&gt;
BEGIN&lt;br /&gt;
  helpstr  := E&#039;Funkce pro zrušení všech databází uživatelů jejichž\n&#039; ||&lt;br /&gt;
    E&#039;jméno (jméno uživatele) vyhovuje masce příkazu LIKE.\n\n&#039; ||&lt;br /&gt;
    E&#039;např. SELECT drop_students_databases(&#039; || quote_literal(&#039;group%&#039;) || E&#039;)\n\n&#039; ||&lt;br /&gt;
    E&#039;pozn. musíte být přihlášen jako uživatel postgres.\n&#039; ||&lt;br /&gt;
    E&#039;autor: Pavel Stěhule, stehule@kix.fsv.cvut.cz 19.1.2002\n&#039;;&lt;br /&gt;
&lt;br /&gt;
  RAISE NOTICE &#039;%&#039;, helpstr;&lt;br /&gt;
  RETURN 0;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION drop_students_databases(_mask varchar(100)) RETURNS INTEGER AS $$&lt;br /&gt;
DECLARE &lt;br /&gt;
  db RECORD;&lt;br /&gt;
  deleted INTEGER := 0;&lt;br /&gt;
  helpstr VARCHAR(300);&lt;br /&gt;
BEGIN &lt;br /&gt;
  IF length(_mask) = 0 OR _mask ISNULL OR current_user() &amp;lt;&amp;gt; &#039;postgres&#039; THEN&lt;br /&gt;
    helpstr  := E&#039;Funkce pro zrušení všech databází uživatelů jejichž\n&#039; ||&lt;br /&gt;
      E&#039;jméno (jméno uživatele) vyhovuje masce příkazu LIKE.\n\n&#039; ||&lt;br /&gt;
      E&#039;např. SELECT drop_students_databases(&#039; || quote_literal(&#039;group%&#039;) || &#039;)\n\n&#039; ||&lt;br /&gt;
      E&#039;pozn. musíte být přihlášen jako uživatel postgres.\n&#039; ||&lt;br /&gt;
      E&#039;autor: Pavel Stěhule, stehule@kix.fsv.cvut.cz 19.1.2002\n&#039;;&lt;br /&gt;
    IF current_user &amp;lt;&amp;gt; &#039;postgres&#039; THEN&lt;br /&gt;
      RAISE EXCEPTION E&#039;Funkci může volat pouze uživatel postgres\n\n%&#039;, helpstr;&lt;br /&gt;
    ELSE&lt;br /&gt;
      RAISE EXCEPTION E&#039;Argument funkce musí být neprázdný řetězec\n\n%&#039;, helpstr;    &lt;br /&gt;
    END IF;&lt;br /&gt;
  END IF;&lt;br /&gt;
  &lt;br /&gt;
  FOR db IN &lt;br /&gt;
    select datname, usename from pg_database, pg_user &lt;br /&gt;
      where datdba=usesysid and usename like _mask&lt;br /&gt;
  LOOP&lt;br /&gt;
    deleted := deleted + 1;&lt;br /&gt;
    RAISE NOTICE &#039;Drop database %,%&#039;, db.datname, db.usename;&lt;br /&gt;
    EXECUTE &#039;drop database &amp;quot;&#039; || db.datname || &#039;&amp;quot;&#039;;&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  RETURN deleted;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Všimněte si konstrukce FOR IN LOOP END LOOP, která iteruje napříč výsledkem SQL dotazu (v tomto případě seznamu databází jejiž vlastnící vyhovují masce LIKE). Jelikož tabulky mohou obsahovat i mezery, je třeba název tabulky vložit do uvozovek. PL/pgSQL má problémy s vykonáváním příkazu DROP DATABASE pokud název databáze obsahuje mezeru. Problém můžeme obejít tak, že celý SQL příkaz uložíme do řetězce a necháme provést příkazem EXECUTE. EXECUTE můžeme použít ve všech případech, kdy PL/pgSQL odmítne SQL příkaz provést.&lt;br /&gt;
&lt;br /&gt;
== Použití PL/pgSQL funkcí v CHECK podmínkách ==&lt;br /&gt;
&lt;br /&gt;
Funkce v PL/pgSQL můžeme použít jako kontrolní v CHECK podmínkách. Tyto funkce musí mít pouze jeden argument odpovídajícího typu a pokud je hodnota argumentu NULL, pak musí vrátit NULL. Toto chování lze ošetřit programově, nebo použít atribut isstrict, který zajistí, že kdykoliv je alespoň jeden z argumentů funkce NULL, pak jako výsledek funkce se použije hodnota NULL aniž by se vykonala funkce. Následující příklad testuje validitu ISBN kódu (sice existuje doplněk isbn_issn, ten však ve většině případů nebude nainstalován). Všimněte si použití proměnné weight typu pole.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION check_ISBN(ISBN CHAR(12)) RETURNS boolean AS $$&lt;br /&gt;
  DECLARE &lt;br /&gt;
    pos INTEGER; asc INTEGER; suma INTEGER DEFAULT 0;&lt;br /&gt;
    weight INTEGER[] DEFAULT &#039;{10,9,8,7,6,5,4,3,2,1}&#039;;  -- pro ISSN {8,7,6,5,4,3,2,1}&lt;br /&gt;
    digits INTEGER DEFAULT 1;&lt;br /&gt;
  BEGIN &lt;br /&gt;
    FOR pos IN 1..length(ISBN) LOOP&lt;br /&gt;
      asc := ascii(substr(ISBN,pos,1));&lt;br /&gt;
      IF asc IN (88, 120) THEN -- ISDN muze obsahovat kontrolni cislo X&lt;br /&gt;
        suma := suma + 10;&lt;br /&gt;
        digits := digits + 1;&lt;br /&gt;
      ELSIF asc &amp;gt;= 48 AND asc &amp;lt;= 57 THEN&lt;br /&gt;
        suma := suma + (asc - 48)*weight[digits];&lt;br /&gt;
        digits := digits + 1;&lt;br /&gt;
      END IF;&lt;br /&gt;
    END LOOP;&lt;br /&gt;
    IF digits &amp;lt;&amp;gt; 11 THEN -- pro ISSN &amp;lt;&amp;gt; 9&lt;br /&gt;
      RETURN &#039;f&#039;;&lt;br /&gt;
    ELSE&lt;br /&gt;
      RETURN (suma % 11) = 0;&lt;br /&gt;
    END IF;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql STRICT IMMUTABLE;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Definovanou funkci můžeme použít CHECK podmínce, např (sloupec isbn):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE ZCHU_RezervacniKnihy (&lt;br /&gt;
  id INTEGER PRIMARY KEY DEFAULT nextval(&#039;doc_seq&#039;),&lt;br /&gt;
  idoo INTEGER NOT NULL,  -- id objektu ochrany&lt;br /&gt;
  taboo CHAR(1) NOT NULL CHECK(taboo IN (&#039;m&#039;,&#039;v&#039;,&#039;s&#039;)),&lt;br /&gt;
  isign varchar(50) NOT NULL UNIQUE CHECK (isign &amp;lt;&amp;gt; &#039;&#039;),&lt;br /&gt;
  typ CHAR(2) NOT NULL REFERENCES cv_TypDocRK(kod),&lt;br /&gt;
  autor_prijmeni VARCHAR(30) NOT NULL CHECK (autor_prijmeni &amp;lt;&amp;gt; &#039;&#039;), &lt;br /&gt;
  autor_jmeno VARCHAR(30) NULL CHECK (autor_jmeno &amp;lt;&amp;gt; &#039;&#039;),&lt;br /&gt;
  nazev VARCHAR(100) NOT NULL CHECK (nazev &amp;lt;&amp;gt; &#039;&#039;),&lt;br /&gt;
  poznamka VARCHAR(300) NULL,&lt;br /&gt;
  rok_vydani INTEGER NULL CHECK (rok_vydani &amp;gt; 1918 AND rok_vydani &amp;lt;EXTRACT(year FROM current_date)),&lt;br /&gt;
  zalozeno DATE DEFAULT current_date NOT NULL,&lt;br /&gt;
  vyrazeno DATE NULL CHECK (vyrazeno &amp;gt; zalozeno),&lt;br /&gt;
  isbn CHAR(12) NULL CHECK (check_ISBN(isbn)),&lt;br /&gt;
  url VARCHAR(100) NULL CHECK (url ~* &#039;^(file|http|ftp)://.+&#039;)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Použití PL/pgSQL funkcí při návrhu vlastních operátorů ==&lt;br /&gt;
&lt;br /&gt;
PostgreSQL nepodporuje operaci dělení intervalu intervalem. Není ovšem žádným problémem tento nedostatek překonat a definovat si vlastní operátor / pro tuto kombinaci operandů.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
omega=# select &#039;1hour&#039;::interval / &#039;10min&#039;::interval;&lt;br /&gt;
ERROR:  operator does not exist: interval / interval&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION div_op(a interval, b interval) &lt;br /&gt;
RETURNS double precision AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  RETURN EXTRACT(EPOCH FROM a) / EXTRACT(EPOCH FROM b);&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE RETURNS NULL ON NULL INPUT;&lt;br /&gt;
&lt;br /&gt;
CREATE OPERATOR / (procedure = div_op, leftarg = interval, rightarg = interval);&lt;br /&gt;
&lt;br /&gt;
omega=# select &#039;1hour&#039;::interval / &#039;10min&#039;::interval;&lt;br /&gt;
 ?column?&lt;br /&gt;
----------&lt;br /&gt;
        6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
V CHECK výrazech můžeme používat binární operátory OR a AND. V standardní distribuci chybí operátory XOR a implikace. Nicméně není žádným problémem tyto chybějící operátory do systému doplnit.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION op_xor (a boolean, b boolean) RETURNS boolean AS $$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    RETURN ((NOT a) AND b) OR (a AND (NOT b));&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION op_imp_lr (a boolean, b boolean) RETURNS boolean AS $$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    RETURN (NOT a OR b);&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION op_imp_rl (a boolean, b boolean) RETURNS boolean AS $$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    RETURN (NOT b OR a);&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Obě funkce musíme zaregistrovat a přiřadit jim nějaký symbol. To provede příkaz CREATE OPERATOR. Jméno pro operátor vytvoříme kombinací následujících znaků +-*/&amp;lt;&amp;gt;=~!@#%^&amp;amp;|&#039;?$.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DROP OPERATOR # (boolean, boolean);&lt;br /&gt;
&lt;br /&gt;
CREATE OPERATOR # (&lt;br /&gt;
  procedure = op_xor,&lt;br /&gt;
  leftarg = boolean,&lt;br /&gt;
  rightarg = boolean,&lt;br /&gt;
  commutator = #&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
DROP OPERATOR &amp;gt;&amp;gt;&amp;gt; (boolean, boolean);&lt;br /&gt;
&lt;br /&gt;
CREATE OPERATOR &amp;gt;&amp;gt;&amp;gt; (&lt;br /&gt;
  procedure = op_imp_lr,&lt;br /&gt;
  leftarg = boolean,&lt;br /&gt;
  rightarg = boolean,&lt;br /&gt;
  commutator = &amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE OPERATOR &amp;lt;&amp;lt;&amp;lt; (&lt;br /&gt;
  procedure = op_imp_rl,&lt;br /&gt;
  leftarg = boolean,&lt;br /&gt;
  rightarg = boolean,&lt;br /&gt;
  commutator = &amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Oba operátory si můžeme vyzkoušet na tabulce:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DROP TABLE logtab;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE logtab (l boolean, p boolean);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO logtab VALUES(FALSE,FALSE);&lt;br /&gt;
INSERT INTO logtab VALUES(TRUE,FALSE);&lt;br /&gt;
INSERT INTO logtab VALUES(FALSE,TRUE);&lt;br /&gt;
INSERT INTO logtab VALUES(TRUE,TRUE);&lt;br /&gt;
&lt;br /&gt;
SELECT l, p, l # p AS XOR FROM logtab;&lt;br /&gt;
SELECT l, p, l &amp;gt;&amp;gt;&amp;gt; p AS IMPL FROM logtab;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Použití obou těchto operátorů významně zjednoduší CHECK podmínky. V tabulce Hlaseni požaduji, aby bylo zadáno buďto id uživatele nebo jméno uživatele. Dále je požadováno, aby byl vyplněn sloupec popis chyby, pokud typ hlašení je chyba.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DROP TABLE Hlaseni;&lt;br /&gt;
DROP SEQUENCE Hlaseni_id_seq;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE Hlaseni (&lt;br /&gt;
  id SERIAL PRIMARY KEY,&lt;br /&gt;
  zalozeno DATE DEFAULT current_date NOT NULL,&lt;br /&gt;
  zalozil_neprihlasen VARCHAR(60) CHECK (zalozil_neprihlasen &amp;lt;&amp;gt; &#039;&#039;),&lt;br /&gt;
  zalozil INTEGER REFERENCES Uzivatele(id) CHECK (&lt;br /&gt;
    zalozil_neprihlasen IS NOT NULL # zalozil IS NOT NULL),&lt;br /&gt;
  trida_chyby CHAR(2) NOT NULL REFERENCES TridaChHlaseni(kod),&lt;br /&gt;
  chybove_hlaseni TEXT CHECK (&lt;br /&gt;
    (trida_chyby IN (&#039;ch&#039;,&#039;zc&#039;) &amp;gt;&amp;gt;&amp;gt; chybove_hlaseni IS NOT NULL) AND&lt;br /&gt;
    (chybove_hlaseni &amp;lt;&amp;gt; &#039;&#039;)),&lt;br /&gt;
  podrobny_popis TEXT NULL CHECK (podrobny_popis &amp;lt;&amp;gt; &#039;&#039;)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Hlaseni (zalozil, trida_chyby, podrobny_popis)&lt;br /&gt;
  VALUES (1,&#039;po&#039;, &#039;Nainstaloval jsem novou verzi.&#039;); -- ok&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Hlaseni (zalozil, zalozil_neprihlasen, trida_chyby, podrobny_popis)&lt;br /&gt;
  VALUES (1, &#039;Pavel Stěhule&#039;,&#039;po&#039;, &#039;Nainstaloval jsem novou verzi.&#039;); -- selže&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Hlaseni (zalozil_neprihlasen, trida_chyby, podrobny_popis)&lt;br /&gt;
  VALUES (&#039;Pavel Stěhule&#039;,&#039;po&#039;, &#039;Nainstaloval jsem novou verzi.&#039;); -- ok&lt;br /&gt;
&lt;br /&gt;
INSERT INTO Hlaseni (zalozil_neprihlasen, trida_chyby, podrobny_popis)&lt;br /&gt;
  VALUES (&#039;Pavel Stěhule&#039;,&#039;ch&#039;, &#039;Nainstaloval jsem novou verzi.&#039;); -- selže &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Neexistenci operátoru XOR lze obejít poměrně jednoduše (bez nutnosti psaní PL/pgSQL funkce).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 zalozil INTEGER REFERENCES Uzivatele(id) CHECK (&lt;br /&gt;
    (zalozil_neprihlasen IS NOT NULL) &amp;lt;&amp;gt; (zalozil IS NOT NULL))&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Použití PL/pgSQL funkcí při návrhu vlastních agregačních funkcí ==&lt;br /&gt;
&lt;br /&gt;
Porovnáme počet vestavěných agregačních funkcí v PostgreSQL s jinými srovnatelnými RDBMS, zjistíme, že v PostgreSQL mnohé agregační funkce chybí. Naštěstí si v PostgreSQL si můžeme agregační funkci navrhnout sami.&lt;br /&gt;
&lt;br /&gt;
V PostgreSQL agregační funkci vytvoříme pomocí dvou funkcí. První, která se spouští pro každou hodnotu (prvním parametrem je mezivýsledek, druhým pak samotná hodnota) a finální, jejíž parametrem je stávající mezivýsledek. První příklad tuto finální funkci nepotřebuje - vytvoří seznam čárkou oddělených položek. U agregačních funkcích je třeba (aby se chovali, tak jak se očekává) aby ignorovaly hodnotu NULL.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION comma_aggreg (state text, p text) RETURNS text AS $$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    IF p IS NULL THEN&lt;br /&gt;
      RETURN state;&lt;br /&gt;
    END IF&lt;br /&gt;
    IF length(state) &amp;gt; 0 THEN&lt;br /&gt;
      RETURN state || &#039;, &#039; || p;&lt;br /&gt;
    ELSE&lt;br /&gt;
      RETURN p;&lt;br /&gt;
    END IF;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE;&lt;br /&gt;
&lt;br /&gt;
DROP AGGREGATE comma(text);&lt;br /&gt;
&lt;br /&gt;
CREATE AGGREGATE comma (&lt;br /&gt;
  basetype = text,&lt;br /&gt;
  sfunc = comma_aggreg,&lt;br /&gt;
  stype = text,&lt;br /&gt;
  initcond = &#039;&#039;&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
SELECT comma(jmeno) FROM jmena;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Drobnou úpravou agregační funkce sum získáme hladovou funkci - tj. pokud je daný text již agregován, tak se bude ignorovat. Při použití této funkce zpracování dotazu nebude nejrychlejší, je to ale nejkratší cesta, jak docílit chtěného výsledku.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION comma_aggreg(state text,p text) RETURNS text AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  IF p IS NULL THEN&lt;br /&gt;
    RETURN state;&lt;br /&gt;
  END IF;&lt;br /&gt;
  IF length(state) &amp;gt; 0 THEN&lt;br /&gt;
    IF position(p in state) = 0 THEN&lt;br /&gt;
      RETURN state || &#039;, &#039; || p;&lt;br /&gt;
    ELSE&lt;br /&gt;
      RETURN state;&lt;br /&gt;
    END IF;&lt;br /&gt;
  ELSE&lt;br /&gt;
    RETURN p;&lt;br /&gt;
  END IF;&lt;br /&gt;
END; &lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tabulka obsahuje působnosti poboček v okresech a krajích. Pokud bych nepoužil hladové sčítání řetězců, tak by se mi kraj ve výpisu objevil dvakrát.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aopk=&amp;gt; select * from pusobnost;&lt;br /&gt;
    pobocka    |     okres     | kraj&lt;br /&gt;
---------------+---------------+------&lt;br /&gt;
 Benešov       | Benešov       | SČ&lt;br /&gt;
 Benešov       | Kutná Hora    | SČ&lt;br /&gt;
 Č. Budějovice | Č. Budějovice | JČ&lt;br /&gt;
(3 řádek)&lt;br /&gt;
&lt;br /&gt;
aopk=&amp;gt; select pobocka, sum(okres), sum(kraj) from pusobnost group by pobocka;&lt;br /&gt;
    pobocka    |         sum         | sum&lt;br /&gt;
---------------+---------------------+-----&lt;br /&gt;
 Č. Budějovice | Č. Budějovice       | JČ&lt;br /&gt;
 Benešov       | Benešov, Kutná Hora | SČ&lt;br /&gt;
(2 řádek)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Počínaje verzí 8.4 je efektivnější použití vestavěné funkce array_agg (vždy vyzkoušejte rychlost plpgsql fce a sql funkce - skládání řetězců a polí plpgsql nesvědčí):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT * FROM g;&lt;br /&gt;
    v    &lt;br /&gt;
---------&lt;br /&gt;
 Praha&lt;br /&gt;
 Benesov&lt;br /&gt;
 Benesov&lt;br /&gt;
(3 rows)&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT array_to_string(array_agg(distinct v),&#039;,&#039;) FROM g;&lt;br /&gt;
 array_to_string &lt;br /&gt;
-----------------&lt;br /&gt;
 Benesov,Praha&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Následující, mírně komplikovanější, agregační funkce vrací seznam položek v HTML formátu.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION html_li_aggr (state text,p text) RETURNS text AS $$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    IF p IS NULL THEN&lt;br /&gt;
      RETURN state;&lt;br /&gt;
    ELSE&lt;br /&gt;
      RETURN state || &#039;&amp;lt;li&amp;gt;&#039; || p || E&#039;&amp;lt;/li&amp;gt;\n&#039;;&lt;br /&gt;
    END IF;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION html_ul_final (state text) RETURNS text AS $$&lt;br /&gt;
  BEGIN&lt;br /&gt;
    IF $1 &amp;lt;&amp;gt; &#039;&#039; THEN&lt;br /&gt;
      RETURN E&#039;&amp;lt;ul&amp;gt;\n&#039; || state || &#039;&amp;lt;/ul&amp;gt;&#039;;&lt;br /&gt;
    ELSE&lt;br /&gt;
      RETURN &#039;&#039;;&lt;br /&gt;
    END IF;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE;&lt;br /&gt;
&lt;br /&gt;
DROP AGGREGATE html_ul (text);&lt;br /&gt;
&lt;br /&gt;
CREATE AGGREGATE html_ul (&lt;br /&gt;
  basetype = text,&lt;br /&gt;
  sfunc = html_li_aggr,&lt;br /&gt;
  stype = text,&lt;br /&gt;
  initcond = &#039;&#039;,&lt;br /&gt;
  finalfunc = html_ul_final&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Výsledkem dotazu SELECT html_ul(jmeno) FROM jmena je jedna hodnota (i když více řádků textu), kterou můžeme přímo vložit do HTML stránky.&lt;br /&gt;
&lt;br /&gt;
== Návrh trigerů v PL/pgSQL ==&lt;br /&gt;
&lt;br /&gt;
Trigger, česky spoušť je uložená procedura, kterou RDBMS aktivuje před nebo po provedení příkazů INSERT, UPDATE a DELETE na nějaké tabulce, které předtím určíme trigger. Jako trigger můžeme použít libovolnou PL/pgSQL proceduru bez parametrů vracející hodnotu typu TRIGGER, což je vlastně RECORD kompatibilní s tabulkou pro kterou je spouštěn. Existují dva typy triggerů: BEFORE a AFTER. BEFORE triggery se volají před provedením operace, AFTER triggery po provedení operace.&lt;br /&gt;
&lt;br /&gt;
Představme si situaci, kdy z nějakého důvodu chceme mít data rozdělená do dvou tabulek. Pracovat však chceme se sjednocením těchto tabulek. Pokud použijeme pohled, vzdáme se možnosti používat referenční integritu. Další řešení je používat pomocnou tabulku, která bude obsahovat hodnoty obou zdrojových tabulek.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE zdroj1 (&lt;br /&gt;
  kod CHAR(2) PRIMARY KEY,&lt;br /&gt;
  popis VARCHAR(100) CHECK (popis &amp;lt;&amp;gt; &#039;&#039;)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE zdroj2 (&lt;br /&gt;
  kod CHAR(2) PRIMARY KEY,&lt;br /&gt;
  popis VARCHAR(100) CHECK (popis &amp;lt;&amp;gt; &#039;&#039;)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE cil (&lt;br /&gt;
  kod CHAR(2) PRIMARY KEY,&lt;br /&gt;
  popis VARCHAR(100) CHECK (popis &amp;lt;&amp;gt; &#039;&#039;),&lt;br /&gt;
  zdroj CHAR(1) NOT NULL CHECK (zdroj = &#039;1&#039; OR zdroj = &#039;2&#039;)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Předesílám, že jakákoliv funkce PL/pgSQL běží pod implicitní transakcí, tj. selže-li libovolný příkaz v proceduře, pak se veškeré změny v datech provedených funkcí anulují. Na tomto chování je postavena funkce triggeru. Zkusím napřed provést požadovanou funkci na cílové tabulce, pokud příkaz selže, pak se nepodaří provést příkaz ani na zdrojové tabulce.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION trig_build_cil_F() RETURNS OPAQUE AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  IF TG_OP = &#039;DELETE&#039; THEN&lt;br /&gt;
    DELETE FROM cil WHERE kod = OLD.kod;&lt;br /&gt;
    RETURN OLD;&lt;br /&gt;
  ELSE&lt;br /&gt;
    IF TG_OP = &#039;UPDATE&#039; THEN&lt;br /&gt;
      UPDATE cil SET kod = NEW.kod, popis = NEW.popis WHERE kod = OLD.kod;&lt;br /&gt;
      RETURN NEW;&lt;br /&gt;
    ELSE &lt;br /&gt;
      INSERT INTO cil VALUES(NEW.kod, NEW.popis,&lt;br /&gt;
        CASE TG_RELNAME WHEN &#039;zdroj1&#039; THEN 1 WHEN &#039;zdroj2&#039; THEN 2 END);&lt;br /&gt;
      RETURN NEW;&lt;br /&gt;
    END IF;&lt;br /&gt;
  END IF;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql SECURITY DEFINER;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Při provádění PL/pgSQL funkce jako triggeru máme k dispozici několik vestavěných proměnných. TG_OP popisuje příkaz vedoucí k spuštění triggeru, TG_RELNAME nese název tabulky převedený na málá písmena, na které se trigger spustil, NEW obsahuje řádek s novou verzí hodnot (pouze pro INSERT a UPDATE), OLD obsahuje řádek s původní verzí hodnot (pouze pro DELETE a UPDATE). Pokud procedura vrátí NULL, pak se neprovede změna dat. Trigger řeší pouze přenos dat ze zdrojových tabulek do cílové tabulky. Pokud budeme měnit přímo cílovou tabulku, pak cílová tabulka nebude odpovídat zdrojovým tabulkám. Můžeme ale nastavit práva tak, aby pouze vlastník tabulky měl právo zápisu do tabulky. Vlastník bude jediný, kdo bude moci modifikovat cílovou tabulku. Ostatní budou moci cílovou tabulku pouze číst. &lt;br /&gt;
&lt;br /&gt;
Trigger se vždy spouští s právy uživatele, který provedl akci spouštějící trigger. Pokud bychom ale odebrali uživatelům práva modifikovat cílovou tabulku, pak by musel selhat INSERT. Naštěstí máme možnost změnit toto chování atributem SECURITY DEFINER. Potom se v těle funkce SQL příkazy provádějí s právy vlastníka funkce, což je v našem případě nutné.&lt;br /&gt;
&lt;br /&gt;
Funkci musíme přiřadit triggeru a tabulce příkazem CREATE TRIGGER. V zásadě můžeme vytvořit dva základní typy: ty které se provádějí před provedením příkazu, který vyvolal trigger, a ty, které se spouštějí po provedení příkazu.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TRIGGER t_zdroj1 &lt;br /&gt;
  BEFORE INSERT OR UPDATE OR DELETE ON zdroj1&lt;br /&gt;
  FOR EACH ROW EXECUTE PROCEDURE trig_build_cil_F();&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER t_zdroj2&lt;br /&gt;
  BEFORE INSERT OR UPDATE OR DELETE ON zdroj2&lt;br /&gt;
  FOR EACH ROW EXECUTE PROCEDURE trig_build_cil_F();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
V některých případech chceme zamezit UPDATE některých sloupců tabulek (většinou se jedná o sloupce typu SERIAL, kde UPDATE nemá smysl). Opět existuje doplněk noupdate, který řeší tento problém, ale který není defaultně nainstalován. Pokud pokusů o UPDATE nebude mnoho, můžeme bez rozpaků použít trigger a krátkou PL/pgSQL proceduru:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DROP SEQUENCE ciselnik_id_seq;&lt;br /&gt;
DROP TABLE ciselnik;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE ciselnik (&lt;br /&gt;
  id SERIAL PRIMARY KEY,&lt;br /&gt;
  popis VARCHAR(100) CHECK (popis &amp;lt;&amp;gt; &#039;&#039;)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION trig_static_id() RETURNS TRIGGER AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  IF TG_OP = &#039;UPDATE&#039; AND NEW.id &amp;lt;&amp;gt; OLD.id THEN&lt;br /&gt;
    RAISE EXCEPTION &#039;You can not update PRIMARY KEY column on table %&#039;, TG_RELNAME;&lt;br /&gt;
  ELSE&lt;br /&gt;
    RETURN NEW;  &lt;br /&gt;
  END IF;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER static_id_ciselnik&lt;br /&gt;
  BEFORE UPDATE ON ciselnik&lt;br /&gt;
  FOR EACH ROW EXECUTE PROCEDURE trig_static_id();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Triggery typu BEFORE se spouští ještě &amp;lt;b&amp;gt;před&amp;lt;/b&amp;gt; vyhodnocením CHECK podmínek sloupců a tabulek. Doménové typy jsou vyhodnocovány ještě před aktivací BEFORE triggerů. Díky tomu máme možnost v funkcích triggerů doplňovat některé chybějící hodnoty a nemáme možnost vyhnout se omezením. Na druhou stranu v triggeru můžeme detekovat hodnoty nevyhovující CHECK podmínkám. Řešením této situace není vyvolat výjimku, ale normálně ukončit provádění triggeru. RDBMS pak při následující kontrole zjistí nevyhovující hodnotu a výjimku vyvolá sám. Pokud je nad jednou tabulkou definováno více triggerů, pak se spouští v abecedním pořadí podle názvu (odchylka od ANSI SQL, zde se spouští v pořadí v kterém byly definovány). &lt;br /&gt;
&lt;br /&gt;
Trigger v PostgreSQL může mít specifikovány i statické parametry - můžeme pak jednu proceduru použít v různých kontextech, atd. Parametry se ovšem nepředávají klasicky prostřednictvím parametrů funkce obsluhující trigger, ale jsou přístupné v externí proměnné TG_ARGV[].&lt;br /&gt;
&lt;br /&gt;
Mějme například požadavek na logování zápisu do tabulkek, kdy hodnotu, která se bude zapisovat do logu, nelze jednoduše odvodit z názvu tabulky. Potřebovali bychom komplikované větvení.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo_a(i integer);&lt;br /&gt;
CREATE TABLE foo_b(i integer);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION trig() RETURNS trigger AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  RAISE NOTICE &#039;Trigger: %,Insert do tabulky: %,Parametr: %&#039;, &lt;br /&gt;
    TG_NAME, TG_RELNAME, TG_ARGV[0];&lt;br /&gt;
  RETURN NULL;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER foo_a_trg AFTER INSERT ON foo_a&lt;br /&gt;
  FOR EACH ROW EXECUTE PROCEDURE trig(&#039;a&#039;);&lt;br /&gt;
CREATE TRIGGER foo_b_trg AFTER INSERT ON foo_b&lt;br /&gt;
  FOR EACH ROW EXECUTE PROCEDURE trig(&#039;b&#039;);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO foo_a VALUES(1);&lt;br /&gt;
INSERT INTO foo_b VALUES(1);&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Vysledkem je hlášení&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
psql:testtr.sql:16: NOTICE:  Trigger: foo_a_trg,Insert do tabulky: foo_a,Parametr: a&lt;br /&gt;
INSERT 336812 1&lt;br /&gt;
psql:testtr.sql:17: NOTICE:  Trigger: foo_b_trg,Insert do tabulky: foo_b,Parametr: b&lt;br /&gt;
INSERT 336813 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Použití PL/pgSQL funkcí s parametry typu tabulka ==&lt;br /&gt;
&lt;br /&gt;
V některých případech potřebujeme spouštět funkci na celý řádek tabulky, např. když potřebujeme nahradit opakující se výraz CASE v příkazu SELECT. Mějme následující tabulky prodejců a prodeje. Tabulka prodeje obsahuje sloupce c1, c2, c3, t2, ot, oec1, oec2, oec3, t1, b1, b2, c050, c150, c300, t1n, t2n, které obsahují počet prodaných kusů v daném tarifu v rámci jednoho prodeje. Tarify jsou stanovené direktivně a nemění se.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE prodejci (&lt;br /&gt;
  id SERIAL PRIMARY KEY,&lt;br /&gt;
  rc VARCHAR(10) NOT NULL UNIQUE CHECK (rc ~ &#039;^[0-9]{9,10}$&#039;),&lt;br /&gt;
  jmeno VARCHAR(20) NOT NULL CHECK (jmeno &amp;lt;&amp;gt; &#039;&#039;),&lt;br /&gt;
  prijmeni VARCHAR(20) NOT NULL CHECK (prijmeni &amp;lt;&amp;gt; &#039;&#039;)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE prodej (&lt;br /&gt;
  id SERIAL PRIMARY KEY,&lt;br /&gt;
  prodejce int REFERENCES prodejci(id),&lt;br /&gt;
  closing_date DATE NOT NULL DEFAULT current_date::DATE,&lt;br /&gt;
  c1   integer NULL CHECK(c1 &amp;gt; 0),&lt;br /&gt;
  c2   integer NULL CHECK(c2 &amp;gt; 0),&lt;br /&gt;
  c3   integer NULL CHECK(c3 &amp;gt; 0),&lt;br /&gt;
  t2   integer NULL CHECK(t2 &amp;gt; 0),&lt;br /&gt;
  ot   integer NULL CHECK(ot &amp;gt; 0),&lt;br /&gt;
  oec1 integer NULL CHECK(oec1 &amp;gt; 0),&lt;br /&gt;
  oec2 integer NULL CHECK(oec2 &amp;gt; 0),&lt;br /&gt;
  oec3 integer NULL CHECK(oec3 &amp;gt; 0),&lt;br /&gt;
  t1   integer NULL CHECK(t1 &amp;gt; 0),&lt;br /&gt;
  b1   integer NULL CHECK(b1 &amp;gt; 0),&lt;br /&gt;
  b2   integer NULL CHECK(b2 &amp;gt; 0),&lt;br /&gt;
  c050 integer NULL CHECK(c050 &amp;gt; 0),&lt;br /&gt;
  c150 integer NULL CHECK(c150 &amp;gt; 0),&lt;br /&gt;
  c300 integer NULL CHECK(c300 &amp;gt; 0),&lt;br /&gt;
  t1n  integer NULL CHECK(t1n &amp;gt; 0),&lt;br /&gt;
  t2n  integer NULL CHECK(t2n &amp;gt; 0)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Zákazník bude požadovat rozpis prodaných kusů, nikoliv však podle jednotlivých tarifů, ale podle celkového počtu kusů rozděleného do tříd podle objemu na jeden provedený prodej. Třídy jsou:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 4, 5 - 9, 10 - 19, 20 - 49, nad 50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Z rozpisu pak mohu určit jednak výši prodeje jedním prodejcem, ale i jeho zaměření na určitý segment trhu. Rozpis můžeme realizovat jako výběr s použitím příkazu CASE (níže), nebo výběr s PL/pgSQL funkcí, která má jako argument řádek tabulky.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION c_prodej_seg (rec prodej, l int,h int) RETURNS integer AS $$&lt;br /&gt;
  DECLARE s INTEGER;&lt;br /&gt;
  BEGIN &lt;br /&gt;
    s := coalesce(rec.c1,0) + coalesce(rec.c2,0) + coalesce(rec.c3,0) + coalesce(rec.t2,0)&lt;br /&gt;
      + coalesce(rec.oec1,0) + coalesce(rec.oec2,0) + coalesce(rec.oec3,0) + coalesce(rec.t1,0)&lt;br /&gt;
      + coalesce(rec.b1,0) + coalesce(rec.b2,0) + coalesce(rec.c150,0) + coalesce(rec.c300,0)&lt;br /&gt;
      + coalesce(rec.t1n,0) + coalesce(rec.t2n,0) + coalesce(rec.ot,0);&lt;br /&gt;
    IF l IS NOT NULL THEN&lt;br /&gt;
      IF s &amp;lt; l THEN RETURN 0; END IF;&lt;br /&gt;
    END IF;&lt;br /&gt;
    IF h IS NOT NULL THEN&lt;br /&gt;
      IF s &amp;gt; h THEN RETURN 0; END IF;&lt;br /&gt;
    END IF;&lt;br /&gt;
    RETURN s;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Použití těchto funkcí zásadně zjednoduší návrh. Funkce c_prodej_seg sečte prodej ve všech tarifech. Pokud je objem prodeje v intervalu určeným druhým a třetím argumentem, pak vrátí tuto hodnotu, jinak vrací nulu. Všimněte si, že (ač trochu nelogicky) první argument funkce je typu tabulka. Ve funkci samotné však s touto hodnotou pracujeme způsobem jako kdyby byla tabulka%ROW.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INSERT INTO prodejci (rc, jmeno, prijmeni) &lt;br /&gt;
  VALUES (&#039;7307150000&#039;,&#039;Pavel&#039;, &#039;Stěhule&#039;);&lt;br /&gt;
INSERT INTO prodejci (rc, jmeno, prijmeni) &lt;br /&gt;
  VALUES (&#039;7807150000&#039;,&#039;Zdeněk&#039;, &#039;Stěhule&#039;);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO prodej (prodejce,c1,c2) VALUES (1,18,11);&lt;br /&gt;
INSERT INTO prodej (prodejce,c1,c2) VALUES (1,18,6);&lt;br /&gt;
INSERT INTO prodej (prodejce,c3,c2) VALUES (1,50,24);&lt;br /&gt;
INSERT INTO prodej (prodejce,t1,c3) VALUES (1,1,1);&lt;br /&gt;
INSERT INTO prodej (prodejce,c300)  VALUES (2,10);&lt;br /&gt;
INSERT INTO prodej (prodejce,c1,c2) VALUES (2,11,2);&lt;br /&gt;
INSERT INTO prodej (prodejce,c1,c2) VALUES (2,1,6);&lt;br /&gt;
INSERT INTO prodej (prodejce,c3,c2) VALUES (2,5,12);&lt;br /&gt;
INSERT INTO prodej (prodejce,t1,ot) VALUES (2,1,1);&lt;br /&gt;
INSERT INTO prodej (prodejce,c300)  VALUES (2,252);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vrací tento dotaz:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &lt;br /&gt;
  SUM(c_prodej_seg(prodej,NULL, 4)) AS lt5,&lt;br /&gt;
  SUM(c_prodej_seg(prodej,5, 9)) AS be5a9,&lt;br /&gt;
  SUM(c_prodej_seg(prodej,10, 19)) AS be10a19,&lt;br /&gt;
  SUM(c_prodej_seg(prodej,20, 49)) AS be20a49,&lt;br /&gt;
  SUM(c_prodej_seg(prodej,50, NULL)) AS ge50,&lt;br /&gt;
  jmeno || &#039; &#039; || prijmeni as prodejce  &lt;br /&gt;
from &lt;br /&gt;
  prodej join prodejci on prodejce = prodejci.id &lt;br /&gt;
group &lt;br /&gt;
  by jmeno || &#039; &#039; || prijmeni ;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
tabulku:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 lt5 | be5a9 | be10a19 | be20a49 | ge50 |    prodejce&lt;br /&gt;
-----+-------+---------+---------+------+----------------&lt;br /&gt;
   2 |     0 |       0 |      53 |   74 | Pavel Stěhule&lt;br /&gt;
   2 |     7 |      40 |       0 |  252 | Zdeněk Stěhule&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Funkce vracející tabulky ==&lt;br /&gt;
&lt;br /&gt;
Jednotlivé řádky vytvoříme opakovaným voláním RETURN NEXT hodnota (tato varianta RETURNu neukončí funkci) a voláním RETURNu bez parametrů, kterým ukončíme provádění funkce. Jako navratový typ můžeme použít skalární typy, typy tabulka nebo složené typy (ty jsou víceméně ekvivalentem typu tabulka (vytvoříme je příkazem CREATE TYPE)). Pokud nechceme definovat nový typ, můžeme použít OUT parametry (RETURNS SETOF RECORD).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TYPE tf AS (f1 varchar(10), f2 varchar(10));&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION makesettf(mx integer) RETURNS SETOF tf AS $$&lt;br /&gt;
  DECLARE f tf%ROWTYPE;&lt;br /&gt;
  BEGIN&lt;br /&gt;
    FOR i IN 1..mx LOOP&lt;br /&gt;
      f.f1 := CAST(i AS varchar(10));&lt;br /&gt;
      f.f2 := &#039;bbbbb &#039;||CAST(i AS varchar(10));&lt;br /&gt;
      RAISE NOTICE &#039;%&#039;, f.f1;&lt;br /&gt;
      RETURN NEXT f;&lt;br /&gt;
    END LOOP;&lt;br /&gt;
    RETURN;&lt;br /&gt;
  END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
SELECT a.*, b.* FROM &lt;br /&gt;
  makesettf(10) a JOIN makesettf(5) b ON a.f1 = b.f1;&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM makesettf(3) UNION ALL SELECT * FROM makesettf(8);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Praktičtějším příkladem, inspirován UDF Firebirdu (vracela tabulku konání německých pivních festivalů), je použítí SRF při návrhu funkcí pro určení dne získané přičtením n pracovních dnů k zadanému dni.&lt;br /&gt;
&lt;br /&gt;
SRF funkce se hodí pro generování menších dynamických (parametrizovatelných) tabulek, jelikož jimi vytvořené tabulky nelze indexovat. Toto omezení přeneseme lehce přez srdce při testování. Mnou vytvořené funkce AddWDays a AddWDays2 jsem kontroloval porovnáním hodnot (každá funkce je jinak implementována, musí dávat shodné výsledky) nad fiktivní tabulkou vytvořenou spojením tabulek vytvořených SRF funkcemi.&lt;br /&gt;
&lt;br /&gt;
Funkce DaysInYear vrací tabulku dní v daném roce, fce. Seq vrací celočíselnou posloupnost omezenou parametrem. Funkce AddWDays a AddWDays2 má dva parametry - první den, ke kterému se mají přičítat pracovní dny, počet je určen druhým parametrem). Funkce DiffWDays vrací počet pracovních dnů v intervalu určeného parametry. Pokud jsou všechny funkce správně navržené, pak výsledkem testovacích dotazů musí být prázdná tabulka.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION DaysInYear(y integer) RETURNS SETOF date AS $$&lt;br /&gt;
DECLARE st date;&lt;br /&gt;
BEGIN st := to_date(&#039;0101&#039;||y,&#039;MMDDYYYY&#039;);&lt;br /&gt;
  WHILE EXTRACT(year FROM st) &amp;lt; y + 1 LOOP&lt;br /&gt;
    RETURN NEXT st;&lt;br /&gt;
    st := st + 1;&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  RETURN;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
-- testy&lt;br /&gt;
SELECT DaysInYear, generate_series FROM DaysInYear(2003) CROSS JOIN generate_series(1,40) &lt;br /&gt;
  WHERE AddWDays(DaysInYear, generate_series) &amp;lt;&amp;gt; AddWDays2(DaysInYear, generate_series);&lt;br /&gt;
SELECT DaysInYear, generate_series FROM DaysInYear(2003) CROSS JOIN generate_series(1,40) &lt;br /&gt;
  WHERE DiffWDays(DaysInYear, AddWDays(DaysInYear, generate_series)) &amp;lt;&amp;gt; generate_series;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Státních svátků nemáme mnoho, nicméně pro každý rok jsou trochu jiné (díky velikonocím), a tak se pro generování tabulky hodí dobře SRF. Pokud by nastaly problémy s výkonem, mohu tabulku materializovat, tj. příkazem SELECT INTO uložit do klasické tabulky. Funkce StátníSvátky vrací tabulku se státními svátky, včetně názvu pro rozsah daný prvním a druhým parametrem. Funkce PočetStatníchSvátků spočítá počet, vyřadí dny předané v poli jako třetí parametr (prakticky vždy se bude jednat o sobotu a neděli - {6, 7}). Za povšimnutí stojí snad jen způsob zápisu porovnání hodnoty s obsahem pole = ANY(). Test &amp;lt;&amp;gt;ALL() může způsobit záludnou chybu - v případě, že je pole prázdné, pak je cokoliv &amp;lt;&amp;gt; ALL() vždy splněno.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION StatniSvatky(start date, finish date, OUT termin date, OUT nazev varchar(50)) &lt;br /&gt;
  RETURNS SETOF RECORD  AS $$&lt;br /&gt;
DECLARE &lt;br /&gt;
  svatek VARCHAR [][] DEFAULT ARRAY&lt;br /&gt;
   [[&#039;Nový rok&#039;, &#039;0101&#039;], &lt;br /&gt;
    [&#039;Neděle velikonoční&#039;, &#039;xx&#039;],&lt;br /&gt;
    [&#039;Pondělí velikonoční&#039;,&#039;x1&#039;], &lt;br /&gt;
    [&#039;Svátek práce&#039;,&#039;0501&#039;],&lt;br /&gt;
    [&#039;Den osvobození&#039;,&#039;0508&#039;], &lt;br /&gt;
    [&#039;Den slovanských věrozvěstů Cyrila a Metoděje&#039;,&#039;0705&#039;],&lt;br /&gt;
    [&#039;Den upálení mistra Jana Husa&#039;,&#039;0706&#039;], &lt;br /&gt;
    [&#039;Den české státnosti&#039;,&#039;0928&#039;],&lt;br /&gt;
    [&#039;Den vzniku samostatného československého státu&#039;, &#039;1028&#039;],&lt;br /&gt;
    [&#039;Den boje za svobodu a demokracii&#039;,&#039;1117&#039;],&lt;br /&gt;
    [&#039;Štědrý den&#039;,&#039;1224&#039;],&lt;br /&gt;
    [&#039;1. svátek vánoční&#039;,&#039;1225&#039;],&lt;br /&gt;
    [&#039;2. svátek vánoční&#039;,&#039;1226&#039;]];&lt;br /&gt;
  rok integer; stepd date; d varchar;&lt;br /&gt;
BEGIN stepd := start;&lt;br /&gt;
  WHILE stepd &amp;lt;= finish LOOP&lt;br /&gt;
    rok := CAST(EXTRACT(year FROM stepd) AS INTEGER);&lt;br /&gt;
    FOR i IN array_lower(svatek,1)..array_upper(svatek,1) LOOP&lt;br /&gt;
      d := svatek[i][2];&lt;br /&gt;
      IF d = &#039;xx&#039; THEN&lt;br /&gt;
        termin := velnedele(rok);&lt;br /&gt;
      ELSIF d = &#039;x1&#039; THEN&lt;br /&gt;
        termin := velnedele(rok) + 1;&lt;br /&gt;
      ELSE&lt;br /&gt;
        termin := to_date(d||rok,&#039;MMDDYYYY&#039;);&lt;br /&gt;
      END IF;&lt;br /&gt;
      IF termin BETWEEN stepd AND finish THEN&lt;br /&gt;
        nazev := svatek[i][1]; RETURN NEXT;&lt;br /&gt;
      END IF;&lt;br /&gt;
    END LOOP;&lt;br /&gt;
    stepd := date_trunc(&#039;year&#039;, stepd) + interval &#039;1 year&#039;;&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  RETURN;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION PocetStatnichSvatku(start date, finish date, nwd INTEGER[]) RETURNS INTEGER AS $$&lt;br /&gt;
DECLARE &lt;br /&gt;
  svatek VARCHAR [] DEFAULT ARRAY&lt;br /&gt;
   [&#039;0101&#039;, &#039;xx&#039;, &#039;x1&#039;, &#039;0501&#039;, &#039;0508&#039;, &#039;0705&#039;, &#039;0706&#039;, &lt;br /&gt;
    &#039;0928&#039;, &#039;1028&#039;, &#039;1117&#039;, &#039;1224&#039;, &#039;1225&#039;, &#039;1226&#039;];&lt;br /&gt;
  rok INTEGER; stepd date; d varchar; sv date; pss INTEGER DEFAULT 0;  OM INTEGER;&lt;br /&gt;
BEGIN stepd := start;&lt;br /&gt;
  WHILE stepd &amp;lt;= finish LOOP&lt;br /&gt;
    rok := CAST(EXTRACT(year FROM stepd) AS INTEGER);&lt;br /&gt;
    FOR i IN array_lower(svatek,1)..array_upper(svatek,1) LOOP&lt;br /&gt;
      d := svatek[i];&lt;br /&gt;
      IF d = &#039;xx&#039; THEN&lt;br /&gt;
        sv := velnedele(rok);&lt;br /&gt;
      ELSIF d = &#039;x1&#039; THEN&lt;br /&gt;
        sv := velnedele(rok) + 1;&lt;br /&gt;
      ELSE&lt;br /&gt;
        sv := to_date(d||rok,&#039;MMDDYYYY&#039;);&lt;br /&gt;
      END IF;&lt;br /&gt;
      IF NOT EXTRACT(dow FROM sv) = ANY (nwd) THEN&lt;br /&gt;
        IF sv BETWEEN stepd AND finish THEN&lt;br /&gt;
          pss := pss + 1;&lt;br /&gt;
        END IF;&lt;br /&gt;
      END IF;&lt;br /&gt;
    END LOOP;&lt;br /&gt;
    stepd := date_trunc(&#039;year&#039;, stepd) + interval &#039;1 year&#039;;&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  RETURN pss;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Funkce AddWDays2 je jednodušší, pro menší počet dnů pravděpodobně i rychlejší. Do proměnné svatky uložím pole svátků na rok od dne, ke kterému přičítám pracovní dny. Funkce StatniSvatky vrací tabulku a tak je nutné převést tabulku na pole konstrukcí ARRAY(SELECT FROM). Pak pro každý pracovní den (není sobotou, nedělí a svátkem) snižuji počet pracovních dnů a posouvám se dopředu.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION AddWDaysSlow2(start date, c integer) RETURNS date AS $$&lt;br /&gt;
DECLARE st date = start; ed date; svatky date[]; d integer = c; k integer;&lt;br /&gt;
BEGIN ed := st + 365;&lt;br /&gt;
  SELECT INTO svatky ARRAY(SELECT termin FROM StatniSvatky(st, ed));&lt;br /&gt;
  LOOP k := CAST(EXTRACT(DOW FROM st) AS INTEGER);&lt;br /&gt;
    WHILE k = 6 OR k = 0 OR st = ANY(svatky) LOOP&lt;br /&gt;
      st := st + 1; k := CAST(EXTRACT(DOW FROM st) AS INTEGER);&lt;br /&gt;
      IF st &amp;gt; ed THEN ed = st + 365; &lt;br /&gt;
        SELECT INTO svatky ARRAY(SELECT termin FROM StatniSvatky(st, ed));&lt;br /&gt;
      END IF;&lt;br /&gt;
    END LOOP;&lt;br /&gt;
    EXIT WHEN d = 0 OR d = 1;&lt;br /&gt;
    st := st + 1; d := d - 1;&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  RETURN st;&lt;br /&gt;
END; &lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Druhá (první) funkce AddWDays je komplikovanější, a pro delší intervaly rozhodně rychlejší. Využívá funkce AddWDay, která k počtu pracovních dní přičte x dní za víkendy. Pak se opakovaně zjišťuje korekce vůči státním svátkům. Pokud je parametrem AddWDay víkendový den, pak se nejdříve posune na pondělí. Pak probíhá jakási normalizace, posouvám se zpět na neděli, o to co se posunu zpět zvýším počet pracovních dní. Pak mohu jednoduše převést pracovní dny na skutečné (předposlední řádek funkce).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION AddWDays(start date, c integer) RETURNS date AS $$&lt;br /&gt;
DECLARE st date = start; ed DATE; korekce INTEGER; sv INTEGER; d INTEGER;&lt;br /&gt;
BEGIN ed := AddWDay(st,c);&lt;br /&gt;
  korekce = PocetStatnichSvatku(st, ed, ARRAY[6,0]); &lt;br /&gt;
  WHILE korekce &amp;gt; 0 LOOP&lt;br /&gt;
    st := ed + 1; ed := AddWDay(st, korekce); &lt;br /&gt;
    korekce =  PocetStatnichSvatku(st, ed, ARRAY[6,0]);&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  RETURN FirstWDay(ed);&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION AddWDay(d date, c integer) RETURNS date AS $$&lt;br /&gt;
DECLARE st DATE; wd INTEGER; k INTEGER;&lt;br /&gt;
BEGIN k := CAST(EXTRACT(DOW FROM d) AS INTEGER);&lt;br /&gt;
  IF k = 0 THEN st := d + 1; k := 1;&lt;br /&gt;
  ELSIF k = 6 THEN st := d + 2; k := 1;&lt;br /&gt;
  ELSE st := d; END IF;&lt;br /&gt;
  st := st - k; wd := c + k - 2;&lt;br /&gt;
  st := st + ((wd) / 5) * 7  + ((wd) % 5) + 1;&lt;br /&gt;
  RETURN st;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Pokud je první parametr funkce DiffWDays sobota nebo neděle, posunu začátek na pondělí, pokud je druhým parametrem sobota nebo neděle, posunu konec na pátek. Pokud je začátek za koncem, musím zvýšit počet týdnů. V daném intervalu ještě odečtu počet státních svátků. Funkce ISODOW vrací ISO číslo dne, tj. sobota 6, neděle 7.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION ISODOW(date) RETURNS INTEGER AS $$&lt;br /&gt;
  SELECT CAST(EXTRACT(DOW FROM $1 - 1) + 1 AS INTEGER);&lt;br /&gt;
$$ LANGUAGE sql STRICT;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION DiffWDays(d1 date, d2 date) RETURNS integer AS $$&lt;br /&gt;
DECLARE wc INTEGER; st DATE; ED DATE; p INTEGER;&lt;br /&gt;
BEGIN &lt;br /&gt;
  p := ISODOW(d1); IF p &amp;gt; 5 THEN st := d1 + (8 - p); ELSE st := d1; END IF;&lt;br /&gt;
  p := ISODOW(d2); IF p &amp;gt; 5 THEN ed := d2 - (p - 5); ELSE ed := d2; END IF;&lt;br /&gt;
  wc := (d2 - d1) / 7;&lt;br /&gt;
  IF EXTRACT(DOW FROM st - 1) + 1 &amp;gt; EXTRACT(DOW FROM ed - 1) + 1 THEN&lt;br /&gt;
    wc := wc + 1;&lt;br /&gt;
  END IF;&lt;br /&gt;
  RETURN (d2 - d1 - (wc * 2) - PocetStatnichSvatku(st,ed, ARRAY[6,7]) + 1);&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE STRICT;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rekurzivní volání SRF funkcí ==&lt;br /&gt;
&lt;br /&gt;
Každé volání SRF funkce má svůj vlastní tzv. kontext, do něhož se zapisuje množina vracených hodnot. Tato vlastnost se projeví pouze při rekurzivním volání SRF funkcí, kdy při chybně navržené funkci, budeme mít pocit, že se nám ztrácí výsledky. Příklad takto chybné funkce je:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION foo (pid integer) RETURNS SETOF foo AS $$&lt;br /&gt;
  DECLARE rec RECORD;&lt;br /&gt;
BEGIN&lt;br /&gt;
  FOR rec IN SELECT * FROM foo WHERE foo.pid=pid LOOP&lt;br /&gt;
    RETURN NEXT rec;&lt;br /&gt;
    RAISE NOTICE &#039;uid=% pid=%&#039;,rec.uid,rec.pid;&lt;br /&gt;
    SELECT INTO rec * FROM foo (rec.uid);&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  RETURN;&lt;br /&gt;
END; &lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Chybná je doměnka, že volání select into rec * from foo() způsobí přenesení hodnot vnořené funkce. Správný tvar funkce foo je tento:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION foor (pid integer) RETURNS SETOF foo AS $$&lt;br /&gt;
DECLARE rec RECORD; fo bool;&lt;br /&gt;
BEGIN&lt;br /&gt;
  FOR rec IN SELECT * FROM foo WHERE foo.pid=pid LOOP&lt;br /&gt;
    RETURN NEXT rec;&lt;br /&gt;
    FOR rec IN SELECT * FROM foor (rec.uid) LOOP&lt;br /&gt;
      RETURN NEXT rec;&lt;br /&gt;
    END LOOP;&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  RETURN;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Počínaje PostgreSQL 8.4 lze řadu rekurzivních volání SRF funkcí nahradit rekurzivním SELECTem, případně použít efektivnější příkaz RETURN QUERY:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
WITH RECURSIVE x AS (SELECT * &lt;br /&gt;
                        FROM foo &lt;br /&gt;
                       WHERE uid = 3 -- find a root&lt;br /&gt;
                     UNION ALL&lt;br /&gt;
                     SELECT foo.* &lt;br /&gt;
                        FROM foo &lt;br /&gt;
                             JOIN &lt;br /&gt;
                             x&lt;br /&gt;
                             ON x.uid = foo.pid) -- append rows where pid is same as some searched uid  &lt;br /&gt;
   SELECT * FROM x; -- show content of stacked table x without changes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Rekurzivní příkaz by měl být téměř vždy rychlejší než rekurzivní volání funkce.&lt;br /&gt;
&lt;br /&gt;
== Návrh polymorfních funkcí, používání polymorfních typů ==&lt;br /&gt;
&lt;br /&gt;
Polymorfní funkce jsou ty, které při definici návratového typu nebo argumentů používají některý z následujících polymorfních typů: anyarray, anyelement.&lt;br /&gt;
&lt;br /&gt;
Pokud funkce vrací polymorfní typ, pak alespoň jeden z argumentů funkce musí být polymorfního typu. Dynamicky se určí návratový typ funkce podle aktuálního typu tohoto argumentu. Pokud funkce obsahuje více parametrů typu anyelement, pak skutečné parametry musí být stejného typu. Stejná podmínka platí pro anyarray.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION polyfoo1(a anyelement) RETURNS anyelement AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  RETURN  a + 1;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
testdb011=&amp;gt; select polyfoo1(date &#039;1.1.2004&#039;), polyfoo1(10);&lt;br /&gt;
  polyfoo1  | polyfoo1&lt;br /&gt;
------------+----------&lt;br /&gt;
 2004-01-02 |       11&lt;br /&gt;
(1 řádka)&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION polyfoo2(a anyelement, b anyelement) RETURNS integer AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  RETURN  a - b;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
testdb011=&amp;gt; select polyfoo2(date &#039;1.1.2004&#039;,date &#039;1.2.2003&#039;);&lt;br /&gt;
 polyfoo2 &lt;br /&gt;
----------&lt;br /&gt;
      334&lt;br /&gt;
(1 řádka)&lt;br /&gt;
&lt;br /&gt;
Time: 4,158 ms&lt;br /&gt;
testdb011=&amp;gt; select polyfoo2(20,10);&lt;br /&gt;
 polyfoo2 &lt;br /&gt;
----------&lt;br /&gt;
       10&lt;br /&gt;
(1 řádka)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Příkladem použití polymorfní funkce je tělo agregační funkce jejíž výsledkem je pole hodnot podmnožiny.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION aggregate_array(state ANYARRAY, a ANYELEMENT) RETURNS ANYARRAY AS $$&lt;br /&gt;
   SELECT CASE&lt;br /&gt;
     WHEN state IS NULL THEN ARRAY[a]&lt;br /&gt;
     WHEN a IS NULL THEN state&lt;br /&gt;
     ELSE array_append(state,a)&lt;br /&gt;
 END;&lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&lt;br /&gt;
testdb011=&amp;gt; SELECT count(*), aggarray(prijmeni) FROM lide GROUP BY prijmeni ~ &#039;.*á&#039;;&lt;br /&gt;
&lt;br /&gt;
 count |                  aggarray&lt;br /&gt;
-------+---------------------------------------------&lt;br /&gt;
     1 | {Gregorová}&lt;br /&gt;
     6 | {Kolík,Čurda,Hojka,Chytlík,Stěhule,Novotný}&lt;br /&gt;
(2 řádek)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Polymorfní funkce se někdy také označují jako generické. Interně PostgreSQL nezná žádný datový typ ANYELEMENT. PostgreSQL vždy, když požadujete aktivaci nějaké funkce zjišťuje, zda-li neexistuje připravený kód pro požadovanou funkci (testuje shodu na počet a typ argumentů). Pokud ještě funkce nebyla spuštěna, hledá její zdrojový kód a přípravuje funkci pro její první spuštění. Pokud nalezne shodu s polymorfní funkcí, pak nahradí neznámé typy požadovanými a připraví funkci, kde už jsou všechny parametry určené - využívá se standardní mechanismus.&lt;br /&gt;
&lt;br /&gt;
Pokud potřebujeme identifikovat variantu polymorfní funkce, můžeme použít operátor IS OF.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  IF a IS OF (INTEGER) THEN&lt;br /&gt;
    RAISE NOTICE &#039;Parametr a je cele cislo&#039;;&lt;br /&gt;
  ELSIF a IS OF (varchar) THEN&lt;br /&gt;
    RAISE NOTICE &#039;Parametr a je retezec&#039;;&lt;br /&gt;
  END IF;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PL/pgSQL funkce s (IN)OUT parametry ==&lt;br /&gt;
PL/pgSQL je specifický tím, že podporuje pouze návrh funkcí, nikoliv procedur. Hlavní rozdíl mezi procedurou a funkcí je způsob předání výsledné hodnoty. Klasicky procedura vrací výsledek prostřednictvím proměnných předávaných referencí.  Problém je v tom, že vyjma prostředí PL/pgSQL PostgreSQL nepodporuje proměnné. V starších verzích PostgreSQL jsme museli použít složený typ, když jsme potřebovali získat z kódu víc jak jednu hodnotu. Aktuální verze PostgreSQL podporují OUT proměnné, čímž nám šetří práci s deklarací speciáního out typu.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION foo(IN a int, IN b int, OUT aa int, OUT bb int) AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  aa := a*a;&lt;br /&gt;
  bb := b*b;&lt;br /&gt;
END&lt;br /&gt;
$$&lt;br /&gt;
&lt;br /&gt;
SELECT foo(10,10);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Přidáno v PostgreSQL 8.3==&lt;br /&gt;
Předchozí verze neumožňovaly vrátit množinu záznamů jako výsledek SRF funkce. Jediným řešením bylo volání příkazu RETURN NEXT pro každý řádek výsledku dotazu. V podstatě totéž (ale na nižší úrovni, tudíž efektivněji) provádí příkaz RETURN QUERY. Jeho parametrem je SQL dotaz. Výsledek tohoto dotazu (množina) se připojí k výstupu. Podobně jako RETURN NEXT neukončuje provádění funkce. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION dirty_series(m integer, n integer) &lt;br /&gt;
RETURNS SETOF integer AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  RETURN QUERY SELECT * FROM generate_series(1,m) g(i)&lt;br /&gt;
                 WHERE i % n = 0;&lt;br /&gt;
  RETURN;&lt;br /&gt;
END; $$ LANGUAGE plpgsq;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Další novou vlastností je lokální přenastavení (pouze pro konkrétní funkci) systémových proměnných. Podobně se chová T-SQL nebo MySQL, kde se implicitně ukládá aktuální nastavení systémových proměnných v čase registrace funkce. V PostgreSQL dosud podobný mechanismus nebyl. Lokálním přenastavením systémové proměnné search_path (resetem) lze konečně zabezpečit SECURITY DEFINER funkce. Zápis je zřejmý z následujícího příkladu:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE FUNCTION report_guc(text) RETURNS TEXT AS&lt;br /&gt;
  $$ SELECT current_setting($1) $$ LANGUAGE sql&lt;br /&gt;
  SET regex_flavor = basic;&lt;br /&gt;
&lt;br /&gt;
ALTER FUNCTION report_guc(text) &lt;br /&gt;
  RESET search_path &lt;br /&gt;
  SET regex_flavor = extended;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Přidáno v PostgreSQL 8.4==&lt;br /&gt;
Doposud bylo používání dynamického SQL limitováno možným rizikem SQL injektáže. Kromě toho také docela nečitelným výsledným kódem. Tyto problémy z části odstraňuje klauzule USING v příkazu PL/pgSQL EXECUTE. Díky ní totiž můžeme parametrizovat SQL příkaz, podobně jako v PREPARED STATEMENTS.&lt;br /&gt;
&lt;br /&gt;
nezabezpečené dynamické SQL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXECUTE &#039;SELECT * FROM &#039; || tabname || &#039; WHERE value = \&#039;&#039; || value || &#039;\&#039;&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
zabezpečené dynamické SQL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXECUTE &#039;SELECT * FROM &#039; || tabname::regclass || &#039; WHERE value = $1&#039; USING value;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Díky klauzuli USING bude použití dynamického SQL o dost bezpečnější a o bude s ním méně práce. I tak ale platí, že DSQL by se mělo používat, pokud možno co nejméně a v opravdu nutných případech (např. z důvodu nutnosti generování prováděcího plánu se znalostí parametrů).&lt;br /&gt;
&lt;br /&gt;
===Příkaz CASE===&lt;br /&gt;
Z prostředí SQL/PSM (standardizovaný jazyk pro uložené procedury dle ANSI - setkat se s ním můžete v DB2 nebo MySQL) byla převzata syntaxe příkazu CASE.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/* simple case */&lt;br /&gt;
CASE x&lt;br /&gt;
    WHEN 1, 2 THEN&lt;br /&gt;
         msg := &#039;one or two&#039;;&lt;br /&gt;
    ELSE&lt;br /&gt;
         msg := &#039;other value than one or two&#039;;&lt;br /&gt;
END CASE;&lt;br /&gt;
&lt;br /&gt;
/* search case */&lt;br /&gt;
CASE&lt;br /&gt;
    WHEN x BETWEEN 0 AND 10 THEN&lt;br /&gt;
         msg := &#039;value is between zero and ten&#039;;&lt;br /&gt;
    WHEN x BETWEEN 11 AND 20 THEN&lt;br /&gt;
         msg := &#039;value is between eleven and twenty&#039;;&lt;br /&gt;
END CASE;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Vlastní výjimky===&lt;br /&gt;
PostgreSQL umožňuje předat ve výjimce relativně dost informací. Bohužel PL/pgSQL příkaz RAISE byl příliš jednoduchý - výsledkem výjimky v PL/pgSQL byl pouze jeden řetězec (nebylo možné zadat kód, hint, detail). Toto omezení je minulostí. Syntaxe příkazu RAISE byla rozšířena tak, aby umožnila specifikovat všechny dostupné parametry výjimky:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RAISE division_by_zero;&lt;br /&gt;
RAISE SQLSTATE &#039;22012&#039;;&lt;br /&gt;
RAISE EXCEPTION &#039;Nonexistent ID --&amp;gt; %&#039;, user_id&lt;br /&gt;
   USING HINT = &#039;Please check your user id&#039;;&lt;br /&gt;
RAISE &#039;Duplicate user ID: %&#039;, user_id&lt;br /&gt;
   USING ERRCODE = &#039;unique_violation&#039;;&lt;br /&gt;
RAISE &#039;Duplicate user ID: %&#039;, user_id&lt;br /&gt;
   USING ERRCODE = &#039;23505&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Vlastní vyjímky lze samozřejmě zachytit - v minulých verzích bylo možné zachytit pouze pojmenované výjimky:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
BEGIN&lt;br /&gt;
   ...&lt;br /&gt;
EXCEPTION&lt;br /&gt;
  WHEN SQLSTATE &#039;22012&#039; THEN ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Variadické funkce===&lt;br /&gt;
Funkce, které pracují s variabilním počtem parametrů označujeme jako variadické. Mezi variadické funkce např. patří funkce least, greatest, coalesce. Implementace těchto funkcí není nijak zvlášť komplikovaná, nicméně není triviální a trochu vypadává z kontextu C funkcí (vynucuje si úpravy parseru). Na uživatelské úrovni nezbývalo než přetěžovat funkce, což zase vedlo k zbytečnému duplikování kódu. Řešením je zavedení tzv. variadických funkcí, resp. modifikátoru VARIADIC v seznamu parametrů. Ten pozměňuje chování parseru. Všechny reálné parametry, které jsou pozičně na pozici a za pozicí variadického parametru jsou sloučeny do pole, které je pak předáno funkci.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE FUNCTION myleast(VARIADIC a numeric[])&lt;br /&gt;
 RETURNS NUMERIC AS $$&lt;br /&gt;
   SELECT min($1[i])&lt;br /&gt;
      FROM generate_subscripts($1,1) g(i)&lt;br /&gt;
 $$ LANGUAGE SQL IMMUTABLE;&lt;br /&gt;
CREATE FUNCTION&lt;br /&gt;
Time: 5,274 ms&lt;br /&gt;
postgres=# SELECT myleast(1,2,3,4);&lt;br /&gt;
 myleast&lt;br /&gt;
---------&lt;br /&gt;
        1&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Variadické funkci lze předhodit i pole (tj. obejít parser) pomocí modifikátoru hodnoty VARIADIC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# SELECT myleast(VARIADIC ARRAY[1,3,4,-5,6,8]);&lt;br /&gt;
 myleast&lt;br /&gt;
---------&lt;br /&gt;
      -5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Tabulkové funkce===&lt;br /&gt;
Funkce, které vrací tabulku, jsou podle ANSI SQL tzv. tabulkové funkce. Totéž (s mírně odlišnou syntaxí) se v PostgreSQL označuje jako SRF funkce (Set Returned Functions). Do 8.4 byla zahrnuta i podpora ANSI SQL syntaxe, která je podle mého názoru přehlednější a názornější:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--ANSI SQL &lt;br /&gt;
create or replace function tab(i int)&lt;br /&gt;
returns table(a int, b int) as $$&lt;br /&gt;
  select i, i+1 &lt;br /&gt;
     from generate_series(1, $1) g(i);&lt;br /&gt;
$$ language sql immutable strict;&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT * FROM tab(2);&lt;br /&gt;
 a | b &lt;br /&gt;
---+---&lt;br /&gt;
 1 | 2&lt;br /&gt;
 2 | 3&lt;br /&gt;
(2 rows)&lt;br /&gt;
&lt;br /&gt;
-- PostgreSQL syntaxe&lt;br /&gt;
create or replace function tab(in int, out a int, out b int)&lt;br /&gt;
returns setof record as $$&lt;br /&gt;
  select i, i+1 &lt;br /&gt;
     from generate_series(1, $1) g(i);&lt;br /&gt;
$$ language sql immutable strict;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Defaultní hodnoty parametrů funkce===&lt;br /&gt;
Možnost definovat defaultní hodnoty parametrů funkce patří zvyšuje programátorský komfort a snižuje duplicitu kódu. Implementace zatím odpovídá zhruba implementaci ve Firebirdu, tj. chybějící parametry se zprava doplňují defaultní hodnoty. &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# create or replace function instr(varchar, varchar, int = 1) &lt;br /&gt;
           returns int as $$&lt;br /&gt;
              select position($2 in substring($1 from $3)); &lt;br /&gt;
           $$ language sql immutable strict;&lt;br /&gt;
CREATE FUNCTION&lt;br /&gt;
Time: 2,738 ms&lt;br /&gt;
postgres=# SELECT instr(&#039;abcabc&#039;,&#039;a&#039;);&lt;br /&gt;
 instr &lt;br /&gt;
-------&lt;br /&gt;
     1&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
Time: 1,907 ms&lt;br /&gt;
postgres=# SELECT instr(&#039;abcabc&#039;,&#039;a&#039;,2);&lt;br /&gt;
 instr &lt;br /&gt;
-------&lt;br /&gt;
     3&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
Time: 1,381 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===RETURN QUERY EXECUTE===&lt;br /&gt;
RETURN QUERY se docela ujalo, což mne příjemně překvapilo. Jednak jsem vůbec nečekal, že by podobné rozšíření mohlo projít do core, jednak vlastní implementace byla docela jednoduchá - v podstatě pár nových řádek v parseru - jinak se použil stávající kód. To je to, co mne na hackingu nejvíc baví. Přidá se pár řádků, pár řádků kódu se upraví a nová funkce je na světě.&lt;br /&gt;
&lt;br /&gt;
V 8.4 RETURN QUERY podporuje také dynamické SQL - tj. zčásti odpadá stereotyp:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FOR r IN EXECUTE &#039;....&#039; LOOP&lt;br /&gt;
  RETURN NEXT r;&lt;br /&gt;
END LOOP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
který lze nahradit rychlejším a čitelnějším kódem:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RETURN QUERY EXECUTE &#039;...&#039;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Přidáno v 9.0==&lt;br /&gt;
V devítce došlo k zásadnímu překopání parseru PL/pgSQL. Díky tomu se trochu mění chování prostředí. Zásadní změnou je možnost rozpoznat kolizi identifikátorů plpgsql a SQL. Jedinou významnou novinkou je tzv. jmenné konvence předávání hodnot parametrů - ostatní změny jazyka jsou více-méně kosmetické. Počínaje 9.0 jsou k dispozici i sloupcové a podmíněné triggery, které ovšem s plpgsql přímo nesouvisí (stejně jako jmenná konvence).&lt;br /&gt;
&lt;br /&gt;
===Režim řešení kolizí identifikátorů===&lt;br /&gt;
Zásadním nedostatkem syntaktické kontroly plpgsql byla neschopnost odhalit kolizi SQL a PLpgSQL identifikátorů. Kód obsahující kolizní identifikátory málokdy fungoval správně - a to ještě spíš omylem - nicméně nehlásil chybu. Od verze 9.0 je kontrolována unikátnost identifikátorů v bloku:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION foo() &lt;br /&gt;
RETURNS void AS $$&lt;br /&gt;
DECLARE a integer;                                              &lt;br /&gt;
BEGIN              &lt;br /&gt;
  FOR a IN SELECT a FROM omega &lt;br /&gt;
  LOOP                         &lt;br /&gt;
    RAISE NOTICE &#039;%&#039;, a;&lt;br /&gt;
  END LOOP; &lt;br /&gt;
END; &lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
CREATE FUNCTION&lt;br /&gt;
Time: 3,501 ms&lt;br /&gt;
postgres=# SELECT foo();&lt;br /&gt;
ERROR:  column reference &amp;quot;a&amp;quot; is ambiguous&lt;br /&gt;
LINE 1: SELECT a FROM omega&lt;br /&gt;
               ^&lt;br /&gt;
DETAIL:  It could refer to either a PL/pgSQL variable or a table column.&lt;br /&gt;
QUERY:  SELECT a FROM omega&lt;br /&gt;
CONTEXT:  PL/pgSQL function &amp;quot;foo&amp;quot; line 3 at FOR over SELECT rows&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Jmenná konvence předávání parametrů===&lt;br /&gt;
Tato změna se týká všech PL jazyků v PostgreSQL. Obvyklý způsob předávání parametrů je poziční. Parametry funkce se plní hodnotami na základě shodné pozice. Kromě této notace (způsobu předávání) existují notace jmenná a kombinovaná (použím terminologii jazyka ADA - positional, named and mixed notation).  V Pg se pro pojmenovanné parametry používá zápis: název_parametru := hodnota (pozn. tento zápis je definitivní a bude trvale podporovaný, nicméně není ve shodě s připravovanou ANSI SQL 2011, proto v příští verzi přibude zápis název_parametru =&amp;gt; hodnota. Tento zápis v 9.0 nemohl být zaveden z důvodu kolize s modulem hstore):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION foo(a varchar, b varchar)&lt;br /&gt;
RETURNS void AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  RAISE NOTICE &#039;A:% B:%&#039;, a, b;&lt;br /&gt;
  RETURN;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
SELECT foo(&#039;Ahoj&#039;,&#039;Svete&#039;);&lt;br /&gt;
SELECT foo(&#039;Ahoj&#039;, b := &#039;Svete&#039;); -- kombinovaná notace&lt;br /&gt;
SELECT foo(b := &#039;Svete&#039;, a := &#039;Ahoj&#039;);  -- jmenná notace&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Ostatní změny===&lt;br /&gt;
*V této verzi došlo ke zrušení omezení zápisu do proměnných odpovídajících IN parametrům funkce.&lt;br /&gt;
*&#039;&#039;&#039;Jazyk &amp;lt;i&amp;gt;PL/pgSQL&amp;lt;/i&amp;gt; je dostupný ihned po instalaci&#039;&#039;&#039;&lt;br /&gt;
==Přidáno v 9.1==&lt;br /&gt;
===cyklus FOREACH=== &lt;br /&gt;
pomocí cyklu FOREACH můžeme jednoduše a efektivně iterovat přes prvky pole. S klauzulí SLICE lze jednoduše pracovat i s vícerozměrnými poly:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.ft()&lt;br /&gt;
 RETURNS void&lt;br /&gt;
 LANGUAGE plpgsql&lt;br /&gt;
AS $function$&lt;br /&gt;
DECLARE&lt;br /&gt;
  _a int;&lt;br /&gt;
  _b int;&lt;br /&gt;
  _xx foo[];&lt;br /&gt;
BEGIN&lt;br /&gt;
  _xx := (SELECT ARRAY(SELECT (a,b) FROM foo));&lt;br /&gt;
  FOREACH _a, _b IN ARRAY _xx&lt;br /&gt;
  LOOP&lt;br /&gt;
    RAISE NOTICE &#039;a: %,	b: %&#039;, _a, _b;&lt;br /&gt;
  END LOOP;&lt;br /&gt;
END;&lt;br /&gt;
$function$;&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT ft();&lt;br /&gt;
NOTICE:  a: 10,b: 20&lt;br /&gt;
NOTICE:  a: 30,b: 40&lt;br /&gt;
 ft &lt;br /&gt;
────&lt;br /&gt;
 &lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.ft()&lt;br /&gt;
 RETURNS void&lt;br /&gt;
 LANGUAGE plpgsql&lt;br /&gt;
AS $function$&lt;br /&gt;
DECLARE&lt;br /&gt;
  _a int[];&lt;br /&gt;
  _xx int[] := ARRAY[[1,2,3], [4,5,6]];&lt;br /&gt;
BEGIN&lt;br /&gt;
  FOREACH _a SLICE 1 IN ARRAY _xx&lt;br /&gt;
  LOOP&lt;br /&gt;
    RAISE NOTICE &#039;%&#039;, _a;             &lt;br /&gt;
  END LOOP;&lt;br /&gt;
END;&lt;br /&gt;
$function$;&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT ft();&lt;br /&gt;
NOTICE:  {1,2,3}&lt;br /&gt;
NOTICE:  {4,5,6}&lt;br /&gt;
 ft &lt;br /&gt;
────&lt;br /&gt;
 &lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Přidáno v 9.2==&lt;br /&gt;
===GET STACKED DIAGNOSTICS v PL/pgSQL===&lt;br /&gt;
Na jednom projektu, na kterém jsem spolupracoval jsem potřeboval zachytit výjimku, zalogovat ji, a přeposlat dál. Což v PL/pgSQL bylo možné jen částečně, takže jsem narazil. V PL/pgSQL jsem neměl způsob, jak se dostat k jednotlivým položkám výjimky vyjma SQLERRM a SQLCODE. Po implementaci příkazu GET STACKED DIAGNOSTICS jsou veškerá data z výjimky (včetně kontextu) čitelná i z PL/pgSQL.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION stacked_diagnostics_test()&lt;br /&gt;
RETURNS void AS $$&lt;br /&gt;
DECLARE _detail text;&lt;br /&gt;
        _hint text;&lt;br /&gt;
        _message text;&lt;br /&gt;
BEGIN&lt;br /&gt;
  perform raise_test();&lt;br /&gt;
EXCEPTION WHEN OTHERS THEN&lt;br /&gt;
  GET STACKED DIAGNOSTICS&lt;br /&gt;
        _message = message_text,&lt;br /&gt;
        _detail = pg_exception_detail,&lt;br /&gt;
        _hint = pg_exception_hint;&lt;br /&gt;
  RAISE NOTICE &#039;message: %, detail: %, hint: %&#039;, _message, _detail, _hint;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
SELECT stacked_diagnostics_test();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Přidáno v 9.3==&lt;br /&gt;
RETURN a RETURN NEXT může obsahovat i výraz kompozitního typu.&lt;br /&gt;
&lt;br /&gt;
===Přístup k dalším položkám popisu výjimky===&lt;br /&gt;
Příkaz GET STACKED DIAGNOSTICS byl rozšířen o přístup k položkám: COLUMN_NAME, TABLE_NAME, SCHEMA_NAME, CONSTRAINT_NAME a PG_DATATYPE_NAME. V příkazu RAISE lze specifikovat položky: COLUMN, TABLE, SCHEMA, CONSTRAINT a DATATYPE.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION stacked_diagnostics_test() &lt;br /&gt;
RETURNS void AS $$&lt;br /&gt;
DECLARE _column_name text;&lt;br /&gt;
        _constraint_name text;&lt;br /&gt;
        _datatype_name text;&lt;br /&gt;
        _table_name text;&lt;br /&gt;
        _schema_name text;&lt;br /&gt;
BEGIN&lt;br /&gt;
  RAISE EXCEPTION USING&lt;br /&gt;
    column = &#039;&amp;gt;&amp;gt;some column name&amp;lt;&amp;lt;&#039;,&lt;br /&gt;
    constraint = &#039;&amp;gt;&amp;gt;some constraint name&amp;lt;&amp;lt;&#039;,&lt;br /&gt;
    datatype = &#039;&amp;gt;&amp;gt;some datatype name&amp;lt;&amp;lt;&#039;,&lt;br /&gt;
    table = &#039;&amp;gt;&amp;gt;some table name&amp;lt;&amp;lt;&#039;,&lt;br /&gt;
    schema = &#039;&amp;gt;&amp;gt;some schema name&amp;lt;&amp;lt;&#039;;&lt;br /&gt;
EXCEPTION WHEN OTHERS THEN&lt;br /&gt;
  GET STACKED DIAGNOSTICS&lt;br /&gt;
        _column_name = column_name,&lt;br /&gt;
        _constraint_name = constraint_name,&lt;br /&gt;
        _datatype_name = pg_datatype_name,&lt;br /&gt;
        _table_name = table_name,&lt;br /&gt;
        _schema_name = schema_name;&lt;br /&gt;
  RAISE NOTICE &#039;column %, constraint %, type %, table %, schema %&#039;,&lt;br /&gt;
    _column_name, _constraint_name, _datatype_name, _table_name, _schema_name;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Přidáno v 9.4==&lt;br /&gt;
===Možnost přečtení zásobníku volání kdekoliv===&lt;br /&gt;
Prostřednictvím příkazu GET STACKED DIAGNOSTICS var = PG_EXCEPTION_CONTEXT je možné získat obsah zásobníku volání v obsluze výjimky. 9.4 tuto funkcionalitu vkládá i do příkazu GET DIAGNOSTICS (použití kdekoliv):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.inner_func() RETURNS integer AS  $$&lt;br /&gt;
DECLARE&lt;br /&gt;
  stack text;&lt;br /&gt;
BEGIN&lt;br /&gt;
  GET DIAGNOSTICS stack = PG_CONTEXT;&lt;br /&gt;
  RAISE NOTICE e&#039;--- Call Stack ---\n%&#039;, stack;&lt;br /&gt;
  RETURN 1;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
==Přidáno v 9.5==&lt;br /&gt;
Interní změnou je reimplementace přetypování, a zrychlení přístupu k prvkům pole (read/write).&lt;br /&gt;
&lt;br /&gt;
===Příkaz ASSERT===&lt;br /&gt;
Příkaz ASSERT slouží ke kontrole předpokladů běhu funkce. V případě, že první povinný výraz není true vyhodí nezachytitelnou výjimku s textem volitelného druhého parametru.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# DO $$BEGIN ASSERT false; END;$$; &lt;br /&gt;
ERROR:  assertion failed&lt;br /&gt;
CONTEXT:  PL/pgSQL function inline_code_block line 1 at ASSERT&lt;br /&gt;
&lt;br /&gt;
postgres=# DO $$BEGIN ASSERT false, &#039;some is wrong&#039;; END;$$; &lt;br /&gt;
ERROR:  some is wrong&lt;br /&gt;
CONTEXT:  PL/pgSQL function inline_code_block line 1 at ASSERT&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Přidáno v 9.6 ==&lt;br /&gt;
V této verzi nedošlo k žádným viditelným změnám v syntaxi jazyka. Vyřešil se letitý problém s chybějícím kontextem výjimky vyhozené příkazem &amp;lt;code&amp;gt;RAISE EXCEPTION&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Přidáno ve verzi 10 ==&lt;br /&gt;
Novinkou je možnost používat tzv tranzitivní tabulky v statement triggerech:&lt;br /&gt;
=== Tranzitivní tabulky ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE test(id int, a int, b int);&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION public.test_trg_func()&lt;br /&gt;
RETURNS trigger&lt;br /&gt;
AS $f$&lt;br /&gt;
DECLARE r record;&lt;br /&gt;
BEGIN&lt;br /&gt;
  FOR r IN SELECT * FROM newtable&lt;br /&gt;
  LOOP&lt;br /&gt;
    raise notice &#039;%&#039;, r;&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  RETURN null;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
CREATE TRIGGER test_trg AFTER INSERT ON test&lt;br /&gt;
  REFERENCING NEW TABLE AS newtable&lt;br /&gt;
  FOR EACH STATEMENT&lt;br /&gt;
  EXECUTE FUNCTION test_trg_func();&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Přidáno ve verzi 11 ==&lt;br /&gt;
Ve verzi 11 se zavádí nová kategorie databázových objektů - procedury.&lt;br /&gt;
&lt;br /&gt;
=== Procedury ===&lt;br /&gt;
Procedury představují aplikační kód spuštěný na serveru. Největším rozdílem vůči funkcím (pominuli syntax) je přístup k transakcím. Pokud je tzv top příkazem příkaz &amp;lt;code&amp;gt;CALL&amp;lt;/code&amp;gt;, pak se procedury vykonávají v prostředí tzv zřetězených transakcí - ukončení jedné transakce automaticky startuje druhou - a v tomto prostředí máme možnost explicitně řídit (potvrzovat, odvolávat) transakce. Oproti tomu funkce běží vždy v rámci příkazu SELECT nebo INSERT, UPDATE, DELETE - který běží pod vnější transakcí, a je zodpovědností toho, kdo, co nastartovalo tuto transakci, také tuto transakci ukončit. Řízení transakcí není v kompetenci funkcí. Je ale možné použít implicitně safepoint - klauzule &amp;lt;code&amp;gt;EXCEPTION WHEN&amp;lt;/code&amp;gt; nebo vyhozením výjimky &amp;lt;code&amp;gt;RAISE&amp;lt;/code&amp;gt;, pokud nebude obsloužena, si vynutit odvolání vnější transakce.&lt;br /&gt;
&lt;br /&gt;
Jelikož z pohledu řízení transakcí je každý příkaz uvnitř procedury top příkazem, je možné v procedurách volat příkazy, které vyžadují být top přikazem.&lt;br /&gt;
&lt;br /&gt;
Pozor - anonymní blok (příkaz &amp;lt;code&amp;gt;DO&amp;lt;/code&amp;gt;) zůstává nepojmenovanou funkcí.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE OR REPLACE PROCEDURE public.p1(a integer, b integer)&lt;br /&gt;
AS $$&lt;br /&gt;
DECLATE counter int DEFAULT 0;&lt;br /&gt;
BEGIN&lt;br /&gt;
  FOR i IN 1..a&lt;br /&gt;
  LOOP&lt;br /&gt;
    INSERT INTO test VALUES(i, random()*1000, random()*1000);&lt;br /&gt;
    counter := counter + 1;&lt;br /&gt;
    IF (counter % b) = 0 THEN&lt;br /&gt;
      COMMIT;&lt;br /&gt;
    END IF;&lt;br /&gt;
  END LOOP;&lt;br /&gt;
  ROLLBACK; -- poslední block, bude odvolán&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
CALL p1(99, 10);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
V případě, že nedojde k výjimce, a příkaz &amp;lt;code&amp;gt;CALL&amp;lt;/code&amp;gt; je top příkazem, pak se transakce automaticky potvrdí. Tedy není nutné explicitně volat příkaz &amp;lt;code&amp;gt;COMMIT&amp;lt;/code&amp;gt; na konci procedury jako v některých jiných databázích. Procedury mohou používat &amp;lt;code&amp;gt;IN&amp;lt;/code&amp;gt;, případně &amp;lt;code&amp;gt;INOUT&amp;lt;/code&amp;gt; parametry.&lt;br /&gt;
&lt;br /&gt;
== Přidáno ve verzi 12 ==&lt;br /&gt;
&lt;br /&gt;
Během posledních tří verzí došlo k výrazným optimalizacím kódu. Navenek tyto změny nejsou nijak zvlášť viditelné - některé operace mohou být rychlejší, některé omezení pro práci s proměnnými (např. kompozitního typu) byly odstraněna. Pro vývojáře PLpgSQL je ve verzi 12 důležitá podpora API pro PLpgSQL profilery. Počínáje verzí 12 můžete profilovat kód v PLpgSQL v podstatě s minimální výkonnostní režií (téměř nulovou). Nově uživatel může aktivovat extra běhové (runtime) kontroly &amp;lt;code&amp;gt;strict_multi_assignment&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;too_many_rows&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Přidáno ve verzi 13 ==&lt;br /&gt;
&lt;br /&gt;
V této verzi došlo k dramatickému zrychlení jednoduchých výrazů (neobsahující dotazy do tabulek).&lt;br /&gt;
&lt;br /&gt;
== Přidáno ve verzi 14 ==&lt;br /&gt;
&lt;br /&gt;
V podstatě jedinou změnou (ale vítanou na kterou jsme si museli počkat dlouho) je plnohodnotná podpora výrazů na levé straně přiřazovacího příkazu. Počínaje touto verzí můžeme jedním příkazem změnit zanořenou hodnotu atributu kompozitní položky v poli:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create type bod as (x int, y int);&lt;br /&gt;
&lt;br /&gt;
do $$&lt;br /&gt;
declare b bod[];&lt;br /&gt;
begin&lt;br /&gt;
  b[10].x := 20;&lt;br /&gt;
  RAISE NOTICE &#039;%&#039;, b;&lt;br /&gt;
end&lt;br /&gt;
$$;&lt;br /&gt;
NOTICE:  [10:10]={&amp;quot;(20,)&amp;quot;}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Přidáno ve verzi 15 ==&lt;br /&gt;
Žádná viditelná změna. Rozšířilo se tzv debug API&lt;br /&gt;
&lt;br /&gt;
== Přidáno ve verzi 16 ==&lt;br /&gt;
Pouze jediná změna - v příkazu &amp;lt;code&amp;gt;GET DIAGNOSTICS&amp;lt;/code&amp;gt; je možné číst hodnotu &amp;lt;code&amp;gt;PG_ROUTINE_OID&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Přidáno ve verzi 17 ==&lt;br /&gt;
Možnost psát login triggery (jako event trigger), a možnost deklarovat proměnnou s referencovaným typem jako pole:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do $$&lt;br /&gt;
declare`&lt;br /&gt;
  v int;&lt;br /&gt;
  v1 v%type;&lt;br /&gt;
  v2 v%type[];&lt;br /&gt;
  v3 v%type array;&lt;br /&gt;
  v10 pg_catalog.pg_class%rowtype[];&lt;br /&gt;
begin&lt;br /&gt;
  raise notice &#039;%&#039;, pg_typeof(v1);&lt;br /&gt;
  raise notice &#039;%&#039;, pg_typeof(v2);&lt;br /&gt;
  raise notice &#039;%&#039;, pg_typeof(v3);&lt;br /&gt;
  raise notice &#039;%&#039;, pg_typeof(v10);&lt;br /&gt;
end;&lt;br /&gt;
$$;&lt;br /&gt;
&lt;br /&gt;
NOTICE:  integer&lt;br /&gt;
NOTICE:  integer[]&lt;br /&gt;
NOTICE:  integer[]&lt;br /&gt;
NOTICE:  pg_class[]&lt;br /&gt;
DO&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Přidáno ve verzi 19 ==&lt;br /&gt;
Optimalizace zápisu &amp;lt;code&amp;gt;SELECT expr INTO var&amp;lt;/code&amp;gt;, který se nově provede jako přiřazení s použitím přímého volání expr exekutoru.&lt;br /&gt;
&lt;br /&gt;
== Doporučení pro návrh uložených procedur v jazyce PL/pgSQL ==&lt;br /&gt;
Na internetu můžete nalézt řadu doporučení pro psaní uložených procedur v PL/SQL fy. Oracle. Implementace  PL/pgSQL je jiná a tudíž ne všechna doporučení jsou relevantní pro PostgreSQL. V PL, stejně jako v jiných prg. jazycích lze napsat nečitelný a špatně udržovatelný, případně neefektivní kód. Riziko, že Váš kód bude nevyhovující, snížíte, pokud se budete držet následujících doporučení:&lt;br /&gt;
* kód pište v klasickém (programátorském) editoru a ukládejte do souboru. V souborech můžete lépe udržovat komentáře, můžete sdružovat funkčně blízké nebo závislé funkce, můžete verzovat kód. Nepoužívejte nástroje jako je pgAdmin nebo phpPgAdmin.&lt;br /&gt;
* braňte se kolizi lokálních proměnných a databázových objektů:&lt;br /&gt;
# používejte prefixy proměnných (např. pro lokální proměnné symbol &amp;quot;_&amp;quot;)&lt;br /&gt;
# používejte kvalifikované atributy (tabulka.sloupec) ve všech SQL příkazech v procedurách)&lt;br /&gt;
* proměnné deklarujte pomocí odvozených typů - %TYPE a %ROWTYPE&lt;br /&gt;
* v PL používejte nativní SQL všude, kde je to možné a rozumné. Pokud byste měli použít příliš komplikovaný dotaz, je možné že PL kód bude rychlejší. Snažte se nepoužívat dynamické SQL. Přemýšlejte, zda nemůžete cyklus ve funkci nahradit klasickým SELECTem obsahujícím konstrukci CASE.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- neefektivni kod&lt;br /&gt;
IF _cena &amp;lt;= _cena_max THEN&lt;br /&gt;
  INSERT INTO tab(id, cena) VALUES(_id, _cena);&lt;br /&gt;
ELSE&lt;br /&gt;
  INSERT INTO tab(id, cena) VALUES(_id, _cena_max);&lt;br /&gt;
END IF;&lt;br /&gt;
&lt;br /&gt;
-- efektivni kod&lt;br /&gt;
INSERT INTO tab(id, cena)&lt;br /&gt;
   VALUES(_id, CASE WHEN _cena &amp;lt;= _cena_max &lt;br /&gt;
                    THEN _cena ELSE _cena_max END);&lt;br /&gt;
&lt;br /&gt;
-- neefektivni kod&lt;br /&gt;
FOR _c1, _c2 IN SELECT c1,c2 FROM tab1 LOOP&lt;br /&gt;
  IF _c1 &amp;gt; 20 THEN&lt;br /&gt;
    INSERT INTO tab2 VALUES(20,_c2);&lt;br /&gt;
  ELSE&lt;br /&gt;
    INSERT INTO tab3 VALUES(_c1,_c2);&lt;br /&gt;
  END IF;&lt;br /&gt;
END LOOP;&lt;br /&gt;
&lt;br /&gt;
-- efektivni kod&lt;br /&gt;
INSERT INTO tab2 &lt;br /&gt;
  SELECT 20,c2 FROM tab1 WHERE c1 &amp;gt; 20;&lt;br /&gt;
INSERT INTO tab3&lt;br /&gt;
  SELECT c1,c2 FROM tab1 WHERE c1 &amp;lt;= 20;&lt;br /&gt;
&lt;br /&gt;
-- neefektivní kód&lt;br /&gt;
FOR i IN array_lower(delitems,1) .. array_upper(delitems,1)&lt;br /&gt;
LOOP&lt;br /&gt;
  DELETE FROM tab &lt;br /&gt;
    WHERE tab.id = delitems[i];&lt;br /&gt;
END LOOP;&lt;br /&gt;
&lt;br /&gt;
-- efektivni kod&lt;br /&gt;
DELETE FROM tab&lt;br /&gt;
  WHERE tab.id = ANY(delitems);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* funkce má obsahovat pouze jeden příkaz RETURN - jedna cesta dovnitř, jedna cesta ven.&lt;br /&gt;
* nepište redundantní kód - v aplikaci by se neměl objevit dvakrát stejný kód.&lt;br /&gt;
* používejte funkci Assert, případně její modifikace:&lt;br /&gt;
&amp;lt;pre&amp;gt;CREATE OR REPLACE FUNCTION Assert(bool, varchar) RETURNS void AS $$&lt;br /&gt;
BEGIN &lt;br /&gt;
 IF NOT $1 OR $1 IS NULL THEN&lt;br /&gt;
   IF $2 IS NOT NULL THEN  &lt;br /&gt;
     RAISE EXCEPTION &#039;Assert failure: %&#039;, $2; &lt;br /&gt;
   END IF;&lt;br /&gt;
   RAISE NOTICE &#039;Assert. Message is null&#039;;&lt;br /&gt;
 END IF;   &lt;br /&gt;
END;$$ LANGUAGE plpgsql;&lt;br /&gt;
&lt;br /&gt;
CREATE OR REPLACE FUNCTION Assert_IsNotNull(anyelement, varchar) RETURNS void AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  PERFORM Assert($1 IS NOT NULL, $2);&lt;br /&gt;
END; $$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dodržujte předem dohodnutou notaci pro texty výjimek, předem se domluvte na seznamu uživatelem definovaných chyb a chybových hlášení.&lt;br /&gt;
* netestujte na NULL proměnnou, která je deklarována jako NOT NULL. Je na PL, aby zajistil, že tato proměnná v žádném případě nebude obsahovat NULL. Pro zjištění úspěšnosti dotazu netestujte obsah proměnných modifikovaných dotazem, ale vždy obsah logické systémové proměnné FOUND.&lt;br /&gt;
* používejte návěstí &amp;lt;&amp;lt;label&amp;gt;&amp;gt; pro smyčky a bloky, využívejte typ boolean, tak aby Váš kód byl, co možná, nejčitelnější.&lt;br /&gt;
* nespoléhejte se na automatické konverze typu date a timestamp, které závisí na konfiguraci. Používejte funkce to_char a to_date.&lt;br /&gt;
* nepoužívejte IF pro naplnění logické proměnné:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
is_ok := _age &amp;gt; 18;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* každou proměnnou používejte pouze k jednomu jasnému účelu. Z kódu odstraňte nepoužívané proměnné.&lt;br /&gt;
* Výchozí kategorie funkce je VOLATILE. Pokud v těle funkce nepřistupujete k tabulkám a nepoužíváte funkce typu random(), currval() atd, používejte kategorie IMMUTABLE nebo STABLE. Doba zpracování funkce může být i o polovinu kratší.&lt;br /&gt;
* zbytečně nezapouzdřujte SQL příkazy do jednoduchých funkcí.&lt;br /&gt;
* snažte se omezit kurzory a dočasné tabulky.&lt;br /&gt;
* preferujte standardizované funkce před vlastními.&lt;br /&gt;
* v triggerech &amp;quot;tajně&amp;quot; neopravujte data, posuďte zda nemůžete použít CHECK&lt;br /&gt;
* každá procedura by měla obsahovat maximálně 50 až 60 řádek&lt;br /&gt;
* používejte unit testy (k ověření identifikace chyby, k ověření korektnosti opravy)&lt;br /&gt;
* zapouzdřete vyvolání výjimky do vlastní procedury&lt;br /&gt;
* vždy ve svém kódu použijte pouze jeden ze dvou možných způsobů (výjimky a návratový kód) signalizace chyby&lt;br /&gt;
* snažte se opakované přiřazení do proměnné (u typů varchar a array) sloučit do jednoho výrazu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--špatně&lt;br /&gt;
DECLARE v varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
  v := &#039;a&#039;;&lt;br /&gt;
  v := v || &#039;b&#039;;&lt;br /&gt;
  v := v || &#039;c&#039;;&lt;br /&gt;
  RETURN v;&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
--dobře&lt;br /&gt;
BEGIN&lt;br /&gt;
  RETURN &#039;a&#039; || &#039;b&#039; || &#039;c&#039;;&lt;br /&gt;
END;&lt;br /&gt;
&lt;br /&gt;
-- špatně&lt;br /&gt;
DECLARE s varchar := &#039;&#039;;&lt;br /&gt;
BEGIN&lt;br /&gt;
  IF x1 IS NULL THEN&lt;br /&gt;
    s := s || &#039;NULL,&#039;&lt;br /&gt;
  ELSE&lt;br /&gt;
    s := s || x1;&lt;br /&gt;
  END IF;&lt;br /&gt;
  &lt;br /&gt;
  IF x2 IS NULL THEN&lt;br /&gt;
    s := s || &#039;NULL, &#039;&lt;br /&gt;
  ELSE&lt;br /&gt;
    s := s || x2;&lt;br /&gt;
  END IF;&lt;br /&gt;
  ...&lt;br /&gt;
&lt;br /&gt;
-- správně&lt;br /&gt;
DECLARE s varchar;&lt;br /&gt;
BEGIN&lt;br /&gt;
  s := COALESCE(x1 || &#039;,&#039;, &#039;NULL,&#039;)&lt;br /&gt;
       || COALESCE(x2 || &#039;,&#039;, &#039;NULL,&#039;)&lt;br /&gt;
  ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Funkce obsahující pouze jeden příkaz nepiště v PL/pgSQL, ale v SQL:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--špatně&lt;br /&gt;
CREATE OR REPLACE FUNCTION foo()&lt;br /&gt;
RETURNS varchar AS $$&lt;br /&gt;
BEGIN&lt;br /&gt;
  RETURN &#039;a&#039; || &#039;b&#039; || &#039;c&#039;;&lt;br /&gt;
END;&lt;br /&gt;
$$ LANGUAGE plpgsql IMMUTABLE;&lt;br /&gt;
&lt;br /&gt;
--dobře&lt;br /&gt;
CREATE OR REPLACE FUNCTION foo()&lt;br /&gt;
RETURNS varchar AS $$&lt;br /&gt;
  SELECT &#039;a&#039; || &#039;b&#039; || &#039;c&#039;;&lt;br /&gt;
$$ LANGUAGE sql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* pište, co nejčitelněji - nevymýšlejte složité konstrukce:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--špatně&lt;br /&gt;
CREATE OR REPLACE FUNCTION hex_to_int(varchar) RETURNS integer AS &#039;&lt;br /&gt;
DECLARE&lt;br /&gt;
  h alias for $1;&lt;br /&gt;
  exec varchar;&lt;br /&gt;
  curs refcursor;&lt;br /&gt;
  res int;&lt;br /&gt;
BEGIN&lt;br /&gt;
  exec := &#039;&#039;SELECT x&#039;&#039;&#039;&#039;&#039;&#039; || h || &#039;&#039;&#039;&#039;&#039;&#039;::int&#039;&#039;;&lt;br /&gt;
  OPEN curs FOR EXECUTE exec;&lt;br /&gt;
  FETCH curs INTO res;&lt;br /&gt;
  CLOSE curs;&lt;br /&gt;
  return res;&lt;br /&gt;
END;&#039;&lt;br /&gt;
LANGUAGE &#039;plpgsql&#039; IMMUTABLE STRICT;&lt;br /&gt;
&lt;br /&gt;
-- dobře&lt;br /&gt;
CREATE FUNCTION hex2dec(in_hex TEXT)&lt;br /&gt;
RETURNS INT IMMUTABLE STRICT  AS $body$&lt;br /&gt;
  DECLARE result integer;&lt;br /&gt;
BEGIN&lt;br /&gt;
  EXECUTE &#039;SELECT (x&#039; || quote_literal($1) || &#039;)::int&#039; INTO result;&lt;br /&gt;
  RETURN result;&lt;br /&gt;
END;&lt;br /&gt;
$body$ LANGUAGE plpgsql;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[Category:Články]]&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1589</id>
		<title>PostgreSQL 19 (2026)</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1589"/>
		<updated>2026-05-10T03:32:56Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;i&amp;gt;Autor: Pavel Stěhule&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;O předchozích verzích jsem napsal, že změny byly primárně interní. Z pohledu uživatele, který chce vidět novou SQL syntax, se toho v posledních verzích moc nestalo. Devatenáctka je jiná. Tam je viditelných změn opravdu hodně. Jako každý rok - nová verze je pelmel nových funkcí a různých vylepšení menších nebo větších.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Administrace==&lt;br /&gt;
&amp;lt;p&amp;gt;Bloating tabulek může být problém. Skoro všude jsem se setkal se situací, kdy &amp;quot;mazací&amp;quot; skript přestal fungovat (z různých důvodů), přičemž se tato chyba detekovala příliš pozdě, kdy dotčené tabulky měly místo jednotek GB například desítky GB. To už musí zaúřadovat &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, což často znamená vynucenou plánovanou odstávku (kvůli držení exkluzivního zámku). Je to letitý problém, který zkušenější uživatelé řešili buďto pečlivějším monitoringem, v některých případech partišningem (partitioning), případně extenzemi &amp;lt;code&amp;gt;pg_repack&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt;. Autor posledně jmenované extenze Tonda (Antonín Houska) spolu s Alvarem (Alvaro Herrera) poslední dva roky pracovali na integraci &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt; do jádra Postgresu. Paradoxně příkaz, který bude provádět zdrcnutí tabulek, se bude jmenovat &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt;. Základem je logická replikace - zadaná tabulka se lokálně zreplikuje (vytvoří se její nová kopie, a tím se zbaví vnitřního neobsazeného místa). Co je zásadní, je možnost použít volbu &amp;lt;code&amp;gt;CONCURRENTLY&amp;lt;/code&amp;gt;. S touto volbou příkaz nepoužije exkluzivní zámek. Tudíž je možné jej použít za provozu. Nutnou podmínkou je existence primárního klíče (a unikátního indexu).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
REPACK (CONCURRENTLY, VERBOSE) obce;&lt;br /&gt;
INFO:  repacking &amp;quot;public.obce&amp;quot; in physical order&lt;br /&gt;
INFO:  &amp;quot;public.obce&amp;quot;: found 0 removable, 6250 nonremovable row versions in 59 pages&lt;br /&gt;
DETAIL:  0 dead row versions cannot be removed yet.&lt;br /&gt;
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.&lt;br /&gt;
REPACK&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kromě toho, že příkaz &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt; nahrazuje příkaz &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, tak tento příkaz ještě nahrazuje příkaz &amp;lt;code&amp;gt;CLUSTER&amp;lt;/code&amp;gt;, kterým se tabulka fyzicky (jednorázově) přeuspořádá podle zadaného indexu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Možná jste si všimli, že dotaz běžící pod příkazem &amp;lt;code&amp;gt;EXPLAIN ANALYZE&amp;lt;/code&amp;gt; je výrazně pomalejší. Důvodem je měření času - executor, v tomto režimu, neustále poptává aktuální čas, a to má brutální režii. U větších dotazů se vyplatí použít volbu &amp;lt;code&amp;gt;TIMING OFF&amp;lt;/code&amp;gt;. V 19 na x86 se místo systémového času použíjí takty CPU. Je to výrazně rychlejší - zatímco na osmnáctce mi jednoduchý testovací dotaz běžel 2.5x pomalejší v explainu, na devatenáctce pouze 1.5x pomaleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou velkou změnou je vypnutí JIT ve výchozí konfiguraci. JIT se objevil v Postgresu 11, a v Postgresu 12 byl zapnutý ve výchozí konfiguraci. Bohužel se zjistilo, že většině uživatelů, kteří Postgres používají pro OLTP, dělá víc škody než užitku. Došlo to až do stavu, kdy se uživatelům doporučovalo, neoficiálně, po instalaci JIT vypnout. Je tam víc problémů. &amp;lt;code&amp;gt;clang&amp;lt;/code&amp;gt;, na kterém je to postavené, v novějších verzích kompiluje lépe, ale pomaleji. Existují alternativní implementace JIT, ale všechny jsou více než méně experimentální. Druhým problémem je model, na jehož základě se JIT aktivuje. Tento model jednak nedokáže dobře odhadnout náročnost &amp;quot;jitifikace - inliningu, a navíc je citlivý na přestřelení odhadu počtu řádek. Ohledně modelu a citlivosti na odhady pochybuji, že se dá něco dělat. Alternativní implementace JIT mají výrazně nižší režii. Přijde mi to ale jako slepá cesta. Budoucnost vidím v integraci vektorového executoru a vektorových funkcí (tak jak to používá [https://duckdb.org/ DuckDB]). Může to znamenat, že Postgres bude mít duální implementace funkcí (pro skalární parametr, a pro vektor parametrů).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze vytvořit replikační slot pro logickou replikaci, bez nutnosti mít konfiguraci &amp;lt;code&amp;gt;wal_level=logical&amp;lt;/code&amp;gt;. Postačuje nastavení &amp;lt;code&amp;gt;replica&amp;lt;/code&amp;gt;, což je výchozí nastavení. Jakmile je logický replikační slot aktivní, interně se úroveň zápisu do transakčního logu nastaví na &amp;lt;code&amp;gt;logical&amp;lt;/code&amp;gt;. Jaký je aktuální stav zjistíte v konfigurační proměnné &amp;lt;code&amp;gt;effective_wal_level&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Další bombou je možnost zapínat nebo vypínat kontrolní součty (na úrovni datových stránek) za běhu. Kontrolní součty jsou v Postgresu už relativně dlouho, a ačkoliv na dnešním hardware je jejich režie zanedbatelná, tak určitě bude dost databází, kde nebudou zapnuté. Zapnutí kontrolních součtů vyžadovalo odstávku úměrnou velikosti databáze. Navíc se silně doporučuje po zapnutí součtů znovu zreplikovat všechny fyzické repliky. Výhodou je diagnostika, možnost identifikovat poškozené stránky (a přeskočit je), možnost vyrobit replikovaný server ze starého primárního příkazem &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt;. Naplánovat a provést delší odstávku někde nemusí být jednoduché (nebo to může být skoro nemožné). U jednoho mého klienta zapnutí kontrolních součtů na cca 2TB databázi trvalo cca 2 hodiny (na vlastním hardware z roku 2025). Zapnutí se provede voláním funkce &amp;lt;code&amp;gt;pg_enable_data_checksums&amp;lt;/code&amp;gt;. Nastavením volitelných parametrů lze běh funkce zpomalit, tak aby nepřetěžovala IO. Vypnutí provede funkce &amp;lt;code&amp;gt;pg_disable_data_checksums&amp;lt;/code&amp;gt;. Stav procesu můžeme vidět v pohledu &amp;lt;code&amp;gt;pg_stat_progress_data_checksums&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Snad se už konečně vyřešil problém s upgradem databází obsahující extrémně velký počet LO (large objects). Nově binární upgrade (&amp;lt;code&amp;gt;pg_upgrade&amp;lt;/code&amp;gt;) použije pro export metadat LO příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; místo původní sekvence příkazů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- původní sekvence&lt;br /&gt;
SELECT pg_catalog.lo_create(&#039;5432&#039;);&lt;br /&gt;
ALTER LARGE OBJECT 5432 OWNER TO alice;&lt;br /&gt;
GRANT SELECT ON LARGE OBJECT 5432 TO bob;&lt;br /&gt;
&lt;br /&gt;
-- nově&lt;br /&gt;
COPY pg_catalog.pg_largeobject_metadata (oid, lomowner, lomacl) FROM stdin;&lt;br /&gt;
5432 16384 {alice=rw/alice,bob=r/alice}&lt;br /&gt;
\.&lt;br /&gt;
&lt;br /&gt;
COPY pg_catalog.pg_shdepend (dbid, classid, objid, objsubid, refclassid, refobjid, deptype) FROM stdin;&lt;br /&gt;
5 2613 5432 0 1260 16384 o&lt;br /&gt;
5 2613 5432 0 1260 16385 a&lt;br /&gt;
\.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nová implementace by měla být řádově rychlejší.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konečně se dotáhlo do konce začlenění podpory více formátů v příkazu &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Postgres má dva základní příkazy pro export (backup) - &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Historicky tyto příkazy podporovaly pouze &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; formát. Postupem času &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; získal možnost exportu do &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;dictionary&amp;lt;/code&amp;gt; formátu plus import příkazem &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umožňoval paralelní import více tabulek. &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; byl díky podpoře pouze SQL formátu dost omezený. To se nyní změnilo, a v &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; jsou podporovány všechny formáty, které podporuje &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt;. Vypadá to trochu jako workaround. V případě, že se použije jiný než &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; (SQL) formát, tak se vyrobí adresář, který do podadresářů uloží výstup z &amp;lt;code&amp;gt;pg_dumpu&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umí s touto adresářovou strukturou pracovat. Tato možnost se dostala už do 18tky, ale byla na poslední chvíli stažena.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt; zredukovalo kopírování WAL logů z nového primárního serveru na budovanou repliku a to tak, že se budou kopírovat pouze WAL logy vzniklé po rozpadu replikace. V mnoha scénářích se tím výrazně urychlí běh tohoto příkazu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Doposud autovacuum vybíralo tabulky k vakuování na základě porovnání vypočítaných koeficientů a prahových hodnot. Pořadí vybraných tabulek záleželo na fyzickém pořadí v systémové tabulce &amp;lt;code&amp;gt;pg_class&amp;lt;/code&amp;gt;. Nově se vakuum bude prioritizovat podle míry vzdálenosti od prahu. Dalším kritériem je stáří tabulky (počet transakcí od freeze). Stará implementace byla férová v tom, že garantovala, že každá tabulka bude zvakuovaná a že žádná tabulka nebude &amp;quot;předbíhat&amp;quot; ve frontě. Na druhou stranu se mohlo stát, že tabulka s intenzivnějším provozem čekala příliš dlouho a došlo k zbytečnému bloatingu. Nová implementace se snaží být chytřejší. Uvidíme, jak to bude fungovat. Moje zkušenost je taková, že a) není dobré dávat do Postgresu příliš dynamická data, b) je dobré si nastavit počet aktivních autovacuum workerů tak, aby byla určitá rezerva, c) není dobré vytěžovat IO na maximum (je dobré mít dostatečně nadimenzované IO a mít nějakou rezervu). Skóre tabulek můžeme sledovat v pohledu &amp;lt;code&amp;gt;pg_stat_autovacuum_score&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_autovacuum_scores WHERE score &amp;gt; 0.05;&lt;br /&gt;
┌─[ RECORD 1 ]────────┬──────────────────────┐&lt;br /&gt;
│ relid               │ 1262                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_database          │&lt;br /&gt;
│ score               │ 0.15936254737880529  │&lt;br /&gt;
│ xid_score           │ 1e-07                │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0.0793650769622719   │&lt;br /&gt;
│ vacuum_insert_score │ 0.003998400542165933 │&lt;br /&gt;
│ analyze_score       │ 0.15936254737880529  │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
╞═[ RECORD 2 ]════════╪══════════════════════╡&lt;br /&gt;
│ relid               │ 1214                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_shdepend          │&lt;br /&gt;
│ score               │ 0.12                 │&lt;br /&gt;
│ xid_score           │ 1.15e-07             │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0                    │&lt;br /&gt;
│ vacuum_insert_score │ 0.006                │&lt;br /&gt;
│ analyze_score       │ 0.12                 │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
└─────────────────────┴──────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově autovacuum může použít &amp;lt;code&amp;gt;VACUUM&amp;lt;/code&amp;gt; s podporou paralelismu.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přehled o aktuálním stavu recovery je k dispozici v pohledu &amp;lt;code&amp;gt;pg_stat_recovery&amp;lt;/code&amp;gt;. V pohledu &amp;lt;code&amp;gt;pg_stat_statements&amp;lt;/code&amp;gt; jsou dva nové sloupce &amp;lt;code&amp;gt;generic_plan_calls&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;custom_plan_calls&amp;lt;/code&amp;gt; zobrazující kolikrát předpřipravený příkaz (prepared statement) použil generický nebo zákaznický plán. Nový sloupec &amp;lt;code&amp;gt;wal_fpi_bytes&amp;lt;/code&amp;gt; zobrazuje velikost zápisu tzv. plných stránek do transakčního logu. Vysoká hodnota může signalizovat nepříjemně velkou četnost vynucených checkpointů (je nutné zvednout &amp;lt;code&amp;gt;max_wal_size&amp;lt;/code&amp;gt; případně &amp;lt;code&amp;gt;checkpoint_timeout&amp;lt;/code&amp;gt;). V novém pohledu &amp;lt;code&amp;gt;pg_stat_lock&amp;lt;/code&amp;gt; uvidíme počet a celkový čas čekání na různé typy zámků. Zaznamenány jsou pouze ty situace, kdy se čeká na zámek déle než jednu sekundu (stejně jako např. &amp;lt;code&amp;gt;log_lock_waits&amp;lt;/code&amp;gt;, které je v nyní ve výchozí konfiguraci zapnuté). Bohužel zámky, které trvají cca 100ms, mající nepříjemný dopad na dotazy kolem 10ms, zde neuvidíme:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_lock ;&lt;br /&gt;
┌──────────────────┬───────┬───────────┬───────────────────┬───────────────────────────────┐&lt;br /&gt;
│     locktype     │ waits │ wait_time │ fastpath_exceeded │          stats_reset          │&lt;br /&gt;
╞══════════════════╪═══════╪═══════════╪═══════════════════╪═══════════════════════════════╡&lt;br /&gt;
│ relation         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ extend           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ frozenid         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ page             │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ tuple            │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ transactionid    │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ virtualxid       │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ spectoken        │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ object           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ userlock         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ advisory         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ applytransaction │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
└──────────────────┴───────┴───────────┴───────────────────┴───────────────────────────────┘&lt;br /&gt;
(12 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze Postgres podporuje asynchronní IO. Čtení je realizováno dedikovanými procesy (workers). Počáteční implementace pracovala s konfigurovatelným počtem těchto procesů (výchozí nastavení mělo hodnotu 3). Nově je správa workerů dynamičtější - v případě potřeby si je Postgres nastartuje nebo naopak zavře. Místo fixního počtu nyní nastavujeme minimální a maximální počet workerů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io_min_workers=2&lt;br /&gt;
io_max_workers=8 (up to 32)&lt;br /&gt;
io_worker_idle_timeout=60s&lt;br /&gt;
io_worker_launch_interval=100ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Poměrně razantně se změnila konfigurace &amp;lt;code&amp;gt;log_min_messages&amp;lt;/code&amp;gt;, která udává, na které úrovni se mají chyby zapsat do systémového logu (&amp;lt;code&amp;gt;DEBUG5&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;PANIC&amp;lt;/code&amp;gt;). Nově lze tuto úroveň nastavit pro každý typ procesu (&amp;lt;code&amp;gt;archiver&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;autovacuum&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bgworker&amp;lt;/code&amp;gt;, ...) např. &amp;lt;code&amp;gt;error, walsender:debug1, autovacuum:debug1&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Správa partišen (partitions) byla v Postgresu základní. Díky možnosti sloučit nebo rozdělit partišny (partitions) se dostává trochu dál. Je to spíš první krok se spoustou omezení - používá se pouze jedno CPU a po celou dobu je exkluzivně zamknutá rodičovská tabulka. Ale i tak to může dost uživatelům ušetřit práci (a jejich vlastní řešení by pravděpodobně mělo stejná omezení):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_east, sales_central)  INTO sales_all;&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE measurement SPLIT PARTITION measurement_y2006q1 INTO&lt;br /&gt;
   (PARTITION measurement_y2006m01 FOR VALUES FROM (&#039;2006-01-01&#039;) TO (&#039;2006-02-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m02 FOR VALUES FROM (&#039;2006-02-01&#039;) TO (&#039;2006-03-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m03 FOR VALUES FROM (&#039;2006-03-01&#039;) TO (&#039;2006-04-01&#039;));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Oproti předchozím verzím lze zapínat a vypínat všechny typy omezení (nejen cizí klíče):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, CONSTRAINT cc CHECK(a &amp;gt; 0) NOT ENFORCED); &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
INSERT INTO foo VALUES(1);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ERROR:  check constraint &amp;quot;cc&amp;quot; of relation &amp;quot;foo&amp;quot; is violated by some row&lt;br /&gt;
DELETE FROM foo WHERE a = 0;&lt;br /&gt;
DELETE 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
ERROR:  new row for relation &amp;quot;foo&amp;quot; violates check constraint &amp;quot;cc&amp;quot;&lt;br /&gt;
DETAIL:  Failing row contains (0).&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc NOT ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==pg_plan_advice==&lt;br /&gt;
&amp;lt;p&amp;gt;Až doposud uživatelé Postgresu neměli moc možností, jak ovlivnit generování prováděcích plánů. Hinty ve stylu Oracle byly a jsou z historických důvodů tabu (jsou implementovány extenzí [https://github.com/ossc-db/pg_hint_plan pg_hint_plan]). Uživatel měl pouze možnost penalizace metod executoru - např. &amp;lt;code&amp;gt;enable_nestloop&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;enable_indexscan&amp;lt;/code&amp;gt; nastavením na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Tato penalizace je ale dost hrubá, a neumožňuje jemné ovlivnění plánovače. Přesto se používala a používá. Rober Haas napsal dvě extenze [https://www.postgresql.org/docs/devel/pgplanadvice.html &amp;lt;code&amp;gt;pg_plan_advice&amp;lt;/code&amp;gt;] a [https://www.postgresql.org/docs/devel/pgstashadvice.html &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;]. Prvně zmíněná extenze umožňuje definovat jakási doporučení, která by měl planner respektovat. Pro každý plán lze zpětně dogenerovat tato doporučení:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce&lt;br /&gt;
  ORDER BY pocet_muzu + pocet_zen DESC&lt;br /&gt;
  LIMIT 10;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Limit  (cost=272.19..272.21 rows=10 width=45)                        │&lt;br /&gt;
│   -&amp;gt;  Sort  (cost=272.19..287.81 rows=6250 width=45)                 │&lt;br /&gt;
│         Sort Key: ((pocet_muzu + pocet_zen)) DESC                    │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on obce  (cost=0.00..137.12 rows=6250 width=45) │&lt;br /&gt;
│ Generated Plan Advice:                                               │&lt;br /&gt;
│   SEQ_SCAN(obce)                                                     │&lt;br /&gt;
│   NO_GATHER(obce)                                                    │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                      QUERY PLAN                                      │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Nested Loop  (cost=0.28..12.56 rows=81 width=58)                                     │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17)                          │&lt;br /&gt;
│         Filter: (nazev = &#039;Beroun&#039;::text)                                             │&lt;br /&gt;
│   -&amp;gt;  Index Scan using obce_okres_id_idx on obce  (cost=0.28..9.79 rows=81 width=41) │&lt;br /&gt;
│         Index Cond: ((okres_id)::text = okresy.id)                                   │&lt;br /&gt;
│ Generated Plan Advice:                                                               │&lt;br /&gt;
│   JOIN_ORDER(okresy obce)                                                            │&lt;br /&gt;
│   NESTED_LOOP_PLAIN(obce)                                                            │&lt;br /&gt;
│   SEQ_SCAN(okresy)                                                                   │&lt;br /&gt;
│   INDEX_SCAN(obce public.obce_okres_id_idx)                                          │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                                             │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(11 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Prostřednictvím konfigurační proměnné &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; můžeme ovlivnit chování planneru vlastními doporučeními:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET pg_plan_advice.advice to &#039;JOIN_ORDER(obce okresy)&#039;;&lt;br /&gt;
SET&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌───────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                            QUERY PLAN                             │&lt;br /&gt;
╞═══════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Join  (cost=1.97..140.78 rows=81 width=58)                   │&lt;br /&gt;
│   Hash Cond: ((obce.okres_id)::text = okresy.id)                  │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on obce  (cost=0.00..121.50 rows=6250 width=41)    │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=1.96..1.96 rows=1 width=17)                     │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17) │&lt;br /&gt;
│               Filter: (nazev = &#039;Beroun&#039;::text)                    │&lt;br /&gt;
│ Supplied Plan Advice:                                             │&lt;br /&gt;
│   JOIN_ORDER(obce okresy) /* matched */                           │&lt;br /&gt;
│ Generated Plan Advice:                                            │&lt;br /&gt;
│   JOIN_ORDER(obce okresy)                                         │&lt;br /&gt;
│   HASH_JOIN(okresy)                                               │&lt;br /&gt;
│   SEQ_SCAN(obce okresy)                                           │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                          │&lt;br /&gt;
└───────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(13 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konfigurace planneru prostřednictvím &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; nestačí, pokud potřebujeme ovlivnit plán dotazu z aplikace, u které nemůžeme nebo nechceme měnit zdrojový kód. A proto je tu druhá zmíněná extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;, která umožňuje naše &amp;quot;doporučení&amp;quot; uložit a pak automaticky aplikovat na základě tzv &amp;lt;code&amp;gt;queryid&amp;lt;/code&amp;gt;. Doporučení jsou uložena v pojmenovaných skladech (stashes). Skrze konfigurační proměnnou &amp;lt;code&amp;gt;pg_stash_advice.stash_name&amp;lt;/code&amp;gt; volíme aktivní sklad. Každý uživatel, každá databáze může mít svůj vlastní. Pokud proměnná není nastavená, tak je extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt; neaktivní. Uložené nápovědy jsou perzistentní - při vypnutí serveru se uloží, po startu znovu načtou do paměti.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SQL==&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; je syntaxe, kterou postres přejímá z analytických databází (zde to snad byla [https://duckdb.org/2022/05/04/friendlier-sql#group-by-all DuckDB]). Pokud se použije tento zápis, tak se automaticky agreguje podle všech sloupců, které nejsou v agregační funkci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT sum(pocet_zen + pocet_muzu), okresy.id, okresy.nazev &lt;br /&gt;
  FROM obce join okresy ON obce.okres_id = okresy.id&lt;br /&gt;
 GROUP BY ALL;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tento zápis může ušetřit dost psaní, může to být také &amp;quot;tichý&amp;quot; zabiják výkonu. Čím více atributů je v klauzuli &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;, tím je agregace pomalejší. Zápis &amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; ještě není ve standardu, ale je standardizační komisí akceptován, a měl by být v některé další verzi ANSI/SQL.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Počínaje Postgresem 19 už nebude možnost používat backlash jako escape symbol v řetězcích. Před 15 roky se přešlo na standardní chování (předtím se řetězce v Postgresu chovali stejně jako v Cčku), nicméně nestandardní chování bylo možné vynutit nastavením &amp;lt;code&amp;gt;standard_conforming_strings&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Mezi top vývojáři Postgresu je hodně velká averze k tzv kompatibility flagům (zmíněný flag nebyl výjimkou) (pozn. u komerčních databází jsou naopak kompatibility flagu standardem, a nejen u nich - např. MySQL). Nyní je tato možnost zrušena, a Cčkové stringy dostaneme pouze jen zápisem (jako tzv extended strings):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;ahoj\nsvete&#039;;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│  ?column?   │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ ahoj\nsvete │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT e&#039;Ahoj\nSvete&#039;;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ Ahoj    ↵│&lt;br /&gt;
│ Svete    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze v u window funkcí &amp;lt;code&amp;gt;lead&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lag&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;first_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last_value&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;nth_value&amp;lt;/code&amp;gt; použít klauzuli &amp;lt;code&amp;gt;IGNORE NULLS&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;. Výchozí chování, které bylo implementováno již dříve odpovídá klauzuli &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SQL/PGQ==&lt;br /&gt;
&amp;lt;p&amp;gt;V tomto případě PG není častým prefixem symbolizujícím Postgres (a Q jako queue), ale Property Graph Queries. Počínaje podporou neatomických datových typů v SQL:2000, přes podporu XML v SQL:2003 se standard rozšířil nad rámec čistě relačních databází (stejně ale už dříve existovala kritika SQL z pohledu čistoty od relačních dogmatiků). Standard SQL:2023 (ISO/IEC 9075-16:2023) SQL rozšiřuje o podporu grafových databází, které mají svůj vlastní datový model odlišný od relačního modelu. Přijde mi to jako dost odvážný krok (a ještě teď tomu nemohu úplně uvěřit). Zatím existovala zřetelná jednota mezi SQL a relačním modelem. Od nové části standardu se očekává, že pomůže s přehlednějším zápisem určitých dotazů, které se až doposud řešily pomocí rekurze. Přiznám se, že zápis dotazu v PGQ (využívajícího ascii art) mi přijde hodně cizí (možná zažívám pocity programátora v Cobolu, když se poprvé podíval na SQL. Osobně mi to nesedí - reprezentaci znalostí ve formátu grafu jsem nikdy nemusel (vím, že je to jen jiná reprezentace téhož)). Row pattern recognition z roku SQL:2016 toho také nemá s relačními databázemi moc společného, takže to takové překvapení není. Práce na této části standardu začaly v roce 2017 (a integrovaly se prvky jazyka [https://neo4j.com/docs/cypher-manual/current/introduction/cypher-overview/ Cypher] (Neo4j) a [https://docs.oracle.com/en/database/oracle/property-graph/20.4/spgdg/property-graph-query-language-pgql.html#GUID-301FF092-1A07-43D2-91E5-0C5AFF3467CC PGQL] (Oracle)).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Základem grafových databází je graf skládající se z uzlů a hran. Ka každému uzlu i hraně mohou být přiřazeny atributy (properties). Hrany mohou být orientované i neorientované. Standard pro takové grafy používá termín Property Graphs. Graf se definuje příkazem &amp;lt;code&amp;gt;CREATE PROPERTY GRAPH&amp;lt;/code&amp;gt; a je to určitá forma pohledu. Přesto, že jsem zkoušel poměrně triviální příklad, nebylo pro mne intuitivní napsat SQL/PGQ dotaz. Pro uživatele bez zkušenosti s Neo4j nebo jinou grafovou databází budou začátky s SQL/PGQ dost bolestivé. V tuto chvíli (duben 2026) ještě není hotová dokumentace. Je možné, že se díky integraci SQL/PGQ do Postgresu setkám s grafovými databázemi častěji (SQL/PGQ je podporováno v DuckDB a v Oracle):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE public.uzivatele (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  jmeno character varying&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE public.zpravy (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  odesilatel integer,&lt;br /&gt;
  prijemce integer,&lt;br /&gt;
  tema text&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- uzivatel - odeslal -&amp;gt; uzivatel&lt;br /&gt;
CREATE PROPERTY GRAPH public.pg1&lt;br /&gt;
  VERTEX TABLES (&lt;br /&gt;
    public.uzivatele AS uzivatel KEY (id) PROPERTIES (id, jmeno)&lt;br /&gt;
  )&lt;br /&gt;
  EDGE TABLES (&lt;br /&gt;
    public.zpravy AS odeslal KEY (id)&lt;br /&gt;
    SOURCE KEY (odesilatel) REFERENCES uzivatel (id)&lt;br /&gt;
    DESTINATION KEY (prijemce) REFERENCES uzivatel (id)&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (1, &#039;Pavel&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (2, &#039;Zdenek&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (3, &#039;Tomas&#039;);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.zpravy VALUES (1, 1, 2, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (2, 2, 1, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (3, 1, 3, &#039;dotaz ohledne dopravy&#039;);&lt;br /&gt;
&lt;br /&gt;
-- od koho uzivatel Pavel dostal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) &amp;lt;-[IS odeslal]- (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
└────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- komu uzivatel Pavel poslal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) -[IS odeslal]-&amp;gt; (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
│ Tomas  │&lt;br /&gt;
└────────┘&lt;br /&gt;
(2 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Osobně si nedovedu představit, že bych psal dotazy v SQL/PGQ (myslím, že podobně na tom bude většina uživatelů podobně). Je otázkou, jestli se SQL/PGQ neuplatní ve spolupráci s AI. V tomto případě se běžný dotaz rozpadá do dvou kroků. Navíc i joinovací podmínka získává label, takže je to v určitém smyslu více popisné, než běžné SQL, a je tak možné, že tento zápis bude AI více sedět.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pomalu se pokračuje na implementaci tzv temporálních tabulek. Letos je to podpora klauzule &amp;lt;code&amp;gt;FOR PORTION OF valid_at FROM TO&amp;lt;/code&amp;gt;. Zjednodušeně, pokud máme temporální databáze nebo temporální tabulky, tak se můžeme podívat na stav dat v nějakém čase. Pokud se použije klauzule &amp;lt;code&amp;gt;FOR PORTION OF FROM TO&amp;lt;/code&amp;gt;, tak se jedná o tzv temporální &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- je nutne mit nainstalovanou extenzi btree_gist&lt;br /&gt;
CREATE TABLE ceny(&lt;br /&gt;
  id int,&lt;br /&gt;
  valid_at daterange,&lt;br /&gt;
  nazev text,&lt;br /&gt;
  cena int,&lt;br /&gt;
  PRIMARY KEY (id, valid_at WITHOUT OVERLAPS)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
-- jednotna cena mezi 2020-01-01 a 2025-12-31&lt;br /&gt;
INSERT INTO ceny VALUES(1, &#039;[2020-01-01,2026-01-01)&#039;, &#039;pecivo&#039;, 20);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- uprava ceny mezi 2021-01-01 a 2021-02-28&lt;br /&gt;
UPDATE ceny&lt;br /&gt;
   FOR PORTION OF valid_at FROM &#039;2021-01-01&#039; TO &#039;2021-03-01&#039;&lt;br /&gt;
   SET cena = 30&lt;br /&gt;
 WHERE id = 1;&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny ORDER BY valid_at;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2021-01-01) │ pecivo │   20 │&lt;br /&gt;
│  1 │ [2021-01-01,2021-03-01) │ pecivo │   30 │&lt;br /&gt;
│  1 │ [2021-03-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nové datové typy a funkce==&lt;br /&gt;
&amp;lt;p&amp;gt;V Postgresu se můžete setkat s datovými typy s prefixem &amp;lt;code&amp;gt;reg&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;regrole&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regproc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regclass&amp;lt;/code&amp;gt;. Tyto datové typy jsou vždy spojeny s jednou konkrétní systémovou tabulkou a hodnoty těchto typů vždy nesou unikátní číselný identifikátor databázového objektu. Tyto typy podporují přetypování z textu, což se používá pro zkrácený zápis vyhledávání nějakého databázového objektu v katalogu. Nově můžeme používat typ &amp;lt;code&amp;gt;regdatabase&amp;lt;/code&amp;gt; a tento typ se odkazuje, jak je patrné z názvu, na tabulku &amp;lt;code&amp;gt;pg_database&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ regdatabase │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ template1   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase::oid;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT oid&lt;br /&gt;
 FROM pg_database &lt;br /&gt;
 WHERE datname = &#039;template1&#039;;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Díky těmto typům jsou dotazy nad systémovým katalogem kratší a čitelnější. Navíc autor dotazů nemusí brát v potaz některé detaily (jako například case sensitivitu), kde se chování SQL identifikátorů liší od SQL stringů. To je ošetřeno interně při přetypování.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce &amp;lt;code&amp;gt;error_on_null&amp;lt;/code&amp;gt; vyhodí výjimku, pokud je parametr NULL. Jinak vrátí hodnotu parametru. Implementace je extrémně jednoduchá - sleduje flag &amp;lt;code&amp;gt;isnull&amp;lt;/code&amp;gt;. Každý parametr každé SQL funkce má tento flag. Stejné chování má flag funkce &amp;lt;code&amp;gt;STRICT&amp;lt;/code&amp;gt;. Je tu drobná zrada. V případě kompozitních typů to není kompatibilní s operátorem &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;. Kompozitní hodnota obsahující pouze &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;y je interně ne nullová, ale operátor &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt; pro takovou kompozitní hodnotu vrátí &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT ROW(NULL, NULL) IS NULL;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT error_on_null(NULL::integer);&lt;br /&gt;
ERROR:  null value not allowed&lt;br /&gt;
SELECT error_on_null(ROW(NULL, NULL));&lt;br /&gt;
┌───────────────┐&lt;br /&gt;
│ error_on_null │&lt;br /&gt;
╞═══════════════╡&lt;br /&gt;
│ (,)           │&lt;br /&gt;
└───────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Roky se v Postgresu mluví o tom, že by měl existovat snadný způsob, jak zpětně z databázového objektu vygenerovat DDL příkaz. Osobně jsem nikdy tuhle potřebu neměl, ale do jisté míry této potřebě rozumím. Skoro v každém admin nástroji můžete iterovat přes databázové objekty a k nim si nechat zobrazit DDL. A skoro každý admin tool, pak tuto funkcionalitu duplicitně implementuje - s chybami nebo bez chyb. Je to kód, který vyžaduje neustálou údržbu a aktualizace. Po letech diskuzí se je v upstreamu první část funkcí &amp;lt;code&amp;gt;pg_get_...ddl&amp;lt;/code&amp;gt; (aktuálně &amp;lt;code&amp;gt;pg_get_database_ddl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pg_get_role_ddl&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_get_tablespace_ddl&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT pg_get_role_ddl(&#039;pavel&#039;);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                       pg_get_role_ddl                                        │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ CREATE ROLE pavel SUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS; │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze je v postgresu funkce generující náhodné číslo v zadaném rozsahu. K nim nyní přibyly funkce pro rozsah typů &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;timestamptz&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SELECT random(current_date - 6, current_date);&lt;br /&gt;
┌────────────┐&lt;br /&gt;
│   random   │&lt;br /&gt;
╞════════════╡&lt;br /&gt;
│ 2026-04-13 │&lt;br /&gt;
└────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT random(current_timestamp - interval &#039;1 week&#039;, current_timestamp);&lt;br /&gt;
┌───────────────────────────────┐&lt;br /&gt;
│            random             │&lt;br /&gt;
╞═══════════════════════════════╡&lt;br /&gt;
│ 2026-04-09 02:30:30.665819+02 │&lt;br /&gt;
└───────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Optimalizace==&lt;br /&gt;
&amp;lt;p&amp;gt;Jako nejdůležitější optimalizaci v nové verzi vidím optimalizaci implementace kontroly referenční integrity. RI je v postgresu realizována v systémových řádkových triggerech, které, až doposud, provedly (pro každý řádek) jeden kontrolní SQL příkaz (s použitím SPI API - stejné API, které se používá např. v PL/pgSQL). Nově se hledá přímo v indexech - přeskakuje se celý aparát SQL. To je první výrazná optimalizace. Druhou výraznou optimalizací je hledání nikoliv jedné hodnoty, ale pole hodnot (n = 64). Podle autora patche je nyní kontrola referenční integrity cca 3x rychlejší. Pořád to bude znát. Výrazně se ale posune hranice, od kdy se vyplatí při masivních importech kontrolu referenční integrity vypínat.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE tab_a(id int PRIMARY KEY);&lt;br /&gt;
INSERT INTO tab_a SELECT generate_series(1,1000);&lt;br /&gt;
VACUUM ANALYZE tab_a;&lt;br /&gt;
&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b_no_ri(id int, a_id int);&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b(id int, a_id int references tab_a(id));&lt;br /&gt;
\timing&lt;br /&gt;
-- postgres 18&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 12844,206 ms (00:12,844)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 659,462 ms&lt;br /&gt;
&lt;br /&gt;
-- postgres 19&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 2728,073 ms (00:02,728)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 673,444 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ukázkový test je best case - zrychlení je cca čtyřnásobné. Stále je import s RI cca 4x pomalejší než bez RI (a to cílová tabulka obsahuje pouze jeden cizí klíč). V praxi to bude jiné - kromě RI je náročná i aktualizace indexů a samozřejmě všechny diskové operace.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Určitě každý, kdo pracuje s Postgresem trochu déle, se setkal s doporučením &amp;quot;nepoužívej &amp;lt;code&amp;gt;NOT IN (SELECT ...&amp;lt;/code&amp;gt;&amp;quot;. Důvodem byla (v některých případech) &amp;quot;špatná&amp;quot; optimalizace. Optimalizátor neměl garanci, že subselect nevrátí &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;. Poté, co se ve verzi 18 přepsal systém pro ukládání omezujících pravidel (constraints), už bylo možné do tuto informaci v optimalizátoru použít. Nyní se by se měl subselect &amp;lt;code&amp;gt;NOT IN&amp;lt;/code&amp;gt; transformovat na tzv anti-join (v těch případech, kdy je garantováno, že žádná proměnná v predikátu nebude &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;). Jinými slovy, pokud optimalizátor bude mít garance, že se v predikátu subselectu nevyskytne &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, tak vygeneruje stejný plán, jako kdybyste použili zápis s &amp;lt;code&amp;gt;NOT EXISTS&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE osoby(id int PRIMARY KEY, jmeno varchar);&lt;br /&gt;
CREATE TABLE faktury(id int primary key,&lt;br /&gt;
                     vlozeno timestamp,&lt;br /&gt;
                     podal int REFERENCES osoby(id) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT *&lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE id NOT IN (SELECT podal&lt;br /&gt;
                            FROM faktury);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT * &lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE NOT EXISTS(SELECT podal &lt;br /&gt;
                            FROM faktury&lt;br /&gt;
                           WHERE podal = osoby.id);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
-- ve starších verzích dostanete různé plány&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ve starších verzích spojení relací vždy předcházelo agregaci. To v některých případech může být neefektivní (pokud agregace výrazně redukuje počet řádek). Pokud jsem chtěl změnit pořadí operací, musel jsem si to vynutit zápisem (poddotazem). V devatenáctce optimalizátor podporuje tzv předběžnou agregaci (eager aggregation), která předbíhá před join:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT sum(pocet_zen + pocet_muzu), okresy.nazev &lt;br /&gt;
                  FROM okresy JOIN obce ON okresy.id = obce.okres_id&lt;br /&gt;
                 GROUP BY okresy.nazev;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                                QUERY PLAN                                                │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Finalize HashAggregate  (cost=157.38..158.15 rows=77 width=18)                                           │&lt;br /&gt;
│   Group Key: okresy.nazev                                                                                │&lt;br /&gt;
│   -&amp;gt;  Hash Join  (cost=3.02..157.00 rows=77 width=18)                                                    │&lt;br /&gt;
│         Hash Cond: ((obce.okres_id)::text = okresy.id)                                                   │&lt;br /&gt;
│         -&amp;gt;  Partial GroupAggregate  (cost=0.28..154.05 rows=77 width=15)                                 │&lt;br /&gt;
│               Group Key: obce.okres_id                                                                   │&lt;br /&gt;
│               -&amp;gt;  Index Only Scan using obce_okres_id_idx on obce  (cost=0.28..122.03 rows=6250 width=7) │&lt;br /&gt;
│         -&amp;gt;  Hash  (cost=1.77..1.77 rows=77 width=17)                                                     │&lt;br /&gt;
│               -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.77 rows=77 width=17)                                 │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(9 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Na datech pro ČR je výše uvedený dotaz cca 3x rychlejší (v pg19 vůči pg18).&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud je jeden řádek zamčený vícero transakcemi, tak se do jeho systémového atributu &amp;lt;code&amp;gt;xmax&amp;lt;/code&amp;gt; uloží tzv &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; (MultiXact je &amp;quot;aparát&amp;quot;, kterým se v Postgresu implementují řádkové zámky). To je unikátní identifikátor skupiny transakcí, které drží zámek. Každá skupina transakcí se skládá z tzv členských záznamů &amp;lt;code&amp;gt;MultiXactMember&amp;lt;/code&amp;gt;, ve kterých se drží identifikátor transakce, typ zámku a stav transakce. Také tyto záznamy mají své unikátní id &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Doposud &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; byla 32bitová hodnota. Nově je tato hodnota 64bitová, a nehrozí její přetečení. &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; i id transakcí jsou stále 32bitové hodnoty (existuje několik rozpracovaných řešení, které zvyšují jejich rozsah), takže stále hrozí přetečení těchto id, a nastartování vynuceného freezování (což u více zatížených systémů může způsobit problémy s produkcí). Eliminovala se ale možnost přetečení &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Je tp důležité, protože &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; rostl ze všech zmíněných id nejrychleji (pokud &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; je počet transakcí se sdílenými zámky, pak růst &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; je &amp;lt;code&amp;gt;nxn&amp;lt;/code&amp;gt;). Informace o MultiXact (skupinách transakcí) lze získat novou funkcí &amp;lt;code&amp;gt;pg_get_multixact_stats()&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přepracoval se kód, který implementuje příkazy &amp;lt;code&amp;gt;LISTEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NOTIFY&amp;lt;/code&amp;gt;. Předchozí verze probouzely každý proces, který čekal na notifikaci (bez ohledu na to jestli čekal nebo nečekal na kanálu, který dostal notifikaci). Stará implementace fungovala dobře, pokud počet použitých kanálů byl malý, a tudíž byla i malá šance, že se probudí proces, který čeká na jiném kanálu než je aktuální notifikace. Uživatelé ale začali notifikace používat i jinak, a reportovali výrazné zpomalení pokud větší množství klientů poslouchalo na větším množství různých kanálů. Ve zprávě ke patchi je uvedeno zpomalení (pro 1 klienta 9100 TPS, pro 1000 klientů 200 TPS). Nová implementace ve sdílené paměti ke každému kanálu drží seznam čekajících klientů. V případě zprávy do některého kanálu se probudí pouze procesy, které na tomto kanálu poslouchají (i zde je vidět pokles TPS, ale výrazně menší - pro 1000 klientů 9000 TPS).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Výchozí komprimace TOASTu bude &amp;lt;code&amp;gt;lz4&amp;lt;/code&amp;gt; (namísto &amp;lt;code&amp;gt;pglz&amp;lt;/code&amp;gt;). LZ4 je jako volba už cca 5 let, a měla by být efektivnější (jak v komprimaci, tak ve využití CPU) než původní LZ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Postupně víc funkcí je akcelerováno pomocí SIMD. Nově to jsou funkce &amp;lt;code&amp;gt;hex_encode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hex_decode&amp;lt;/code&amp;gt; a parsování csv, tsv formátů příkazu &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; (hledání speciálních znaků).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Některé extenze, jako např. &amp;lt;code&amp;gt;pgstattuple&amp;lt;/code&amp;gt;, nově používají direct API pro čtení dat (implementované v pg18). Na systémech s rychlým IO by měly běžet rychleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Na základě reportů uživatelů se upravila implementace hashjoinu, tak aby nedocházelo k extrémnímu nárůstu alokace paměti v případech, kdy atribut použitý pro spojení relací obsahuje velké množství &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; hodnot.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V těch případech, kdy je garantováno, že porovnávané hodnoty jsou ne nullové, tak se operátor &amp;lt;code&amp;gt;IS DISTICT FROM&amp;lt;/code&amp;gt; nahradí operátorem &amp;lt;code&amp;gt;&amp;lt;&amp;gt;&amp;lt;/code&amp;gt;, případně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM&amp;lt;/code&amp;gt; operátorem &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;. Tady je otázkou, jaký bude reálný dopad. Jako programátor používám &amp;lt;code&amp;gt;IS [ NOT ] DISTINCT FROM&amp;lt;/code&amp;gt; jedině v těch případech, které komplikují potenciální NULLy. Je ale pravdou, že drtivou většinu SQL, dnes generují ORM frameworky, ktere nemusí mít vždy dostatečnou chytrost. Výraz &amp;lt;code&amp;gt;IS DISTINCT FROM NULL&amp;lt;/code&amp;gt; se nyní transformuje na &amp;lt;code&amp;gt;IS NOT NULL&amp;lt;/code&amp;gt;, obdobně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM NULL&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Replikace==&lt;br /&gt;
&amp;lt;p&amp;gt;Dlouhodobým cílem implementace logické replikace je podpora multimaster řešení. Zatím je k tomu ještě dlouhá cesta. Chybí podpora replikace DDL příkazů, plná podpora sekvencí, plná podpora řešení replikačních kolizí. Postupuje se v malých krocích. Letos je to podpora jednorázového refrešnutí sekvencí &amp;lt;code&amp;gt;ALTER SUBSCRIPTION ... REFRESH SEQUENCES&amp;lt;/code&amp;gt;. S multimasterem to úplně nepomůže, ale může to zjednodušit upgrade skrze logickou replikaci.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Novým příkazem je příkaz &amp;lt;code&amp;gt;WAIT FOR&amp;lt;/code&amp;gt;, který je možné použít na replikách, a který zajistí čekání na zreplikování zadané transakce. Lze nastavit timeout. Parametrem &amp;lt;code&amp;gt;NO_THROW&amp;lt;/code&amp;gt; zajistí tiché (bez výjimky) ukončení příkazu po timeoutu (změní se pouze vrácená hodnota):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# WAIT FOR LSN &#039;0/306EE20&#039; WITH (TIMEOUT &#039;100ms&#039;, NO_THROW);&lt;br /&gt;
 status&lt;br /&gt;
--------&lt;br /&gt;
 timeout&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V příkazu &amp;lt;code&amp;gt;CREATE PUBLICATION ... FOR ALL TABLES&amp;lt;/code&amp;gt; je nyní možné použít klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE (t1, ...)&amp;lt;/code&amp;gt;. Klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE&amp;lt;/code&amp;gt; lze použít i v příkazu &amp;lt;code&amp;gt;ALTER PUBLICATION&amp;lt;/code&amp;gt;. Pro registraci odběru (&amp;lt;code&amp;gt;CREATE SUBSCRIPTION&amp;lt;/code&amp;gt;) lze místo explicitního connection stringu použít odkaz na dříve definovaný FDW server.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V pohledu &amp;lt;code&amp;gt;pg_replication_slots&amp;lt;/code&amp;gt; je nový sloupec &amp;lt;code&amp;gt;slotsync_skip_reason&amp;lt;/code&amp;gt; popisující důvod, proč nebylo možné synchronizovat repliku. V tom případě bude obsahovat jednu z následujících hodnot: &amp;lt;code&amp;gt;wal_or_rows_removed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wal_not flushed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;no_consistent_snapshot&amp;lt;/code&amp;gt; nebo 	&amp;lt;code&amp;gt;slot_invalidated&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud při registraci odběru nastavíme parametr &amp;lt;code&amp;gt;retain_dead_tuples&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; (výchozí nastavení je &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;), budou se detekovat kolize update-delete, kdy nedojde k update z důvodu smazaného řádku. Pozor, tato volba dočasně blokuje vakuování zrušených řádků (zvlášť pokud je replika nedostupná a nedochází k synchronizaci). Lze nastavit timeout &amp;lt;code&amp;gt;max_retention_duration&amp;lt;/code&amp;gt;, samozřejmě po timeoutu může dojít k neidentifikovan0 kolizi update-delete. Bez detekce této kolize může dojít k tiché nekonzistenci obsahu napříč různými zdroji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ostatní==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; podporuje formát &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt; (pouze export).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT JSON&lt;br /&gt;
{&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT (FORMAT JSON, FORCE_ARRAY)&lt;br /&gt;
[&lt;br /&gt;
 {&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nyní také tento příkaz podporuje volbu &amp;lt;code&amp;gt;ON_ERROR SET_NULL&amp;lt;/code&amp;gt;, která způsobí ignorování hodnot, na kterých selže typová konverze. To je možné díky tomu, že se již dříve zavedla podpora tzv měkkých chyb (soft errors). Tyto chyby lze ošetřit s řádově menší režií než běžné chyby (nejsou potřeba subtransakce). Podpora soft errors se v Postgresu objevila s podporou klauzule &amp;lt;code&amp;gt;ON ERROR&amp;lt;/code&amp;gt; SQL/JSON funkcí. V plánu je podpora error safe přetypování (&amp;lt;code&amp;gt;CAST expr AS type xxx DEFAULT expr ON CONVERSION ERROR&amp;lt;/code&amp;gt;). Prvním nezbytným krokem je požadavek, aby konverzní funkce používaly měkké chyby. To teď v upstreamu je, a díky tomu, bylo i relativně jednoduché implementovat &amp;lt;code&amp;gt;COPY ON_ERROR SET_NULL&amp;lt;/code&amp;gt; (error safe casts by měly být v pg20).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, b int);&lt;br /&gt;
&lt;br /&gt;
COPY foo FROM stdin (FORMAT csv, ON_ERROR SET_NULL);&lt;br /&gt;
Enter data to be copied followed by a newline.&lt;br /&gt;
End with a backslash and a period on a line by itself, or an EOF signal.&lt;br /&gt;
&amp;gt;&amp;gt; 10,20&lt;br /&gt;
&amp;gt;&amp;gt; 30,40&lt;br /&gt;
&amp;gt;&amp;gt; ahoj,20&lt;br /&gt;
&amp;gt;&amp;gt; \.&lt;br /&gt;
COPY 3&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM foo;&lt;br /&gt;
┌────┬────┐&lt;br /&gt;
│ a  │ b  │&lt;br /&gt;
╞════╪════╡&lt;br /&gt;
│ 10 │ 20 │&lt;br /&gt;
│ 30 │ 40 │&lt;br /&gt;
│  ∅ │ 20 │&lt;br /&gt;
└────┴────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově také příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; umožňuje číst přímo partišny (partitions). V předchozích verzích bylo nutné použít syntax s vloženým selectem, což má nějakou režii.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce pro zakódování a dekódování textu (&amp;lt;code&amp;gt;encode&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;decode&amp;lt;/code&amp;gt;) nově podporují kódování &amp;lt;code&amp;gt;base64url&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;base32hex&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 41686f6a3c3e2f2b │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base64url&#039;);&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│   encode    │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ QWhvajw-Lys │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base32hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 85K6UQHS7ONIM=== │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dokončit implementaci standardu SQL/JSON, konkrétně implementaci funkce &amp;lt;code&amp;gt;JSON_TABLE&amp;lt;/code&amp;gt; se opět nestihlo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;psql&amp;lt;/code&amp;gt; bude možnost si nastavit zobrazení logických hodnot &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Datový typ &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; akceptuje literály &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Na výstupu se zobrazuje pouze &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
\pset display_true true&lt;br /&gt;
Boolean true display is &amp;quot;true&amp;quot;.&lt;br /&gt;
\pset display_false false&lt;br /&gt;
Boolean false display is &amp;quot;false&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ true     │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT 1 &amp;lt;&amp;gt; 1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ false    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Může se hodit možnost si zobrazit &amp;lt;code&amp;gt;search_path&amp;lt;/code&amp;gt; v promptu. V promptu je také možnost použít symbol &amp;lt;code&amp;gt;%i&amp;lt;/code&amp;gt;, který se nahradí replikačním statusem (&amp;lt;code&amp;gt;primary&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;standby&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PL/pgSQL==&lt;br /&gt;
&amp;lt;p&amp;gt;PL/pgSQL je relativě stabilizované prostředí, kde je každoročně jen minimum změn. Letos je to jedna malá (a pro většinu uživatelů zanedbatelná změna), a jedna &amp;quot;velká&amp;quot;, která ale interně žádnou změnou není.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou změnou je interní optimalizace exekuce embedded SQL ve tvaru  &amp;lt;code&amp;gt;SELECT výraz INTO proměnná&amp;lt;/code&amp;gt;. Mám pocit, že tento zápis se používal v Sybase a na Sybase navazujících databázích pro inicializaci proměnných. Já jsem se s tímto zápisem setkával v literatuře někdy kolem roku 2000, a už tehdy platilo doporučení tento zápis nepoužívat (v plpgsql se nikdy moc nepoužíval). V posledních letech přišlo víc uživatelů z MSSQL (začalo se migrovat víc aplikací z tohoto serveru), tento zápis používali a zjistili, že tento zápis je cca 20x pomalejší než &amp;quot;nativní&amp;quot; přiřazení &amp;lt;code&amp;gt;proměnna := výraz&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Interně jsou v PL/pgSQL dvě metody jak vyhodnotit výraz. Tzv simple metoda, kde se přeskočí SQL exekutor a přímo zavolá exekutor výrazů, je výrazně rychlejší. Druhou metodou je běžná exekuce skrze SQL exekutor (a SPI API). Až doposud, cokoliv co v zdrojovém kódu funkce bylo SQL příkazem (zde příkazem &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;) se vykonalo běžnou cestou. Nově se detekuje výše zmíněný zápis a vykoná se simple metodou. Pro dlouholeté uživatele Postgresu to nic neznamená, ale lidem, kteří migrují z MSSQL, to může zpříjemnit život.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Druhou, a naopak, velkou změnou je možnost inliningu funkce, která je napsaná v PL/pgSQL (ve speciálních případech). Inlining v kontextu Postgresu je trochu něco jiného než si uživatele představí pod termínem inlining. V Postgresu mohou být funkce volané z nějakého SQL příkazu - typicky příkazu &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;. Pokud nějaká funkce podporuje inlining, tak to znamená, že v AST stromu dotazu se volání funkce nahradí jejím tělem. Teprve pak nastupuje optimalizace, a díky inliningu vlastně optimalizátor vidí dovnitř funkce (jinak je funkce pro optimalizátor black box).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;K tomu, aby PL/pgSQL (nejen v PL/pgSQL) funkce mohla být inlinovaná, potřebujete vlastní kód v Cčkové extenzi. A je to vlastně trik (v tomto případě dost nestydatý podfuk :-)). Už dříve bylo možné napsat extenze, které dodávaly optimalizátoru znalost o vybraných funkcích (jinak, opět, pro optimalizátor, jsou funkce black box). Přímo v jádru je například podpora optimalizátoru pro funkci &amp;lt;code&amp;gt;generate_series&amp;lt;/code&amp;gt; (staré verze pg by v rows měly 1000).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT * FROM generate_series(1,3);&lt;br /&gt;
┌────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                             QUERY PLAN                             │&lt;br /&gt;
╞════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Function Scan on generate_series  (cost=0.00..0.03 rows=3 width=4) │&lt;br /&gt;
└────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Inlining byl dřive podporován pro funkce v jazyku SQL, kdy si planner vytáhl zdrojový kód funkce. V devatenáctce planner může zavolat extenzi, a může si říct nejen o detailnější parametry ohledně exekuce, ale může si říct o substituční SQL. Když ho dostane, tak funkci dále neřeší, a pracuje se substitučním SQL příkazem. Je to docela magie, nicméně efektivní. Kód extenze se volá až v momentu, kdy známe konstantní parametry funkce, a extenze se může rozhodnout - zavolej volanou funkci, nebo zavolej nějaké SQL, zavolej jinou funkci, případně vrať rovnou nějakou speciální hodnotu &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, 0, ... Je to i způsob, jak opravdu efektivně pracovat s dynamickým SQL. Musíte si ovšem napsat kód v Cčkové extenzi. Požadavek na tuto funkcionalitu přišel od vývojářů PostGISu. Cílem jsou optimalizace v PostGISu, dá se to ale použít i jinde. Časem si dovedu představit i nějakou contrib extenzi, která by tuto možnost zpřístupnila i bez nutnosti psát si vlastní extenzi. Škoda, že nemám autoritu vývojářů PostGISu. Dovedl bych si představit podobný trik v analyzátoru. Dost by mi to pomohlo s Orafce. V té pozici samozřejmě nejsem.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vývoj==&lt;br /&gt;
&amp;lt;p&amp;gt;Každoročně dochází k čištění kódu. Občas se zruší podpora některé platformy. Výjimečně se přidá podpora nové platformy nebo jako v případě pg19 se vrátí podpora dříve odstraněné platformy (AIX - operační systém AIX přestal být podporovaný v pg17 díky nezájmu IBM. Pak se ale v IBM chytli za nos, dodali počítač do testovací farmy, a do AIXu přidali aktualizovaný software potřebný k buildu Postgresu). Další čistky v kódu lze provést přechodem na novější verzi programovacího jazyka - přechodem z C99 na C11 (bohužel to může znamenat, že starých platformách se nové verze Postgresu nepřeloží). Interní datový typ &amp;lt;code&amp;gt;Datum&amp;lt;/code&amp;gt; až do předchozí verze byl 4bajtový na 32bitových platformách a 8bajtový na 64bitových platformách. Nově je 8bajtový na všech podporovaných platformách. Určitě nezanedbatelná část kódu se generuje z definičních souborů. Nově se z definic generuje kód definující konfigurační proměnné. Údržba, verzování, zajištění konzistence definičních souborů je násobně jednodušší než údržba adekvátního kódu v Cčku. Dynamická alokace paměti bude jednodušší díky funkcím &amp;lt;code&amp;gt;GetNamedDSA&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;GetNamedDSMSegment&amp;lt;/code&amp;gt;. Dynamicky sdílenou paměť lze sledovat skrze pohled &amp;lt;code&amp;gt;pg_dsm_registry_allocations&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Mám pocit, že vývoj Postgresu ještě víc zrychlil - je vidět mnohem víc patchů od lidí z Asie (dříve to bylo spíš jenom Japonsko), a o to víc se naráží na kapacitu committerů. Je to paradox, který nejde jednoduše řešit. Postgres je populární díky funkcionalitě a stabilitě. Stabilita je díky pečlivé práci commitetterů (důkladně se řeší každý řádek kódu). Díky popularitě je více programátorů, kteří píší více kódu, více patchů, ale committeři nestíhají, a tak patche zůstávají relativně dlouho ve frontě. Což frustruje programátory. Patch napíšete během měsíce, během měsíce se dá udělat finalizace a pár iterací s committerem, ale mezitím několik měsíců (v horším případě let (3 roky i v případě bezproblémového malého patche)), čekáte, až si na vás některý z committerů udělá čas. Celou dobu musíte udržovat patch v aplikovatelném stavu, musíte reagovat na případné diskuze, musíte sledovat vývoj a případně aktualizovat patch. Je to problém o kterém se ví, diskutuje se o něm, ale není úplně jasné, co by mělo být řešení. Minimálně se zlepšila evidence patchů, která pokrývá i automatické testování na několika různých platformách. Tady je velká klika, že Postgres má extenze. Neskutečně velký objem kódu (funkcionality) je dnes možné řešit skrz extenze mimo komunitu - což výrazně snižuje tlak na committery. V extenzích toho jde udělat hodně, bohužel, ne všechno. Na druhou stranu, extenze také nejsou bez rizika. Určitým způsobem zvyšují fragmentaci ekosystému Postgresu, který pak ztrácí přehlednost (plus ne všechny extenze jsou dostupné v cloudu). Zase, díky tomu je jádro Postgresu stále ještě rozumně velké. O Oracle kolují zvěsti, že jádro má 14 miliónů řádek, Postgres pod 2 milióny. Náklady na údržbu Postgresu jsou výrazně menší. Kompilace zdrojáků je do 5 minut, regresní testy v největším rozsahu běží 15 minut. S tím ještě lze nějak rozumně pracovat. O Oracle jsem slyšel, že regresní testy běží den.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Popularita Postgresu jde aktuálně až do absurdna. Z Linkedinu mám pocit, že začíná být přepostgresováno (samozřejmě z mé perspektivy a v mé bublině). Hromada příspěvků vygenerovaných AI jsou banality na úrovni žáka prvního stupně (Postgres má VACUUM, indexy jsou super, dotazy mohou být pomalé, atd atd). Doporučení typu - proč ne Redis, proč ne Elastic, na všechno použijte Postgres. Viděl jsem hromadu clickbaitových článků typu - multigenerační architektura Postgresu je tragická, ale s naší AI nebo s naším supportem nebudete mít problém, atd atd. Postgresu dnes rozumí každý, kdo dokáže do AI napsat Postgres. Měl jsem tu možnost vidět naprosto neadekvátní doporučení ohledně konfigurace (dnes nevíte jestli důvodem je neznalost autora nebo naopak jeho vychytralost a snaha o co nejvíc komentářů případně o troling). Historicky popularita Postgresu rostla ve stínu MySQL, Monga a dalších databází a roky byl Postgres ušetřený mediálního balastu. To bohužel už není pravda. Pořád platí, že Postgres je dobrá databáze, stabilní, relativně rychlá, která se ale rozhodně nehodí na vše. Má svoje limity, které je dobré znát, a rozhodně nemůže ve všech ohledech (ve větším rozsahu) nahradit Redis, MySQL nebo Mongo případně Kafku. To je nesmysl, a není to ani cílem komunity. Základem jakékoliv práce je znát limity, chování, a správně v souladu s celkem, používat správné nástroje.&amp;lt;/p&amp;gt;&lt;br /&gt;
----------&lt;br /&gt;
&amp;lt;DPL&amp;gt;category=Verze PostgreSQL&amp;lt;/DPL&amp;gt;&lt;br /&gt;
[[Category:Články]]&lt;br /&gt;
[[Category:Verze PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1588</id>
		<title>PostgreSQL 19 (2026)</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1588"/>
		<updated>2026-05-10T03:19:06Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: /* Administrace */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;i&amp;gt;Autor: Pavel Stěhule&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;O předchozích verzích jsem napsal, že změny byly primárně interní. Z pohledu uživatele, který chce vidět novou SQL syntax, se toho v posledních verzích moc nestalo. Devatenáctka je jiná. Tam je viditelných změn opravdu hodně. Jako každý rok - nová verze je pelmel nových funkcí a různých vylepšení menších nebo větších.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Administrace==&lt;br /&gt;
&amp;lt;p&amp;gt;Bloating tabulek může být problém. Skoro všude jsem se setkal se situací, kdy &amp;quot;mazací&amp;quot; skript přestal fungovat (z různých důvodů), přičemž se tato chyba detekovala příliš pozdě, kdy dotčené tabulky měly místo jednotek GB například desítky GB. To už musí zaúřadovat &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, což často znamená vynucenou plánovanou odstávku (kvůli držení exkluzivního zámku). Je to letitý problém, který zkušenější uživatelé řešili buďto pečlivějším monitoringem, v některých případech partišningem (partitioning), případně extenzemi &amp;lt;code&amp;gt;pg_repack&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt;. Autor posledně jmenované extenze Tonda (Antonín Houska) spolu s Alvarem (Alvaro Herrera) poslední dva roky pracovali na integraci &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt; do jádra Postgresu. Paradoxně příkaz, který bude provádět zdrcnutí tabulek, se bude jmenovat &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt;. Základem je logická replikace - zadaná tabulka se lokálně zreplikuje (vytvoří se její nová kopie, a tím se zbaví vnitřního neobsazeného místa). Co je zásadní, je možnost použít volbu &amp;lt;code&amp;gt;CONCURRENTLY&amp;lt;/code&amp;gt;. S touto volbou příkaz nepoužije exkluzivní zámek. Tudíž je možné jej použít za provozu. Nutnou podmínkou je existence primárního klíče (a unikátního indexu).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
REPACK (CONCURRENTLY, VERBOSE) obce;&lt;br /&gt;
INFO:  repacking &amp;quot;public.obce&amp;quot; in physical order&lt;br /&gt;
INFO:  &amp;quot;public.obce&amp;quot;: found 0 removable, 6250 nonremovable row versions in 59 pages&lt;br /&gt;
DETAIL:  0 dead row versions cannot be removed yet.&lt;br /&gt;
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.&lt;br /&gt;
REPACK&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kromě toho, že příkaz &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt; nahrazuje příkaz &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, tak tento příkaz ještě nahrazuje příkaz &amp;lt;code&amp;gt;CLUSTER&amp;lt;/code&amp;gt;, kterým se tabulka fyzicky (jednorázově) přeuspořádá podle zadaného indexu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Možná jste si všimli, že dotaz běžící pod příkazem &amp;lt;code&amp;gt;EXPLAIN ANALYZE&amp;lt;/code&amp;gt; je výrazně pomalejší. Důvodem je měření času - executor, v tomto režimu, neustále poptává aktuální čas, a to má brutální režii. U větších dotazů se vyplatí použít volbu &amp;lt;code&amp;gt;TIMING OFF&amp;lt;/code&amp;gt;. V 19 na x86 se místo systémového času použíjí takty CPU. Je to výrazně rychlejší - zatímco na osmnáctce mi jednoduchý testovací dotaz běžel 2.5x pomalejší v explainu, na devatenáctce pouze 1.5x pomaleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou velkou změnou je vypnutí JIT ve výchozí konfiguraci. JIT se objevil v Postgresu 11, a v Postgresu 12 byl zapnutý ve výchozí konfiguraci. Bohužel se zjistilo, že většině uživatelů, kteří Postgres používají pro OLTP, dělá víc škody než užitku. Došlo to až do stavu, kdy se uživatelům doporučovalo, neoficiálně, po instalaci JIT vypnout. Je tam víc problémů. &amp;lt;code&amp;gt;clang&amp;lt;/code&amp;gt;, na kterém je to postavené, v novějších verzích kompiluje lépe, ale pomaleji. Existují alternativní implementace JIT, ale všechny jsou více než méně experimentální. Druhým problémem je model, na jehož základě se JIT aktivuje. Tento model jednak nedokáže dobře odhadnout náročnost &amp;quot;jitifikace - inliningu, a navíc je citlivý na přestřelení odhadu počtu řádek. Ohledně modelu a citlivosti na odhady pochybuji, že se dá něco dělat. Alternativní implementace JIT mají výrazně nižší režii. Přijde mi to ale jako slepá cesta. Budoucnost vidím v integraci vektorového executoru a vektorových funkcí (tak jak to používá [https://duckdb.org/ DuckDB]). Může to znamenat, že Postgres bude mít duální implementace funkcí (pro skalární parametr, a pro vektor parametrů).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze vytvořit replikační slot pro logickou replikaci, bez nutnosti mít konfiguraci &amp;lt;code&amp;gt;wal_level=logical&amp;lt;/code&amp;gt;. Postačuje nastavení &amp;lt;code&amp;gt;replica&amp;lt;/code&amp;gt;, což je výchozí nastavení. Jakmile je logický replikační slot aktivní, interně se úroveň zápisu do transakčního logu nastaví na &amp;lt;code&amp;gt;logical&amp;lt;/code&amp;gt;. Jaký je aktuální stav zjistíte v konfigurační proměnné &amp;lt;code&amp;gt;effective_wal_level&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Další bombou je možnost zapínat nebo vypínat kontrolní součty (na úrovni datových stránek) za běhu. Kontrolní součty jsou v Postgresu už relativně dlouho, a ačkoliv na dnešním hardware je jejich režie zanedbatelná, tak určitě bude dost databází, kde nebudou zapnuté. Zapnutí kontrolních součtů vyžadovalo odstávku úměrnou velikosti databáze. Navíc se silně doporučuje po zapnutí součtů znovu zreplikovat všechny fyzické repliky. Výhodou je diagnostika, možnost identifikovat poškozené stránky (a přeskočit je), možnost vyrobit replikovaný server ze starého primárního příkazem &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt;. Naplánovat a provést delší odstávku někde nemusí být jednoduché (nebo to může být skoro nemožné). U jednoho mého klienta zapnutí kontrolních součtů na cca 2TB databázi trvalo cca 2 hodiny (na vlastním hardware z roku 2025). Zapnutí se provede voláním funkce &amp;lt;code&amp;gt;pg_enable_data_checksums&amp;lt;/code&amp;gt;. Nastavením volitelných parametrů lze běh funkce zpomalit, tak aby nepřetěžovala IO. Vypnutí provede funkce &amp;lt;code&amp;gt;pg_disable_data_checksums&amp;lt;/code&amp;gt;. Stav procesu můžeme vidět v pohledu &amp;lt;code&amp;gt;pg_stat_progress_data_checksums&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Snad se už konečně vyřešil problém s upgradem databází obsahující extrémně velký počet LO (large objects). Nově binární upgrade (&amp;lt;code&amp;gt;pg_upgrade&amp;lt;/code&amp;gt;) použije pro export metadat LO příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; místo původní sekvence příkazů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- původní sekvence&lt;br /&gt;
SELECT pg_catalog.lo_create(&#039;5432&#039;);&lt;br /&gt;
ALTER LARGE OBJECT 5432 OWNER TO alice;&lt;br /&gt;
GRANT SELECT ON LARGE OBJECT 5432 TO bob;&lt;br /&gt;
&lt;br /&gt;
-- nově&lt;br /&gt;
COPY pg_catalog.pg_largeobject_metadata (oid, lomowner, lomacl) FROM stdin;&lt;br /&gt;
5432 16384 {alice=rw/alice,bob=r/alice}&lt;br /&gt;
\.&lt;br /&gt;
&lt;br /&gt;
COPY pg_catalog.pg_shdepend (dbid, classid, objid, objsubid, refclassid, refobjid, deptype) FROM stdin;&lt;br /&gt;
5 2613 5432 0 1260 16384 o&lt;br /&gt;
5 2613 5432 0 1260 16385 a&lt;br /&gt;
\.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nová implementace by měla být řádově rychlejší.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konečně se dotáhlo do konce začlenění podpory více formátů v příkazu &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Postgres má dva základní příkazy pro export (backup) - &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Historicky tyto příkazy podporovaly pouze &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; formát. Postupem času &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; získal možnost exportu do &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;dictionary&amp;lt;/code&amp;gt; formátu plus import příkazem &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umožňoval paralelní import více tabulek. &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; byl díky podpoře pouze SQL formátu dost omezený. To se nyní změnilo, a v &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; jsou podporovány všechny formáty, které podporuje &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt;. Vypadá to trochu jako workaround. V případě, že se použije jiný než &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; (SQL) formát, tak se vyrobí adresář, který do podadresářů uloží výstup z &amp;lt;code&amp;gt;pg_dumpu&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umí s touto adresářovou strukturou pracovat. Tato možnost se dostala už do 18tky, ale byla na poslední chvíli stažena.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt; zredukovalo kopírování WAL logů z nového primárního serveru na budovanou repliku a to tak, že se budou kopírovat pouze WAL logy vzniklé po rozpadu replikace. V mnoha scénářích se tím výrazně urychlí běh tohoto příkazu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Doposud autovacuum vybíralo tabulky k vakuování na základě porovnání vypočítaných koeficientů a prahových hodnot. Pořadí vybraných tabulek záleželo na fyzickém pořadí v systémové tabulce &amp;lt;code&amp;gt;pg_class&amp;lt;/code&amp;gt;. Nově se vakuum bude prioritizovat podle míry vzdálenosti od prahu. Dalším kritériem je stáří tabulky (počet transakcí od freeze). Stará implementace byla férová v tom, že garantovala, že každá tabulka bude zvakuovaná a že žádná tabulka nebude &amp;quot;předbíhat&amp;quot; ve frontě. Na druhou stranu se mohlo stát, že tabulka s intenzivnějším provozem čekala příliš dlouho a došlo k zbytečnému bloatingu. Nová implementace se snaží být chytřejší. Uvidíme, jak to bude fungovat. Moje zkušenost je taková, že a) není dobré dávat do Postgresu příliš dynamická data, b) je dobré si nastavit počet aktivních autovacuum workerů tak, aby byla určitá rezerva, c) není dobré vytěžovat IO na maximum (je dobré mít dostatečně nadimenzované IO a mít nějakou rezervu). Skóre tabulek můžeme sledovat v pohledu &amp;lt;code&amp;gt;pg_stat_autovacuum_score&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_autovacuum_scores WHERE score &amp;gt; 0.05;&lt;br /&gt;
┌─[ RECORD 1 ]────────┬──────────────────────┐&lt;br /&gt;
│ relid               │ 1262                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_database          │&lt;br /&gt;
│ score               │ 0.15936254737880529  │&lt;br /&gt;
│ xid_score           │ 1e-07                │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0.0793650769622719   │&lt;br /&gt;
│ vacuum_insert_score │ 0.003998400542165933 │&lt;br /&gt;
│ analyze_score       │ 0.15936254737880529  │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
╞═[ RECORD 2 ]════════╪══════════════════════╡&lt;br /&gt;
│ relid               │ 1214                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_shdepend          │&lt;br /&gt;
│ score               │ 0.12                 │&lt;br /&gt;
│ xid_score           │ 1.15e-07             │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0                    │&lt;br /&gt;
│ vacuum_insert_score │ 0.006                │&lt;br /&gt;
│ analyze_score       │ 0.12                 │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
└─────────────────────┴──────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově autovacuum může použít &amp;lt;code&amp;gt;VACUUM&amp;lt;/code&amp;gt; s podporou paralelismu.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přehled o aktuálním stavu recovery je k dispozici v pohledu &amp;lt;code&amp;gt;pg_stat_recovery&amp;lt;/code&amp;gt;. V pohledu &amp;lt;code&amp;gt;pg_stat_statements&amp;lt;/code&amp;gt; jsou dva nové sloupce &amp;lt;code&amp;gt;generic_plan_calls&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;custom_plan_calls&amp;lt;/code&amp;gt; zobrazující kolikrát předpřipravený příkaz (prepared statement) použil generický nebo zákaznický plán. Nový sloupec &amp;lt;code&amp;gt;wal_fpi_bytes&amp;lt;/code&amp;gt; zobrazuje velikost zápisu tzv. plných stránek do transakčního logu. Vysoká hodnota může signalizovat nepříjemně velkou četnost vynucených checkpointů (je nutné zvednout &amp;lt;code&amp;gt;max_wal_size&amp;lt;/code&amp;gt; případně &amp;lt;code&amp;gt;checkpoint_timeout&amp;lt;/code&amp;gt;). V novém pohledu &amp;lt;code&amp;gt;pg_stat_lock&amp;lt;/code&amp;gt; uvidíme počet a celkový čas čekání na různé typy zámků. Zaznamenány jsou pouze ty situace, kdy se čeká na zámek déle než jednu sekundu (stejně jako např. &amp;lt;code&amp;gt;log_lock_waits&amp;lt;/code&amp;gt;, které je v nyní ve výchozí konfiguraci zapnuté). Bohužel zámky, které trvají cca 100ms, mající nepříjemný dopad na dotazy kolem 10ms, zde neuvidíme:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_lock ;&lt;br /&gt;
┌──────────────────┬───────┬───────────┬───────────────────┬───────────────────────────────┐&lt;br /&gt;
│     locktype     │ waits │ wait_time │ fastpath_exceeded │          stats_reset          │&lt;br /&gt;
╞══════════════════╪═══════╪═══════════╪═══════════════════╪═══════════════════════════════╡&lt;br /&gt;
│ relation         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ extend           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ frozenid         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ page             │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ tuple            │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ transactionid    │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ virtualxid       │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ spectoken        │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ object           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ userlock         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ advisory         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ applytransaction │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
└──────────────────┴───────┴───────────┴───────────────────┴───────────────────────────────┘&lt;br /&gt;
(12 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze Postgres podporuje asynchronní IO. Čtení je realizováno dedikovanými procesy (workers). Počáteční implementace pracovala s konfigurovatelným počtem těchto procesů (výchozí nastavení mělo hodnotu 3). Nově je správa workerů dynamičtější - v případě potřeby si je Postgres nastartuje nebo naopak zavře. Místo fixního počtu nyní nastavujeme minimální a maximální počet workerů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io_min_workers=2&lt;br /&gt;
io_max_workers=8 (up to 32)&lt;br /&gt;
io_worker_idle_timeout=60s&lt;br /&gt;
io_worker_launch_interval=100ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Poměrně razantně se změnila konfigurace &amp;lt;code&amp;gt;log_min_messages&amp;lt;/code&amp;gt;, která udává, na které úrovni se mají chyby zapsat do systémového logu (&amp;lt;code&amp;gt;DEBUG5&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;PANIC&amp;lt;/code&amp;gt;). Nově lze tuto úroveň nastavit pro každý typ procesu (&amp;lt;code&amp;gt;archiver&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;autovacuum&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bgworker&amp;lt;/code&amp;gt;, ...) např. &amp;lt;code&amp;gt;error, walsender:debug1, autovacuum:debug1&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Správa partišen (partitions) byla v Postgresu základní. Díky možnosti sloučit nebo rozdělit partišny (partitions) se dostává trochu dál. Je to spíš první krok se spoustou omezení - používá se pouze jedno CPU a po celou dobu je exkluzivně zamknutá rodičovská tabulka. Ale i tak to může dost uživatelům ušetřit práci (a jejich vlastní řešení by pravděpodobně mělo stejná omezení):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_east, sales_central)  INTO sales_all;&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE measurement SPLIT PARTITION measurement_y2006q1 INTO&lt;br /&gt;
   (PARTITION measurement_y2006m01 FOR VALUES FROM (&#039;2006-01-01&#039;) TO (&#039;2006-02-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m02 FOR VALUES FROM (&#039;2006-02-01&#039;) TO (&#039;2006-03-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m03 FOR VALUES FROM (&#039;2006-03-01&#039;) TO (&#039;2006-04-01&#039;));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Oproti předchozím verzím lze zapínat a vypínat všechny typy omezení (nejen cizí klíče):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, CONSTRAINT cc CHECK(a &amp;gt; 0) NOT ENFORCED); &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
INSERT INTO foo VALUES(1);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ERROR:  check constraint &amp;quot;cc&amp;quot; of relation &amp;quot;foo&amp;quot; is violated by some row&lt;br /&gt;
DELETE FROM foo WHERE a = 0;&lt;br /&gt;
DELETE 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
ERROR:  new row for relation &amp;quot;foo&amp;quot; violates check constraint &amp;quot;cc&amp;quot;&lt;br /&gt;
DETAIL:  Failing row contains (0).&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc NOT ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==pg_plan_advice==&lt;br /&gt;
&amp;lt;p&amp;gt;Až doposud uživatelé Postgresu neměli moc možností, jak ovlivnit generování prováděcích plánů. Hinty ve stylu Oracle byly a jsou z historických důvodů tabu (jsou implementovány extenzí [https://github.com/ossc-db/pg_hint_plan pg_hint_plan]). Uživatel měl pouze možnost penalizace metod executoru - např. &amp;lt;code&amp;gt;enable_nestloop&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;enable_indexscan&amp;lt;/code&amp;gt; nastavením na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Tato penalizace je ale dost hrubá, a neumožňuje jemné ovlivnění plánovače. Přesto se používala a používá. Rober Haas napsal dvě extenze [https://www.postgresql.org/docs/devel/pgplanadvice.html &amp;lt;code&amp;gt;pg_plan_advice&amp;lt;/code&amp;gt;] a [https://www.postgresql.org/docs/devel/pgstashadvice.html &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;]. Prvně zmíněná extenze umožňuje definovat jakási doporučení, která by měl planner respektovat. Pro každý plán lze zpětně dogenerovat tato doporučení:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce&lt;br /&gt;
  ORDER BY pocet_muzu + pocet_zen DESC&lt;br /&gt;
  LIMIT 10;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Limit  (cost=272.19..272.21 rows=10 width=45)                        │&lt;br /&gt;
│   -&amp;gt;  Sort  (cost=272.19..287.81 rows=6250 width=45)                 │&lt;br /&gt;
│         Sort Key: ((pocet_muzu + pocet_zen)) DESC                    │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on obce  (cost=0.00..137.12 rows=6250 width=45) │&lt;br /&gt;
│ Generated Plan Advice:                                               │&lt;br /&gt;
│   SEQ_SCAN(obce)                                                     │&lt;br /&gt;
│   NO_GATHER(obce)                                                    │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                      QUERY PLAN                                      │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Nested Loop  (cost=0.28..12.56 rows=81 width=58)                                     │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17)                          │&lt;br /&gt;
│         Filter: (nazev = &#039;Beroun&#039;::text)                                             │&lt;br /&gt;
│   -&amp;gt;  Index Scan using obce_okres_id_idx on obce  (cost=0.28..9.79 rows=81 width=41) │&lt;br /&gt;
│         Index Cond: ((okres_id)::text = okresy.id)                                   │&lt;br /&gt;
│ Generated Plan Advice:                                                               │&lt;br /&gt;
│   JOIN_ORDER(okresy obce)                                                            │&lt;br /&gt;
│   NESTED_LOOP_PLAIN(obce)                                                            │&lt;br /&gt;
│   SEQ_SCAN(okresy)                                                                   │&lt;br /&gt;
│   INDEX_SCAN(obce public.obce_okres_id_idx)                                          │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                                             │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(11 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Prostřednictvím konfigurační proměnné &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; můžeme ovlivnit chování planneru vlastními doporučeními:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET pg_plan_advice.advice to &#039;JOIN_ORDER(obce okresy)&#039;;&lt;br /&gt;
SET&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌───────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                            QUERY PLAN                             │&lt;br /&gt;
╞═══════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Join  (cost=1.97..140.78 rows=81 width=58)                   │&lt;br /&gt;
│   Hash Cond: ((obce.okres_id)::text = okresy.id)                  │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on obce  (cost=0.00..121.50 rows=6250 width=41)    │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=1.96..1.96 rows=1 width=17)                     │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17) │&lt;br /&gt;
│               Filter: (nazev = &#039;Beroun&#039;::text)                    │&lt;br /&gt;
│ Supplied Plan Advice:                                             │&lt;br /&gt;
│   JOIN_ORDER(obce okresy) /* matched */                           │&lt;br /&gt;
│ Generated Plan Advice:                                            │&lt;br /&gt;
│   JOIN_ORDER(obce okresy)                                         │&lt;br /&gt;
│   HASH_JOIN(okresy)                                               │&lt;br /&gt;
│   SEQ_SCAN(obce okresy)                                           │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                          │&lt;br /&gt;
└───────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(13 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konfigurace planneru prostřednictvím &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; nestačí, pokud potřebujeme ovlivnit plán dotazu z aplikace, u které nemůžeme nebo nechceme měnit zdrojový kód. A proto je tu druhá zmíněná extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;, která umožňuje naše &amp;quot;doporučení&amp;quot; uložit a pak automaticky aplikovat na základě tzv &amp;lt;code&amp;gt;queryid&amp;lt;/code&amp;gt;. Doporučení jsou uložena v pojmenovaných skladech (stashes). Skrze konfigurační proměnnou &amp;lt;code&amp;gt;pg_stash_advice.stash_name&amp;lt;/code&amp;gt; volíme aktivní sklad. Každý uživatel, každá databáze může mít svůj vlastní. Pokud proměnná není nastavená, tak je extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt; neaktivní. Uložené nápovědy jsou perzistentní - při vypnutí serveru se uloží, po startu znovu načtou do paměti.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SQL==&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; je syntaxe, kterou postres přejímá z analytických databází (zde to snad byla [https://duckdb.org/2022/05/04/friendlier-sql#group-by-all DuckDB]). Pokud se použije tento zápis, tak se automaticky agreguje podle všech sloupců, které nejsou v agregační funkci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT sum(pocet_zen + pocet_muzu), okresy.id, okresy.nazev &lt;br /&gt;
  FROM obce join okresy ON obce.okres_id = okresy.id&lt;br /&gt;
 GROUP BY ALL;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tento zápis může ušetřit dost psaní, může to být také &amp;quot;tichý&amp;quot; zabiják výkonu. Čím více atributů je v klauzuli &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;, tím je agregace pomalejší. Zápis &amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; ještě není ve standardu, ale je standardizační komisí akceptován, a měl by být v některé další verzi ANSI/SQL.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Počínaje Postgresem 19 už nebude možnost používat backlash jako escape symbol v řetězcích. Před 15 roky se přešlo na standardní chování (předtím se řetězce v Postgresu chovali stejně jako v Cčku), nicméně nestandardní chování bylo možné vynutit nastavením &amp;lt;code&amp;gt;standard_conforming_strings&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Mezi top vývojáři Postgresu je hodně velká averze k tzv kompatibility flagům (zmíněný flag nebyl výjimkou) (pozn. u komerčních databází jsou naopak kompatibility flagu standardem, a nejen u nich - např. MySQL). Nyní je tato možnost zrušena, a Cčkové stringy dostaneme pouze jen zápisem (jako tzv extended strings):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;ahoj\nsvete&#039;;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│  ?column?   │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ ahoj\nsvete │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT e&#039;Ahoj\nSvete&#039;;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ Ahoj    ↵│&lt;br /&gt;
│ Svete    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze v u window funkcí &amp;lt;code&amp;gt;lead&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lag&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;first_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last_value&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;nth_value&amp;lt;/code&amp;gt; použít klauzuli &amp;lt;code&amp;gt;IGNORE NULLS&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;. Výchozí chování, které bylo implementováno již dříve odpovídá klauzuli &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SQL/PGQ==&lt;br /&gt;
&amp;lt;p&amp;gt;V tomto případě PG není častým prefixem symbolizujícím Postgres (a Q jako queue), ale Property Graph Queries. Počínaje podporou neatomických datových typů v SQL:2000, přes podporu XML v SQL:2003 se standard rozšířil nad rámec čistě relačních databází (stejně ale už dříve existovala kritika SQL z pohledu čistoty od relačních dogmatiků). Standard SQL:2023 (ISO/IEC 9075-16:2023) SQL rozšiřuje o podporu grafových databází, které mají svůj vlastní datový model odlišný od relačního modelu. Přijde mi to jako dost odvážný krok (a ještě teď tomu nemohu úplně uvěřit). Zatím existovala zřetelná jednota mezi SQL a relačním modelem. Od nové části standardu se očekává, že pomůže s přehlednějším zápisem určitých dotazů, které se až doposud řešily pomocí rekurze. Přiznám se, že zápis dotazu v PGQ (využívajícího ascii art) mi přijde hodně cizí (možná zažívám pocity programátora v Cobolu, když se poprvé podíval na SQL. Osobně mi to nesedí - reprezentaci znalostí ve formátu grafu jsem nikdy nemusel (vím, že je to jen jiná reprezentace téhož)). Row pattern recognition z roku SQL:2016 toho také nemá s relačními databázemi moc společného, takže to takové překvapení není. Práce na této části standardu začaly v roce 2017 (a integrovaly se prvky jazyka [https://neo4j.com/docs/cypher-manual/current/introduction/cypher-overview/ Cypher] (Neo4j) a [https://docs.oracle.com/en/database/oracle/property-graph/20.4/spgdg/property-graph-query-language-pgql.html#GUID-301FF092-1A07-43D2-91E5-0C5AFF3467CC PGQL] (Oracle)).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Základem grafových databází je graf skládající se z uzlů a hran. Ka každému uzlu i hraně mohou být přiřazeny atributy (properties). Hrany mohou být orientované i neorientované. Standard pro takové grafy používá termín Property Graphs. Graf se definuje příkazem &amp;lt;code&amp;gt;CREATE PROPERTY GRAPH&amp;lt;/code&amp;gt; a je to určitá forma pohledu. Přesto, že jsem zkoušel poměrně triviální příklad, nebylo pro mne intuitivní napsat SQL/PGQ dotaz. Pro uživatele bez zkušenosti s Neo4j nebo jinou grafovou databází budou začátky s SQL/PGQ dost bolestivé. V tuto chvíli (duben 2026) ještě není hotová dokumentace. Je možné, že se díky integraci SQL/PGQ do Postgresu setkám s grafovými databázemi častěji (SQL/PGQ je podporováno v DuckDB a v Oracle):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE public.uzivatele (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  jmeno character varying&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE public.zpravy (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  odesilatel integer,&lt;br /&gt;
  prijemce integer,&lt;br /&gt;
  tema text&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- uzivatel - odeslal -&amp;gt; uzivatel&lt;br /&gt;
CREATE PROPERTY GRAPH public.pg1&lt;br /&gt;
  VERTEX TABLES (&lt;br /&gt;
    public.uzivatele AS uzivatel KEY (id) PROPERTIES (id, jmeno)&lt;br /&gt;
  )&lt;br /&gt;
  EDGE TABLES (&lt;br /&gt;
    public.zpravy AS odeslal KEY (id)&lt;br /&gt;
    SOURCE KEY (odesilatel) REFERENCES uzivatel (id)&lt;br /&gt;
    DESTINATION KEY (prijemce) REFERENCES uzivatel (id)&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (1, &#039;Pavel&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (2, &#039;Zdenek&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (3, &#039;Tomas&#039;);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.zpravy VALUES (1, 1, 2, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (2, 2, 1, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (3, 1, 3, &#039;dotaz ohledne dopravy&#039;);&lt;br /&gt;
&lt;br /&gt;
-- od koho uzivatel Pavel dostal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) &amp;lt;-[IS odeslal]- (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
└────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- komu uzivatel Pavel poslal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) -[IS odeslal]-&amp;gt; (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
│ Tomas  │&lt;br /&gt;
└────────┘&lt;br /&gt;
(2 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Osobně si nedovedu představit, že bych psal dotazy v SQL/PGQ (myslím, že podobně na tom bude většina uživatelů podobně). Je otázkou, jestli se SQL/PGQ neuplatní ve spolupráci s AI. V tomto případě se běžný dotaz rozpadá do dvou kroků. Navíc i joinovací podmínka získává label, takže je to v určitém smyslu více popisné, než běžné SQL, a je tak možné, že tento zápis bude AI více sedět.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pomalu se pokračuje na implementaci tzv temporálních tabulek. Letos je to podpora klauzule &amp;lt;code&amp;gt;FOR PORTION OF valid_at FROM TO&amp;lt;/code&amp;gt;. Zjednodušeně, pokud máme temporální databáze nebo temporální tabulky, tak se můžeme podívat na stav dat v nějakém čase. Pokud se použije klauzule &amp;lt;code&amp;gt;FOR PORTION OF FROM TO&amp;lt;/code&amp;gt;, tak se jedná o tzv temporální &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- je nutne mit nainstalovanou extenzi btree_gist&lt;br /&gt;
CREATE TABLE ceny(&lt;br /&gt;
  id int,&lt;br /&gt;
  valid_at daterange,&lt;br /&gt;
  nazev text,&lt;br /&gt;
  cena int,&lt;br /&gt;
  PRIMARY KEY (id, valid_at WITHOUT OVERLAPS)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
-- jednotna cena mezi 2020-01-01 a 2025-12-31&lt;br /&gt;
INSERT INTO ceny VALUES(1, &#039;[2020-01-01,2026-01-01)&#039;, &#039;pecivo&#039;, 20);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- uprava ceny mezi 2021-01-01 a 2021-02-28&lt;br /&gt;
UPDATE ceny&lt;br /&gt;
   FOR PORTION OF valid_at FROM &#039;2021-01-01&#039; TO &#039;2021-03-01&#039;&lt;br /&gt;
   SET cena = 30&lt;br /&gt;
 WHERE id = 1;&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny ORDER BY valid_at;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2021-01-01) │ pecivo │   20 │&lt;br /&gt;
│  1 │ [2021-01-01,2021-03-01) │ pecivo │   30 │&lt;br /&gt;
│  1 │ [2021-03-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nové datové typy a funkce==&lt;br /&gt;
&amp;lt;p&amp;gt;V Postgresu se můžete setkat s datovými typy s prefixem &amp;lt;code&amp;gt;reg&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;regrole&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regproc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regclass&amp;lt;/code&amp;gt;. Tyto datové typy jsou vždy spojeny s jednou konkrétní systémovou tabulkou a hodnoty těchto typů vždy nesou unikátní číselný identifikátor databázového objektu. Tyto typy podporují přetypování z textu, což se používá pro zkrácený zápis vyhledávání nějakého databázového objektu v katalogu. Nově můžeme používat typ &amp;lt;code&amp;gt;regdatabase&amp;lt;/code&amp;gt; a tento typ se odkazuje, jak je patrné z názvu, na tabulku &amp;lt;code&amp;gt;pg_database&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ regdatabase │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ template1   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase::oid;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT oid&lt;br /&gt;
 FROM pg_database &lt;br /&gt;
 WHERE datname = &#039;template1&#039;;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Díky těmto typům jsou dotazy nad systémovým katalogem kratší a čitelnější. Navíc autor dotazů nemusí brát v potaz některé detaily (jako například case sensitivitu), kde se chování SQL identifikátorů liší od SQL stringů. To je ošetřeno interně při přetypování.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce &amp;lt;code&amp;gt;error_on_null&amp;lt;/code&amp;gt; vyhodí výjimku, pokud je parametr NULL. Jinak vrátí hodnotu parametru. Implementace je extrémně jednoduchá - sleduje flag &amp;lt;code&amp;gt;isnull&amp;lt;/code&amp;gt;. Každý parametr každé SQL funkce má tento flag. Stejné chování má flag funkce &amp;lt;code&amp;gt;STRICT&amp;lt;/code&amp;gt;. Je tu drobná zrada. V případě kompozitních typů to není kompatibilní s operátorem &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;. Kompozitní hodnota obsahující pouze &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;y je interně ne nullová, ale operátor &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt; pro takovou kompozitní hodnotu vrátí &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT ROW(NULL, NULL) IS NULL;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT error_on_null(NULL::integer);&lt;br /&gt;
ERROR:  null value not allowed&lt;br /&gt;
SELECT error_on_null(ROW(NULL, NULL));&lt;br /&gt;
┌───────────────┐&lt;br /&gt;
│ error_on_null │&lt;br /&gt;
╞═══════════════╡&lt;br /&gt;
│ (,)           │&lt;br /&gt;
└───────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Roky se v Postgresu mluví o tom, že by měl existovat snadný způsob, jak zpětně z databázového objektu vygenerovat DDL příkaz. Osobně jsem nikdy tuhle potřebu neměl, ale do jisté míry této potřebě rozumím. Skoro v každém admin nástroji můžete iterovat přes databázové objekty a k nim si nechat zobrazit DDL. A skoro každý admin tool, pak tuto funkcionalitu duplicitně implementuje - s chybami nebo bez chyb. Je to kód, který vyžaduje neustálou údržbu a aktualizace. Po letech diskuzí se je v upstreamu první část funkcí &amp;lt;code&amp;gt;pg_get_...ddl&amp;lt;/code&amp;gt; (aktuálně &amp;lt;code&amp;gt;pg_get_database_ddl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pg_get_role_ddl&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_get_tablespace_ddl&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT pg_get_role_ddl(&#039;pavel&#039;);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                       pg_get_role_ddl                                        │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ CREATE ROLE pavel SUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS; │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze je v postgresu funkce generující náhodné číslo v zadaném rozsahu. K nim nyní přibyly funkce pro rozsah typů &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;timestamptz&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SELECT random(current_date - 6, current_date);&lt;br /&gt;
┌────────────┐&lt;br /&gt;
│   random   │&lt;br /&gt;
╞════════════╡&lt;br /&gt;
│ 2026-04-13 │&lt;br /&gt;
└────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT random(current_timestamp - interval &#039;1 week&#039;, current_timestamp);&lt;br /&gt;
┌───────────────────────────────┐&lt;br /&gt;
│            random             │&lt;br /&gt;
╞═══════════════════════════════╡&lt;br /&gt;
│ 2026-04-09 02:30:30.665819+02 │&lt;br /&gt;
└───────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Optimalizace==&lt;br /&gt;
&amp;lt;p&amp;gt;Jako nejdůležitější optimalizaci v nové verzi vidím optimalizaci implementace kontroly referenční integrity. RI je v postgresu realizována v systémových řádkových triggerech, které, až doposud, provedly (pro každý řádek) jeden kontrolní SQL příkaz (s použitím SPI API - stejné API, které se používá např. v PL/pgSQL). Nově se hledá přímo v indexech - přeskakuje se celý aparát SQL. To je první výrazná optimalizace. Druhou výraznou optimalizací je hledání nikoliv jedné hodnoty, ale pole hodnot (n = 64). Podle autora patche je nyní kontrola referenční integrity cca 3x rychlejší. Pořád to bude znát. Výrazně se ale posune hranice, od kdy se vyplatí při masivních importech kontrolu referenční integrity vypínat.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE tab_a(id int PRIMARY KEY);&lt;br /&gt;
INSERT INTO tab_a SELECT generate_series(1,1000);&lt;br /&gt;
VACUUM ANALYZE tab_a;&lt;br /&gt;
&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b_no_ri(id int, a_id int);&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b(id int, a_id int references tab_a(id));&lt;br /&gt;
\timing&lt;br /&gt;
-- postgres 18&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 12844,206 ms (00:12,844)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 659,462 ms&lt;br /&gt;
&lt;br /&gt;
-- postgres 19&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 2728,073 ms (00:02,728)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 673,444 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ukázkový test je best case - zrychlení je cca čtyřnásobné. Stále je import s RI cca 4x pomalejší než bez RI (a to cílová tabulka obsahuje pouze jeden cizí klíč). V praxi to bude jiné - kromě RI je náročná i aktualizace indexů a samozřejmě všechny diskové operace.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Určitě každý, kdo pracuje s Postgresem trochu déle, se setkal s doporučením &amp;quot;nepoužívej &amp;lt;code&amp;gt;NOT IN (SELECT ...&amp;lt;/code&amp;gt;&amp;quot;. Důvodem byla (v některých případech) &amp;quot;špatná&amp;quot; optimalizace. Optimalizátor neměl garanci, že subselect nevrátí &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;. Poté, co se ve verzi 18 přepsal systém pro ukládání omezujících pravidel (constraints), už bylo možné do tuto informaci v optimalizátoru použít. Nyní se by se měl subselect &amp;lt;code&amp;gt;NOT IN&amp;lt;/code&amp;gt; transformovat na tzv anti-join (v těch případech, kdy je garantováno, že žádná proměnná v predikátu nebude &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;). Jinými slovy, pokud optimalizátor bude mít garance, že se v predikátu subselectu nevyskytne &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, tak vygeneruje stejný plán, jako kdybyste použili zápis s &amp;lt;code&amp;gt;NOT EXISTS&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE osoby(id int PRIMARY KEY, jmeno varchar);&lt;br /&gt;
CREATE TABLE faktury(id int primary key,&lt;br /&gt;
                     vlozeno timestamp,&lt;br /&gt;
                     podal int REFERENCES osoby(id) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT *&lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE id NOT IN (SELECT podal&lt;br /&gt;
                            FROM faktury);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT * &lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE NOT EXISTS(SELECT podal &lt;br /&gt;
                            FROM faktury&lt;br /&gt;
                           WHERE podal = osoby.id);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
-- ve starších verzích dostanete různé plány&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ve starších verzích spojení relací vždy předcházelo agregaci. To v některých případech může být neefektivní (pokud agregace výrazně redukuje počet řádek). Pokud jsem chtěl změnit pořadí operací, musel jsem si to vynutit zápisem (poddotazem). V devatenáctce optimalizátor podporuje tzv předběžnou agregaci (eager aggregation), která předbíhá před join:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT sum(pocet_zen + pocet_muzu), okresy.nazev &lt;br /&gt;
                  FROM okresy JOIN obce ON okresy.id = obce.okres_id&lt;br /&gt;
                 GROUP BY okresy.nazev;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                                QUERY PLAN                                                │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Finalize HashAggregate  (cost=157.38..158.15 rows=77 width=18)                                           │&lt;br /&gt;
│   Group Key: okresy.nazev                                                                                │&lt;br /&gt;
│   -&amp;gt;  Hash Join  (cost=3.02..157.00 rows=77 width=18)                                                    │&lt;br /&gt;
│         Hash Cond: ((obce.okres_id)::text = okresy.id)                                                   │&lt;br /&gt;
│         -&amp;gt;  Partial GroupAggregate  (cost=0.28..154.05 rows=77 width=15)                                 │&lt;br /&gt;
│               Group Key: obce.okres_id                                                                   │&lt;br /&gt;
│               -&amp;gt;  Index Only Scan using obce_okres_id_idx on obce  (cost=0.28..122.03 rows=6250 width=7) │&lt;br /&gt;
│         -&amp;gt;  Hash  (cost=1.77..1.77 rows=77 width=17)                                                     │&lt;br /&gt;
│               -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.77 rows=77 width=17)                                 │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(9 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Na datech pro ČR je výše uvedený dotaz cca 3x rychlejší (v pg19 vůči pg18).&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud je jeden řádek zamčený vícero transakcemi, tak se do jeho systémového atributu &amp;lt;code&amp;gt;xmax&amp;lt;/code&amp;gt; uloží tzv &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; (MultiXact je &amp;quot;aparát&amp;quot;, kterým se v Postgresu implementují řádkové zámky). To je unikátní identifikátor skupiny transakcí, které drží zámek. Každá skupina transakcí se skládá z tzv členských záznamů &amp;lt;code&amp;gt;MultiXactMember&amp;lt;/code&amp;gt;, ve kterých se drží identifikátor transakce, typ zámku a stav transakce. Také tyto záznamy mají své unikátní id &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Doposud &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; byla 32bitová hodnota. Nově je tato hodnota 64bitová, a nehrozí její přetečení. &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; i id transakcí jsou stále 32bitové hodnoty (existuje několik rozpracovaných řešení, které zvyšují jejich rozsah), takže stále hrozí přetečení těchto id, a nastartování vynuceného freezování (což u více zatížených systémů může způsobit problémy s produkcí). Eliminovala se ale možnost přetečení &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Je tp důležité, protože &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; rostl ze všech zmíněných id nejrychleji (pokud &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; je počet transakcí se sdílenými zámky, pak růst &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; je &amp;lt;code&amp;gt;nxn&amp;lt;/code&amp;gt;). Informace o MultiXact (skupinách transakcí) lze získat novou funkcí &amp;lt;code&amp;gt;pg_get_multixact_stats()&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přepracoval se kód, který implementuje příkazy &amp;lt;code&amp;gt;LISTEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NOTIFY&amp;lt;/code&amp;gt;. Předchozí verze probouzely každý proces, který čekal na notifikaci (bez ohledu na to jestli čekal nebo nečekal na kanálu, který dostal notifikaci). Stará implementace fungovala dobře, pokud počet použitých kanálů byl malý, a tudíž byla i malá šance, že se probudí proces, který čeká na jiném kanálu než je aktuální notifikace. Uživatelé ale začali notifikace používat i jinak, a reportovali výrazné zpomalení pokud větší množství klientů poslouchalo na větším množství různých kanálů. Ve zprávě ke patchi je uvedeno zpomalení (pro 1 klienta 9100 TPS, pro 1000 klientů 200 TPS). Nová implementace ve sdílené paměti ke každému kanálu drží seznam čekajících klientů. V případě zprávy do některého kanálu se probudí pouze procesy, které na tomto kanálu poslouchají (i zde je vidět pokles TPS, ale výrazně menší - pro 1000 klientů 9000 TPS).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Výchozí komprimace TOASTu bude &amp;lt;code&amp;gt;lz4&amp;lt;/code&amp;gt; (namísto &amp;lt;code&amp;gt;pglz&amp;lt;/code&amp;gt;). LZ4 je jako volba už cca 5 let, a měla by být efektivnější (jak v komprimaci, tak ve využití CPU) než původní LZ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Postupně víc funkcí je akcelerováno pomocí SIMD. Nově to jsou funkce &amp;lt;code&amp;gt;hex_encode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hex_decode&amp;lt;/code&amp;gt; a parsování csv, tsv formátů příkazu &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; (hledání speciálních znaků).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Některé extenze, jako např. &amp;lt;code&amp;gt;pgstattuple&amp;lt;/code&amp;gt;, nově používají direct API pro čtení dat (implementované v pg18). Na systémech s rychlým IO by měly běžet rychleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Na základě reportů uživatelů se upravila implementace hashjoinu, tak aby nedocházelo k extrémnímu nárůstu alokace paměti v případech, kdy atribut použitý pro spojení relací obsahuje velké množství &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; hodnot.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V těch případech, kdy je garantováno, že porovnávané hodnoty jsou ne nullové, tak se operátor &amp;lt;code&amp;gt;IS DISTICT FROM&amp;lt;/code&amp;gt; nahradí operátorem &amp;lt;code&amp;gt;&amp;lt;&amp;gt;&amp;lt;/code&amp;gt;, případně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM&amp;lt;/code&amp;gt; operátorem &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;. Tady je otázkou, jaký bude reálný dopad. Jako programátor používám &amp;lt;code&amp;gt;IS [ NOT ] DISTINCT FROM&amp;lt;/code&amp;gt; jedině v těch případech, které komplikují potenciální NULLy. Je ale pravdou, že drtivou většinu SQL, dnes generují ORM frameworky, ktere nemusí mít vždy dostatečnou chytrost. Výraz &amp;lt;code&amp;gt;IS DISTINCT FROM NULL&amp;lt;/code&amp;gt; se nyní transformuje na &amp;lt;code&amp;gt;IS NOT NULL&amp;lt;/code&amp;gt;, obdobně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM NULL&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Replikace==&lt;br /&gt;
&amp;lt;p&amp;gt;Dlouhodobým cílem implementace logické replikace je podpora multimaster řešení. Zatím je k tomu ještě dlouhá cesta. Chybí podpora replikace DDL příkazů, plná podpora sekvencí, plná podpora řešení replikačních kolizí. Postupuje se v malých krocích. Letos je to podpora jednorázového refrešnutí sekvencí &amp;lt;code&amp;gt;ALTER SUBSCRIPTION ... REFRESH SEQUENCES&amp;lt;/code&amp;gt;. S multimasterem to úplně nepomůže, ale může to zjednodušit upgrade skrze logickou replikaci.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Novým příkazem je příkaz &amp;lt;code&amp;gt;WAIT FOR&amp;lt;/code&amp;gt;, který je možné použít na replikách, a který zajistí čekání na zreplikování zadané transakce. Lze nastavit timeout. Parametrem &amp;lt;code&amp;gt;NO_THROW&amp;lt;/code&amp;gt; zajistí tiché (bez výjimky) ukončení příkazu po timeoutu (změní se pouze vrácená hodnota):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# WAIT FOR LSN &#039;0/306EE20&#039; WITH (TIMEOUT &#039;100ms&#039;, NO_THROW);&lt;br /&gt;
 status&lt;br /&gt;
--------&lt;br /&gt;
 timeout&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V příkazu &amp;lt;code&amp;gt;CREATE PUBLICATION ... FOR ALL TABLES&amp;lt;/code&amp;gt; je nyní možné použít klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE (t1, ...)&amp;lt;/code&amp;gt;. Klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE&amp;lt;/code&amp;gt; lze použít i v příkazu &amp;lt;code&amp;gt;ALTER PUBLICATION&amp;lt;/code&amp;gt;. Pro registraci odběru (&amp;lt;code&amp;gt;CREATE SUBSCRIPTION&amp;lt;/code&amp;gt;) lze místo explicitního connection stringu použít odkaz na dříve definovaný FDW server.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V pohledu &amp;lt;code&amp;gt;pg_replication_slots&amp;lt;/code&amp;gt; je nový sloupec &amp;lt;code&amp;gt;slotsync_skip_reason&amp;lt;/code&amp;gt; popisující důvod, proč nebylo možné synchronizovat repliku. V tom případě bude obsahovat jednu z následujících hodnot: &amp;lt;code&amp;gt;wal_or_rows_removed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wal_not flushed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;no_consistent_snapshot&amp;lt;/code&amp;gt; nebo 	&amp;lt;code&amp;gt;slot_invalidated&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud při registraci odběru nastavíme parametr &amp;lt;code&amp;gt;retain_dead_tuples&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; (výchozí nastavení je &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;), budou se detekovat kolize update-delete, kdy nedojde k update z důvodu smazaného řádku. Pozor, tato volba dočasně blokuje vakuování zrušených řádků (zvlášť pokud je replika nedostupná a nedochází k synchronizaci). Lze nastavit timeout &amp;lt;code&amp;gt;max_retention_duration&amp;lt;/code&amp;gt;, samozřejmě pak ovšem může dojít ke kolizi update-delete. Bez detekce této kolize může dojít k tiché nekonzistenci obsahu napříč různými zdroji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ostatní==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; podporuje formát &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt; (pouze export).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT JSON&lt;br /&gt;
{&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT (FORMAT JSON, FORCE_ARRAY)&lt;br /&gt;
[&lt;br /&gt;
 {&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nyní také tento příkaz podporuje volbu &amp;lt;code&amp;gt;ON_ERROR SET_NULL&amp;lt;/code&amp;gt;, která způsobí ignorování hodnot, na kterých selže typová konverze. To je možné díky tomu, že se již dříve zavedla podpora tzv měkkých chyb (soft errors). Tyto chyby lze ošetřit s řádově menší režií než běžné chyby (nejsou potřeba subtransakce). Podpora soft errors se v Postgresu objevila s podporou klauzule &amp;lt;code&amp;gt;ON ERROR&amp;lt;/code&amp;gt; SQL/JSON funkcí. V plánu je podpora error safe přetypování (&amp;lt;code&amp;gt;CAST expr AS type xxx DEFAULT expr ON CONVERSION ERROR&amp;lt;/code&amp;gt;). Prvním nezbytným krokem je požadavek, aby konverzní funkce používaly měkké chyby. To teď v upstreamu je, a díky tomu, bylo i relativně jednoduché implementovat &amp;lt;code&amp;gt;COPY ON_ERROR SET_NULL&amp;lt;/code&amp;gt; (error safe casts by měly být v pg20).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, b int);&lt;br /&gt;
&lt;br /&gt;
COPY foo FROM stdin (FORMAT csv, ON_ERROR SET_NULL);&lt;br /&gt;
Enter data to be copied followed by a newline.&lt;br /&gt;
End with a backslash and a period on a line by itself, or an EOF signal.&lt;br /&gt;
&amp;gt;&amp;gt; 10,20&lt;br /&gt;
&amp;gt;&amp;gt; 30,40&lt;br /&gt;
&amp;gt;&amp;gt; ahoj,20&lt;br /&gt;
&amp;gt;&amp;gt; \.&lt;br /&gt;
COPY 3&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM foo;&lt;br /&gt;
┌────┬────┐&lt;br /&gt;
│ a  │ b  │&lt;br /&gt;
╞════╪════╡&lt;br /&gt;
│ 10 │ 20 │&lt;br /&gt;
│ 30 │ 40 │&lt;br /&gt;
│  ∅ │ 20 │&lt;br /&gt;
└────┴────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově také příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; umožňuje číst přímo partišny (partitions). V předchozích verzích bylo nutné použít syntax s vloženým selectem, což má nějakou režii.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce pro zakódování a dekódování textu (&amp;lt;code&amp;gt;encode&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;decode&amp;lt;/code&amp;gt;) nově podporují kódování &amp;lt;code&amp;gt;base64url&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;base32hex&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 41686f6a3c3e2f2b │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base64url&#039;);&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│   encode    │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ QWhvajw-Lys │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base32hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 85K6UQHS7ONIM=== │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dokončit implementaci standardu SQL/JSON, konkrétně implementaci funkce &amp;lt;code&amp;gt;JSON_TABLE&amp;lt;/code&amp;gt; se opět nestihlo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;psql&amp;lt;/code&amp;gt; bude možnost si nastavit zobrazení logických hodnot &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Datový typ &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; akceptuje literály &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Na výstupu se zobrazuje pouze &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
\pset display_true true&lt;br /&gt;
Boolean true display is &amp;quot;true&amp;quot;.&lt;br /&gt;
\pset display_false false&lt;br /&gt;
Boolean false display is &amp;quot;false&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ true     │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT 1 &amp;lt;&amp;gt; 1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ false    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Může se hodit možnost si zobrazit &amp;lt;code&amp;gt;search_path&amp;lt;/code&amp;gt; v promptu. V promptu je také možnost použít symbol &amp;lt;code&amp;gt;%i&amp;lt;/code&amp;gt;, který se nahradí replikačním statusem (&amp;lt;code&amp;gt;primary&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;standby&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PL/pgSQL==&lt;br /&gt;
&amp;lt;p&amp;gt;PL/pgSQL je relativě stabilizované prostředí, kde je každoročně jen minimum změn. Letos je to jedna malá (a pro většinu uživatelů zanedbatelná změna), a jedna &amp;quot;velká&amp;quot;, která ale interně žádnou změnou není.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou změnou je interní optimalizace exekuce embedded SQL ve tvaru  &amp;lt;code&amp;gt;SELECT výraz INTO proměnná&amp;lt;/code&amp;gt;. Mám pocit, že tento zápis se používal v Sybase a na Sybase navazujících databázích pro inicializaci proměnných. Já jsem se s tímto zápisem setkával v literatuře někdy kolem roku 2000, a už tehdy platilo doporučení tento zápis nepoužívat (v plpgsql se nikdy moc nepoužíval). V posledních letech přišlo víc uživatelů z MSSQL (začalo se migrovat víc aplikací z tohoto serveru), tento zápis používali a zjistili, že tento zápis je cca 20x pomalejší než &amp;quot;nativní&amp;quot; přiřazení &amp;lt;code&amp;gt;proměnna := výraz&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Interně jsou v PL/pgSQL dvě metody jak vyhodnotit výraz. Tzv simple metoda, kde se přeskočí SQL exekutor a přímo zavolá exekutor výrazů, je výrazně rychlejší. Druhou metodou je běžná exekuce skrze SQL exekutor (a SPI API). Až doposud, cokoliv co v zdrojovém kódu funkce bylo SQL příkazem (zde příkazem &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;) se vykonalo běžnou cestou. Nově se detekuje výše zmíněný zápis a vykoná se simple metodou. Pro dlouholeté uživatele Postgresu to nic neznamená, ale lidem, kteří migrují z MSSQL, to může zpříjemnit život.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Druhou, a naopak, velkou změnou je možnost inliningu funkce, která je napsaná v PL/pgSQL (ve speciálních případech). Inlining v kontextu Postgresu je trochu něco jiného než si uživatele představí pod termínem inlining. V Postgresu mohou být funkce volané z nějakého SQL příkazu - typicky příkazu &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;. Pokud nějaká funkce podporuje inlining, tak to znamená, že v AST stromu dotazu se volání funkce nahradí jejím tělem. Teprve pak nastupuje optimalizace, a díky inliningu vlastně optimalizátor vidí dovnitř funkce (jinak je funkce pro optimalizátor black box).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;K tomu, aby PL/pgSQL (nejen v PL/pgSQL) funkce mohla být inlinovaná, potřebujete vlastní kód v Cčkové extenzi. A je to vlastně trik (v tomto případě dost nestydatý podfuk :-)). Už dříve bylo možné napsat extenze, které dodávaly optimalizátoru znalost o vybraných funkcích (jinak, opět, pro optimalizátor, jsou funkce black box). Přímo v jádru je například podpora optimalizátoru pro funkci &amp;lt;code&amp;gt;generate_series&amp;lt;/code&amp;gt; (staré verze pg by v rows měly 1000).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT * FROM generate_series(1,3);&lt;br /&gt;
┌────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                             QUERY PLAN                             │&lt;br /&gt;
╞════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Function Scan on generate_series  (cost=0.00..0.03 rows=3 width=4) │&lt;br /&gt;
└────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Inlining byl dřive podporován pro funkce v jazyku SQL, kdy si planner vytáhl zdrojový kód funkce. V devatenáctce planner může zavolat extenzi, a může si říct nejen o detailnější parametry ohledně exekuce, ale může si říct o substituční SQL. Když ho dostane, tak funkci dále neřeší, a pracuje se substitučním SQL příkazem. Je to docela magie, nicméně efektivní. Kód extenze se volá až v momentu, kdy známe konstantní parametry funkce, a extenze se může rozhodnout - zavolej volanou funkci, nebo zavolej nějaké SQL, zavolej jinou funkci, případně vrať rovnou nějakou speciální hodnotu &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, 0, ... Je to i způsob, jak opravdu efektivně pracovat s dynamickým SQL. Musíte si ovšem napsat kód v Cčkové extenzi. Požadavek na tuto funkcionalitu přišel od vývojářů PostGISu. Cílem jsou optimalizace v PostGISu, dá se to ale použít i jinde. Časem si dovedu představit i nějakou contrib extenzi, která by tuto možnost zpřístupnila i bez nutnosti psát si vlastní extenzi. Škoda, že nemám autoritu vývojářů PostGISu. Dovedl bych si představit podobný trik v analyzátoru. Dost by mi to pomohlo s Orafce. V té pozici samozřejmě nejsem.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vývoj==&lt;br /&gt;
&amp;lt;p&amp;gt;Každoročně dochází k čištění kódu. Občas se zruší podpora některé platformy. Výjimečně se přidá podpora nové platformy nebo jako v případě pg19 se vrátí podpora dříve odstraněné platformy (AIX - operační systém AIX přestal být podporovaný v pg17 díky nezájmu IBM. Pak se ale v IBM chytli za nos, dodali počítač do testovací farmy, a do AIXu přidali aktualizovaný software potřebný k buildu Postgresu). Další čistky v kódu lze provést přechodem na novější verzi programovacího jazyka - přechodem z C99 na C11 (bohužel to může znamenat, že starých platformách se nové verze Postgresu nepřeloží). Interní datový typ &amp;lt;code&amp;gt;Datum&amp;lt;/code&amp;gt; až do předchozí verze byl 4bajtový na 32bitových platformách a 8bajtový na 64bitových platformách. Nově je 8bajtový na všech podporovaných platformách. Určitě nezanedbatelná část kódu se generuje z definičních souborů. Nově se z definic generuje kód definující konfigurační proměnné. Údržba, verzování, zajištění konzistence definičních souborů je násobně jednodušší než údržba adekvátního kódu v Cčku. Dynamická alokace paměti bude jednodušší díky funkcím &amp;lt;code&amp;gt;GetNamedDSA&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;GetNamedDSMSegment&amp;lt;/code&amp;gt;. Dynamicky sdílenou paměť lze sledovat skrze pohled &amp;lt;code&amp;gt;pg_dsm_registry_allocations&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Mám pocit, že vývoj Postgresu ještě víc zrychlil - je vidět mnohem víc patchů od lidí z Asie (dříve to bylo spíš jenom Japonsko), a o to víc se naráží na kapacitu committerů. Je to paradox, který nejde jednoduše řešit. Postgres je populární díky funkcionalitě a stabilitě. Stabilita je díky pečlivé práci commitetterů (důkladně se řeší každý řádek kódu). Díky popularitě je více programátorů, kteří píší více kódu, více patchů, ale committeři nestíhají, a tak patche zůstávají relativně dlouho ve frontě. Což frustruje programátory. Patch napíšete během měsíce, během měsíce se dá udělat finalizace a pár iterací s committerem, ale mezitím několik měsíců (v horším případě let (3 roky i v případě bezproblémového malého patche)), čekáte, až si na vás některý z committerů udělá čas. Celou dobu musíte udržovat patch v aplikovatelném stavu, musíte reagovat na případné diskuze, musíte sledovat vývoj a případně aktualizovat patch. Je to problém o kterém se ví, diskutuje se o něm, ale není úplně jasné, co by mělo být řešení. Minimálně se zlepšila evidence patchů, která pokrývá i automatické testování na několika různých platformách. Tady je velká klika, že Postgres má extenze. Neskutečně velký objem kódu (funkcionality) je dnes možné řešit skrz extenze mimo komunitu - což výrazně snižuje tlak na committery. V extenzích toho jde udělat hodně, bohužel, ne všechno. Na druhou stranu, extenze také nejsou bez rizika. Určitým způsobem zvyšují fragmentaci ekosystému Postgresu, který pak ztrácí přehlednost (plus ne všechny extenze jsou dostupné v cloudu). Zase, díky tomu je jádro Postgresu stále ještě rozumně velké. O Oracle se kolují zvěsti, že jádro má 14 miliónů řádek, Postgres pod 2 milióny. Náklady na údržbu Postgresu jsou výrazně menší. Kompilace zdrojáků je do 5 minut, regresní testy v největším rozsahu běží 15 minut. S tím ještě lze nějak rozumně pracovat. O Oracle jsem slyšel, že regresní testy běží den.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Popularita Postgresu jde aktuálně až do absurdna. Z Linkedinu mám pocit, že začíná být přepostgresováno (samozřejmě z mé perspektivy a v mé bublině). Hromada příspěvků vygenerovaných AI jsou banality na úrovni žáka prvního stupně (Postgres má VACUUM, indexy jsou super, dotazy mohou být pomalé, atd atd). Doporučení typu - proč ne Redis, proč ne Elastic, na všechno použijte Postgres. Viděl jsem hromadu clickbaitových článků typu - multigenerační architektura Postgresu je tragická, ale s naší AI nebo s naším supportem nebudete mít problém, atd atd. Postgresu dnes rozumí každý, kdo dokáže do AI napsat Postgres. Měl jsem tu možnost vidět naprosto neadekvátní doporučení ohledně konfigurace (dnes nevíte jestli důvodem je neznalost autora nebo naopak jeho vychytralost a snaha o co nejvíc komentářů případně o troling). Historicky popularita Postgresu rostla ve stínu MySQL, Monga a dalších databází a roky byl Postgres ušetřený mediálního balastu. To bohužel už není pravda. Pořád platí, že Postgres je dobrá databáze, stabilní, relativně rychlá, která se ale rozhodně nehodí na vše. Má svoje limity, které je dobré znát, a rozhodně nemůže ve všech ohledech (ve větším rozsahu) nahradit Redis, MySQL nebo Mongo případně Kafku. To je nesmysl, a není to ani cílem komunity. Základem jakékoliv práce je znát limity, chování, a správně v souladu s celkem, používat správné nástroje.&amp;lt;/p&amp;gt;&lt;br /&gt;
----------&lt;br /&gt;
&amp;lt;DPL&amp;gt;category=Verze PostgreSQL&amp;lt;/DPL&amp;gt;&lt;br /&gt;
[[Category:Články]]&lt;br /&gt;
[[Category:Verze PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1587</id>
		<title>PostgreSQL 19 (2026)</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1587"/>
		<updated>2026-05-10T03:18:17Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;i&amp;gt;Autor: Pavel Stěhule&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;O předchozích verzích jsem napsal, že změny byly primárně interní. Z pohledu uživatele, který chce vidět novou SQL syntax, se toho v posledních verzích moc nestalo. Devatenáctka je jiná. Tam je viditelných změn opravdu hodně. Jako každý rok - nová verze je pelmel nových funkcí a různých vylepšení menších nebo větších.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Administrace==&lt;br /&gt;
&amp;lt;p&amp;gt;Bloating tabulek může být problém. Skoro všude jsem se setkal se situací, kdy &amp;quot;mazací&amp;quot; skript přestal fungovat (z různých důvodů), přičemž se tato chyba detekovala příliš pozdě, kdy dotčené tabulky měly místo jednotek GB například desítky GB. To už musí zaúřadovat &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, což často znamená vynucenou plánovanou odstávku (kvůli držení exkluzivního zámku). Je to letitý problém, který zkušenější uživatelé řešili buďto pečlivějším monitoringem, v některých případech partišningem (partitioning), případně extenzemi &amp;lt;code&amp;gt;pg_repack&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt;. Autor posledně jmenované extenze Tonda (Antonín Houska) spolu s Alvarem (Alvaro Herrera) poslední dva roky pracovali na integraci &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt; do jádra Postgresu. Paradoxně příkaz, který bude provádět zdrcnutí tabulek, se bude jmenovat &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt;. Základem je logická replikace - zadaná tabulka se lokálně zreplikuje (vytvoří se její nová kopie, a tím se zbaví vnitřního neobsazeného místa). Co je zásadní, je možnost použít volbu &amp;lt;code&amp;gt;CONCURRENTLY&amp;lt;/code&amp;gt;. S touto volbou příkaz nepoužije exkluzivní zámek. Tudíž je možné jej použít za provozu. Nutnou podmínkou je existence primárního klíče (a unikátního indexu).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
REPACK (CONCURRENTLY, VERBOSE) obce;&lt;br /&gt;
INFO:  repacking &amp;quot;public.obce&amp;quot; in physical order&lt;br /&gt;
INFO:  &amp;quot;public.obce&amp;quot;: found 0 removable, 6250 nonremovable row versions in 59 pages&lt;br /&gt;
DETAIL:  0 dead row versions cannot be removed yet.&lt;br /&gt;
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.&lt;br /&gt;
REPACK&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kromě toho, že příkaz &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt; nahrazuje příkaz &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, tak tento příkaz ještě nahrazuje příkaz &amp;lt;code&amp;gt;CLUSTER&amp;lt;/code&amp;gt;, kterým se tabulka fyzicky (jednorázově) přeuspořádá podle zadaného indexu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Možná jste si všimli, že dotaz běžící pod příkazem &amp;lt;code&amp;gt;EXPLAIN ANALYZE&amp;lt;/code&amp;gt; je výrazně pomalejší. Důvodem je měření času - executor, v tomto režimu, neustále poptává aktuální čas, a to má brutální režii. U větších dotazů se vyplatí použít volbu &amp;lt;code&amp;gt;TIMING OFF&amp;lt;/code&amp;gt;. V 19 na x86 se místo systémového času použíjí takty CPU. Je to výrazně rychlejší - zatímco na osmnáctce mi jednoduchý testovací dotaz běžel 2.5x pomalejší v explainu, na devatenáctce pouze 1.5x pomaleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou velkou změnou je vypnutí JIT ve výchozí konfiguraci. JIT se objevil v Postgresu 11, a v Postgresu 12 byl zapnutý ve výchozí konfiguraci. Bohužel se zjistilo, že většině uživatelů, kteří Postgres používají pro OLTP, dělá víc škody než užitku. Došlo to až do stavu, kdy se uživatelům doporučovalo, neoficiálně, po instalaci JIT vypnout. Je tam víc problémů. &amp;lt;code&amp;gt;clang&amp;lt;/code&amp;gt;, na kterém je to postavené, v novějších verzích kompiluje lépe, ale pomaleji. Existují alternativní implementace JIT, ale všechny jsou více než méně experimentální. Druhým problémem je model, na jehož základě se JIT aktivuje. Tento model jednak nedokáže dobře odhadnout náročnost &amp;quot;jitifikace - inliningu, a navíc je citlivý na přestřelení odhadu počtu řádek. Ohledně modelu a citlivosti na odhady pochybuji, že se dá něco dělat. Alternativní implementace JIT mají výrazně nižší režii. Přijde mi to ale jako slepá cesta. Budoucnost vidím v integraci vektorového executoru a vektorových funkcí (tak jak to používá [https://duckdb.org/ DuckDB]). Může to znamenat, že Postgres bude mít duální implementace funkcí (pro skalární parametr, a pro vektor parametrů).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze vytvořit replikační slot pro logickou replikaci, bez nutnosti mít konfiguraci &amp;lt;code&amp;gt;wal_level=logical&amp;lt;/code&amp;gt;. Postačuje nastavení &amp;lt;code&amp;gt;replica&amp;lt;/code&amp;gt;, což je výchozí nastavení. Jakmile je logický replikační slot aktivní, interně se úroveň zápisu do transakčního logu nastaví na &amp;lt;code&amp;gt;logical&amp;lt;/code&amp;gt;. Jaký je aktuální stav zjistíte v konfigurační proměnné &amp;lt;code&amp;gt;effective_wal_level&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Další bombou je možnost zapínat nebo vypínat kontrolní součty (na úrovni datových stránek) za běhu. Kontrolní součty jsou v Postgresu už relativně dlouho, a ačkoliv na dnešním hardware je jejich režie zanedbatelná, tak určitě bude dost databází, kde nebudou zapnuté. Zapnutí kontrolních součtů vyžadovalo odstávku úměrnou velikosti databáze. Navíc se silně doporučuje po zapnutí součtů znovu zreplikovat všechny fyzické repliky. Výhodou je diagnostika, možnost identifikovat poškozené stránky (a přeskočit je), možnost vyrobit replikovaný server ze starého primárního příkazem &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt;. Naplánovat a provést delší odstávku někde nemusí být jednoduché (nebo to může být skoro nemožné). U jednoho mého klienta zapnutí kontrolních součtů na cca 2TB databázi trvalo cca 2 hodiny (na vlastním hardware z roku 2025). Zapnutí se provede voláním funkce &amp;lt;code&amp;gt;pg_enable_data_checksums&amp;lt;/code&amp;gt;. Nastavením volitelných parametrů lze běh funkce zpomalit, tak aby nepřetěžovala IO. Vypnutí provede funkce &amp;lt;code&amp;gt;pg_disable_data_checksums&amp;lt;/code&amp;gt;. Stav procesu můžeme vidět v pohledu &amp;lt;code&amp;gt;pg_stat_progress_data_checksums&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Snad se už konečně vyřešil problém s upgradem databází obsahující extrémně velký počet LO (large objects). Nově binární upgrade (&amp;lt;code&amp;gt;pg_upgrade&amp;lt;/code&amp;gt;) použije pro export metadat LO příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; místo původní sekvence příkazů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- původní sekvence&lt;br /&gt;
SELECT pg_catalog.lo_create(&#039;5432&#039;);&lt;br /&gt;
ALTER LARGE OBJECT 5432 OWNER TO alice;&lt;br /&gt;
GRANT SELECT ON LARGE OBJECT 5432 TO bob;&lt;br /&gt;
&lt;br /&gt;
-- nově&lt;br /&gt;
COPY pg_catalog.pg_largeobject_metadata (oid, lomowner, lomacl) FROM stdin;&lt;br /&gt;
5432 16384 {alice=rw/alice,bob=r/alice}&lt;br /&gt;
\.&lt;br /&gt;
&lt;br /&gt;
COPY pg_catalog.pg_shdepend (dbid, classid, objid, objsubid, refclassid, refobjid, deptype) FROM stdin;&lt;br /&gt;
5 2613 5432 0 1260 16384 o&lt;br /&gt;
5 2613 5432 0 1260 16385 a&lt;br /&gt;
\.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nová implementace by měla být řádově rychlejší.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konečně se dotáhlo do konce začlenění podpory více formátů v příkazu &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Postgres má dva základní příkazy pro export (backup) - &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Historicky tyto příkazy podporovaly pouze &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; formát. Postupem času &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; získal možnost exportu do &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;dictionary&amp;lt;/code&amp;gt; formátu plus import příkazem &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umožňoval paralelní import více tabulek. &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; byl díky podpoře pouze SQL formátu dost omezený. To se nyní změnilo, a v &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; jsou podporovány všechny formáty, které podporuje &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt;. Vypadá to trochu jako workaround. V případě, že se použije jiný než &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; (SQL) formát, tak se vyrobí adresář, který do podadresářů uloží výstup z &amp;lt;code&amp;gt;pg_dumpu&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umí s touto adresářovou strukturou pracovat. Tato možnost se dostala už do 18tky, ale byla na poslední chvíli stažena.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt; zredukovalo kopírování WAL logů z nového primárního serveru na budovanou repliku a to tak, že se budou kopírovat pouze WAL logy vzniklé po rozpadu replikace. V mnoha scénářích se tím výrazně urychlí běh tohoto příkazu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Doposud autovacuum vybíralo tabulky k vakuování na základě porovnání vypočítaných koeficientů a prahových hodnot. Pořadí vybraných tabulek záleželo na fyzickém pořadí v systémové tabulce &amp;lt;code&amp;gt;pg_class&amp;lt;/code&amp;gt;. Nově se vakuum bude prioritizovat podle míry vzdálenosti od prahu. Dalším kritériem je stáří tabulky (počet transakcí od freeze). Stará implementace byla férová v tom, že garantovala, že každá tabulka bude zvakuovaná a že žádná tabulka nebude &amp;quot;předbíhat&amp;quot; ve frontě. Na druhou stranu se mohlo stát, že tabulka s intenzivnějším provozem čekala příliš dlouho a došlo k zbytečnému bloatingu. Nová implementace se snaží být chytřejší. Uvidíme, jak to bude fungovat. Moje zkušenost je taková, že a) není dobré dávat do Postgresu příliš dynamická data, b) je dobré si nastavit počet aktivních autovacuum workerů tak, aby byla určitá rezerva, c) není dobré vytěžovat IO na maximum (je dobré mít dostatečně nadimenzované IO a mít nějakou rezervu). Skóre tabulek můžeme sledovat v pohledu &amp;lt;code&amp;gt;pg_stat_autovacuum_score&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_autovacuum_scores WHERE score &amp;gt; 0.05;&lt;br /&gt;
┌─[ RECORD 1 ]────────┬──────────────────────┐&lt;br /&gt;
│ relid               │ 1262                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_database          │&lt;br /&gt;
│ score               │ 0.15936254737880529  │&lt;br /&gt;
│ xid_score           │ 1e-07                │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0.0793650769622719   │&lt;br /&gt;
│ vacuum_insert_score │ 0.003998400542165933 │&lt;br /&gt;
│ analyze_score       │ 0.15936254737880529  │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
╞═[ RECORD 2 ]════════╪══════════════════════╡&lt;br /&gt;
│ relid               │ 1214                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_shdepend          │&lt;br /&gt;
│ score               │ 0.12                 │&lt;br /&gt;
│ xid_score           │ 1.15e-07             │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0                    │&lt;br /&gt;
│ vacuum_insert_score │ 0.006                │&lt;br /&gt;
│ analyze_score       │ 0.12                 │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
└─────────────────────┴──────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově autovacuum může použít &amp;lt;code&amp;gt;VACUUM&amp;lt;/code&amp;gt; s podporou paralelismu.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přehled o aktuálním stavu recovery je k dispozici v pohledu &amp;lt;code&amp;gt;pg_stat_recovery&amp;lt;/code&amp;gt;. V pohledu &amp;lt;code&amp;gt;pg_stat_statements&amp;lt;/code&amp;gt; jsou dva nové sloupce &amp;lt;code&amp;gt;generic_plan_calls&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;custom_plan_calls&amp;lt;/code&amp;gt; zobrazující kolikrát předpřipravený příkaz (prepared statement) použil generický nebo zákaznický plán. Nový sloupec &amp;lt;code&amp;gt;wal_fpi_bytes&amp;lt;/code&amp;gt; zobrazuje velikost zápisu tzv. plných stránek do transakčního logu. Vysoká hodnota může signalizovat nepříjemně velkou četnost vynucených checkpointů (je nutné zvednout &amp;lt;code&amp;gt;max_wal_size&amp;lt;/code&amp;gt; případně &amp;lt;code&amp;gt;checkpoint_timeout&amp;lt;/code&amp;gt;). V novém pohledu &amp;lt;code&amp;gt;pg_stat_lock&amp;lt;/code&amp;gt; uvidíme počet a celkový čas čekání na různé typy zámků. Zaznamenány jsou pouze ty situace, kdy se čeká na zámek déle než jednu sekundu (stejně jako např. &amp;lt;code&amp;gt;log_lock_waits&amp;lt;/code&amp;gt;, které je v nyní ve výchozí konfiguraci zapnuté). Bohužel zámky, které trvají cca 100ms, mající nepříjemný dopad na dotazy kolem 10ms, zde neuvidíme:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_lock ;&lt;br /&gt;
┌──────────────────┬───────┬───────────┬───────────────────┬───────────────────────────────┐&lt;br /&gt;
│     locktype     │ waits │ wait_time │ fastpath_exceeded │          stats_reset          │&lt;br /&gt;
╞══════════════════╪═══════╪═══════════╪═══════════════════╪═══════════════════════════════╡&lt;br /&gt;
│ relation         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ extend           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ frozenid         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ page             │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ tuple            │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ transactionid    │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ virtualxid       │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ spectoken        │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ object           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ userlock         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ advisory         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ applytransaction │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
└──────────────────┴───────┴───────────┴───────────────────┴───────────────────────────────┘&lt;br /&gt;
(12 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze Postgres podporuje asynchronní IO. Čtení je realizováno dedikovanými procesy (workers). Počáteční implementace pracovala s konfigurovatelným počtem těchto procesů (výchozí nastavení mělo hodnotu 3). Nově je správa workerů dynamičtější - v případě potřeby si je Postgres nastartuje nebo naopak zavře. Místo fixního počtu nyní nastavujeme minimální a maximální počet workerů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io_min_workers=2&lt;br /&gt;
io_max_workers=8 (up to 32)&lt;br /&gt;
io_worker_idle_timeout=60s&lt;br /&gt;
io_worker_launch_interval=100ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Poměrně razantně se změnila konfigurace &amp;lt;code&amp;gt;log_min_messages&amp;lt;/code&amp;gt;, která udává, na které úrovni se mají chyby zapsat do systémového logu (&amp;lt;code&amp;gt;DEBUG5&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;PANIC&amp;lt;/code&amp;gt;). Nově lze tuto úroveň nastavit pro každý typ procesu (&amp;lt;code&amp;gt;archiver&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;autovacuum&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bgworker&amp;lt;/code&amp;gt;, ...) např. &amp;lt;code&amp;gt;error, walsender:debug1, autovacuum:debug1&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Správa partišen (partitions) byla v Postgresu základní. Díky možnosti sloučit nebo rozdělit partišny (partitions) se dostává trochu dál. Je to spíš první krok se spoustou omezení - používá se pouze jedno CPU a po celou dobu je exkluzivně zamknutá rodičovská tabulka. Ale i tak to může dost uživatelům ušetřit práci (a jejich vlastní řešení by pravděpodobně mělo stejná omezení):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_east, sales_central)  INTO sales_all;&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE measurement SPLIT PARTITION measurement_y2006q1 INTO&lt;br /&gt;
   (PARTITION measurement_y2006m01 FOR VALUES FROM (&#039;2006-01-01&#039;) TO (&#039;2006-02-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m02 FOR VALUES FROM (&#039;2006-02-01&#039;) TO (&#039;2006-03-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m03 FOR VALUES FROM (&#039;2006-03-01&#039;) TO (&#039;2006-04-01&#039;));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Oproti předchozím verzím lze zapínat a vypínat všechny typy omezení (nejen cizí klíče):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, CONSTRAINT cc CHECK(a &amp;gt; 0) NOT ENFORCED); &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
INSERT INTO foo VALUES(1);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ERROR:  check constraint &amp;quot;cc&amp;quot; of relation &amp;quot;foo&amp;quot; is violated by some row&lt;br /&gt;
DELETE FROM foo WHERE a = 0;&lt;br /&gt;
DELETE 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
ERROR:  new row for relation &amp;quot;foo&amp;quot; violates check constraint &amp;quot;cc&amp;quot;&lt;br /&gt;
DETAIL:  Failing row contains (0).&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc NOT ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==pg_plan_advice==&lt;br /&gt;
&amp;lt;p&amp;gt;Až doposud uživatelé Postgresu neměli moc možností, jak ovlivnit generování prováděcích plánů. Hinty ve stylu Oracle byly a jsou z historických důvodů tabu (jsou implementovány extenzí [https://github.com/ossc-db/pg_hint_plan pg_hint_plan]). Uživatel měl pouze možnost penalizace metod executoru - např. &amp;lt;code&amp;gt;enable_nestloop&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;enable_indexscan&amp;lt;/code&amp;gt; nastavením na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Tato penalizace je ale dost hrubá, a neumožňuje jemné ovlivnění plánovače. Přesto se používala a používá. Rober Haas napsal dvě extenze [https://www.postgresql.org/docs/devel/pgplanadvice.html &amp;lt;code&amp;gt;pg_plan_advice&amp;lt;/code&amp;gt;] a [https://www.postgresql.org/docs/devel/pgstashadvice.html &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;]. Prvně zmíněná extenze umožňuje definovat jakási doporučení, která by měl planner respektovat. Pro každý plán lze zpětně dogenerovat tato doporučení:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce&lt;br /&gt;
  ORDER BY pocet_muzu + pocet_zen DESC&lt;br /&gt;
  LIMIT 10;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Limit  (cost=272.19..272.21 rows=10 width=45)                        │&lt;br /&gt;
│   -&amp;gt;  Sort  (cost=272.19..287.81 rows=6250 width=45)                 │&lt;br /&gt;
│         Sort Key: ((pocet_muzu + pocet_zen)) DESC                    │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on obce  (cost=0.00..137.12 rows=6250 width=45) │&lt;br /&gt;
│ Generated Plan Advice:                                               │&lt;br /&gt;
│   SEQ_SCAN(obce)                                                     │&lt;br /&gt;
│   NO_GATHER(obce)                                                    │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                      QUERY PLAN                                      │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Nested Loop  (cost=0.28..12.56 rows=81 width=58)                                     │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17)                          │&lt;br /&gt;
│         Filter: (nazev = &#039;Beroun&#039;::text)                                             │&lt;br /&gt;
│   -&amp;gt;  Index Scan using obce_okres_id_idx on obce  (cost=0.28..9.79 rows=81 width=41) │&lt;br /&gt;
│         Index Cond: ((okres_id)::text = okresy.id)                                   │&lt;br /&gt;
│ Generated Plan Advice:                                                               │&lt;br /&gt;
│   JOIN_ORDER(okresy obce)                                                            │&lt;br /&gt;
│   NESTED_LOOP_PLAIN(obce)                                                            │&lt;br /&gt;
│   SEQ_SCAN(okresy)                                                                   │&lt;br /&gt;
│   INDEX_SCAN(obce public.obce_okres_id_idx)                                          │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                                             │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(11 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Prostřednictvím konfigurační proměnné &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; můžeme ovlivnit chování planneru vlastními doporučeními:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET pg_plan_advice.advice to &#039;JOIN_ORDER(obce okresy)&#039;;&lt;br /&gt;
SET&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌───────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                            QUERY PLAN                             │&lt;br /&gt;
╞═══════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Join  (cost=1.97..140.78 rows=81 width=58)                   │&lt;br /&gt;
│   Hash Cond: ((obce.okres_id)::text = okresy.id)                  │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on obce  (cost=0.00..121.50 rows=6250 width=41)    │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=1.96..1.96 rows=1 width=17)                     │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17) │&lt;br /&gt;
│               Filter: (nazev = &#039;Beroun&#039;::text)                    │&lt;br /&gt;
│ Supplied Plan Advice:                                             │&lt;br /&gt;
│   JOIN_ORDER(obce okresy) /* matched */                           │&lt;br /&gt;
│ Generated Plan Advice:                                            │&lt;br /&gt;
│   JOIN_ORDER(obce okresy)                                         │&lt;br /&gt;
│   HASH_JOIN(okresy)                                               │&lt;br /&gt;
│   SEQ_SCAN(obce okresy)                                           │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                          │&lt;br /&gt;
└───────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(13 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konfigurace planneru prostřednictvím &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; nestačí, pokud potřebujeme ovlivnit plán dotazu z aplikace, u které nemůžeme nebo nechceme měnit zdrojový kód. A proto je tu druhá zmíněná extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;, která umožňuje naše &amp;quot;doporučení&amp;quot; uložit a pak automaticky aplikovat na základě tzv &amp;lt;code&amp;gt;queryid&amp;lt;/code&amp;gt;. Doporučení jsou uložena v pojmenovaných skladech (stashes). Skrze konfigurační proměnnou &amp;lt;code&amp;gt;pg_stash_advice.stash_name&amp;lt;/code&amp;gt; volíme aktivní sklad. Každý uživatel, každá databáze může mít svůj vlastní. Pokud proměnná není nastavená, tak je extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt; neaktivní. Uložené nápovědy jsou perzistentní - při vypnutí serveru se uloží, po startu znovu načtou do paměti.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SQL==&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; je syntaxe, kterou postres přejímá z analytických databází (zde to snad byla [https://duckdb.org/2022/05/04/friendlier-sql#group-by-all DuckDB]). Pokud se použije tento zápis, tak se automaticky agreguje podle všech sloupců, které nejsou v agregační funkci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT sum(pocet_zen + pocet_muzu), okresy.id, okresy.nazev &lt;br /&gt;
  FROM obce join okresy ON obce.okres_id = okresy.id&lt;br /&gt;
 GROUP BY ALL;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tento zápis může ušetřit dost psaní, může to být také &amp;quot;tichý&amp;quot; zabiják výkonu. Čím více atributů je v klauzuli &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;, tím je agregace pomalejší. Zápis &amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; ještě není ve standardu, ale je standardizační komisí akceptován, a měl by být v některé další verzi ANSI/SQL.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Počínaje Postgresem 19 už nebude možnost používat backlash jako escape symbol v řetězcích. Před 15 roky se přešlo na standardní chování (předtím se řetězce v Postgresu chovali stejně jako v Cčku), nicméně nestandardní chování bylo možné vynutit nastavením &amp;lt;code&amp;gt;standard_conforming_strings&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Mezi top vývojáři Postgresu je hodně velká averze k tzv kompatibility flagům (zmíněný flag nebyl výjimkou) (pozn. u komerčních databází jsou naopak kompatibility flagu standardem, a nejen u nich - např. MySQL). Nyní je tato možnost zrušena, a Cčkové stringy dostaneme pouze jen zápisem (jako tzv extended strings):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;ahoj\nsvete&#039;;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│  ?column?   │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ ahoj\nsvete │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT e&#039;Ahoj\nSvete&#039;;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ Ahoj    ↵│&lt;br /&gt;
│ Svete    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze v u window funkcí &amp;lt;code&amp;gt;lead&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lag&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;first_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last_value&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;nth_value&amp;lt;/code&amp;gt; použít klauzuli &amp;lt;code&amp;gt;IGNORE NULLS&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;. Výchozí chování, které bylo implementováno již dříve odpovídá klauzuli &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==SQL/PGQ==&lt;br /&gt;
&amp;lt;p&amp;gt;V tomto případě PG není častým prefixem symbolizujícím Postgres (a Q jako queue), ale Property Graph Queries. Počínaje podporou neatomických datových typů v SQL:2000, přes podporu XML v SQL:2003 se standard rozšířil nad rámec čistě relačních databází (stejně ale už dříve existovala kritika SQL z pohledu čistoty od relačních dogmatiků). Standard SQL:2023 (ISO/IEC 9075-16:2023) SQL rozšiřuje o podporu grafových databází, které mají svůj vlastní datový model odlišný od relačního modelu. Přijde mi to jako dost odvážný krok (a ještě teď tomu nemohu úplně uvěřit). Zatím existovala zřetelná jednota mezi SQL a relačním modelem. Od nové části standardu se očekává, že pomůže s přehlednějším zápisem určitých dotazů, které se až doposud řešily pomocí rekurze. Přiznám se, že zápis dotazu v PGQ (využívajícího ascii art) mi přijde hodně cizí (možná zažívám pocity programátora v Cobolu, když se poprvé podíval na SQL. Osobně mi to nesedí - reprezentaci znalostí ve formátu grafu jsem nikdy nemusel (vím, že je to jen jiná reprezentace téhož)). Row pattern recognition z roku SQL:2016 toho také nemá s relačními databázemi moc společného, takže to takové překvapení není. Práce na této části standardu začaly v roce 2017 (a integrovaly se prvky jazyka [https://neo4j.com/docs/cypher-manual/current/introduction/cypher-overview/ Cypher] (Neo4j) a [https://docs.oracle.com/en/database/oracle/property-graph/20.4/spgdg/property-graph-query-language-pgql.html#GUID-301FF092-1A07-43D2-91E5-0C5AFF3467CC PGQL] (Oracle)).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Základem grafových databází je graf skládající se z uzlů a hran. Ka každému uzlu i hraně mohou být přiřazeny atributy (properties). Hrany mohou být orientované i neorientované. Standard pro takové grafy používá termín Property Graphs. Graf se definuje příkazem &amp;lt;code&amp;gt;CREATE PROPERTY GRAPH&amp;lt;/code&amp;gt; a je to určitá forma pohledu. Přesto, že jsem zkoušel poměrně triviální příklad, nebylo pro mne intuitivní napsat SQL/PGQ dotaz. Pro uživatele bez zkušenosti s Neo4j nebo jinou grafovou databází budou začátky s SQL/PGQ dost bolestivé. V tuto chvíli (duben 2026) ještě není hotová dokumentace. Je možné, že se díky integraci SQL/PGQ do Postgresu setkám s grafovými databázemi častěji (SQL/PGQ je podporováno v DuckDB a v Oracle):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE public.uzivatele (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  jmeno character varying&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE public.zpravy (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  odesilatel integer,&lt;br /&gt;
  prijemce integer,&lt;br /&gt;
  tema text&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- uzivatel - odeslal -&amp;gt; uzivatel&lt;br /&gt;
CREATE PROPERTY GRAPH public.pg1&lt;br /&gt;
  VERTEX TABLES (&lt;br /&gt;
    public.uzivatele AS uzivatel KEY (id) PROPERTIES (id, jmeno)&lt;br /&gt;
  )&lt;br /&gt;
  EDGE TABLES (&lt;br /&gt;
    public.zpravy AS odeslal KEY (id)&lt;br /&gt;
    SOURCE KEY (odesilatel) REFERENCES uzivatel (id)&lt;br /&gt;
    DESTINATION KEY (prijemce) REFERENCES uzivatel (id)&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (1, &#039;Pavel&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (2, &#039;Zdenek&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (3, &#039;Tomas&#039;);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.zpravy VALUES (1, 1, 2, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (2, 2, 1, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (3, 1, 3, &#039;dotaz ohledne dopravy&#039;);&lt;br /&gt;
&lt;br /&gt;
-- od koho uzivatel Pavel dostal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) &amp;lt;-[IS odeslal]- (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
└────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- komu uzivatel Pavel poslal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) -[IS odeslal]-&amp;gt; (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
│ Tomas  │&lt;br /&gt;
└────────┘&lt;br /&gt;
(2 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Osobně si nedovedu představit, že bych psal dotazy v SQL/PGQ (myslím, že podobně na tom bude většina uživatelů podobně). Je otázkou, jestli se SQL/PGQ neuplatní ve spolupráci s AI. V tomto případě se běžný dotaz rozpadá do dvou kroků. Navíc i joinovací podmínka získává label, takže je to v určitém smyslu více popisné, než běžné SQL, a je tak možné, že tento zápis bude AI více sedět.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pomalu se pokračuje na implementaci tzv temporálních tabulek. Letos je to podpora klauzule &amp;lt;code&amp;gt;FOR PORTION OF valid_at FROM TO&amp;lt;/code&amp;gt;. Zjednodušeně, pokud máme temporální databáze nebo temporální tabulky, tak se můžeme podívat na stav dat v nějakém čase. Pokud se použije klauzule &amp;lt;code&amp;gt;FOR PORTION OF FROM TO&amp;lt;/code&amp;gt;, tak se jedná o tzv temporální &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- je nutne mit nainstalovanou extenzi btree_gist&lt;br /&gt;
CREATE TABLE ceny(&lt;br /&gt;
  id int,&lt;br /&gt;
  valid_at daterange,&lt;br /&gt;
  nazev text,&lt;br /&gt;
  cena int,&lt;br /&gt;
  PRIMARY KEY (id, valid_at WITHOUT OVERLAPS)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
-- jednotna cena mezi 2020-01-01 a 2025-12-31&lt;br /&gt;
INSERT INTO ceny VALUES(1, &#039;[2020-01-01,2026-01-01)&#039;, &#039;pecivo&#039;, 20);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- uprava ceny mezi 2021-01-01 a 2021-02-28&lt;br /&gt;
UPDATE ceny&lt;br /&gt;
   FOR PORTION OF valid_at FROM &#039;2021-01-01&#039; TO &#039;2021-03-01&#039;&lt;br /&gt;
   SET cena = 30&lt;br /&gt;
 WHERE id = 1;&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny ORDER BY valid_at;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2021-01-01) │ pecivo │   20 │&lt;br /&gt;
│  1 │ [2021-01-01,2021-03-01) │ pecivo │   30 │&lt;br /&gt;
│  1 │ [2021-03-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nové datové typy a funkce==&lt;br /&gt;
&amp;lt;p&amp;gt;V Postgresu se můžete setkat s datovými typy s prefixem &amp;lt;code&amp;gt;reg&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;regrole&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regproc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regclass&amp;lt;/code&amp;gt;. Tyto datové typy jsou vždy spojeny s jednou konkrétní systémovou tabulkou a hodnoty těchto typů vždy nesou unikátní číselný identifikátor databázového objektu. Tyto typy podporují přetypování z textu, což se používá pro zkrácený zápis vyhledávání nějakého databázového objektu v katalogu. Nově můžeme používat typ &amp;lt;code&amp;gt;regdatabase&amp;lt;/code&amp;gt; a tento typ se odkazuje, jak je patrné z názvu, na tabulku &amp;lt;code&amp;gt;pg_database&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ regdatabase │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ template1   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase::oid;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT oid&lt;br /&gt;
 FROM pg_database &lt;br /&gt;
 WHERE datname = &#039;template1&#039;;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Díky těmto typům jsou dotazy nad systémovým katalogem kratší a čitelnější. Navíc autor dotazů nemusí brát v potaz některé detaily (jako například case sensitivitu), kde se chování SQL identifikátorů liší od SQL stringů. To je ošetřeno interně při přetypování.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce &amp;lt;code&amp;gt;error_on_null&amp;lt;/code&amp;gt; vyhodí výjimku, pokud je parametr NULL. Jinak vrátí hodnotu parametru. Implementace je extrémně jednoduchá - sleduje flag &amp;lt;code&amp;gt;isnull&amp;lt;/code&amp;gt;. Každý parametr každé SQL funkce má tento flag. Stejné chování má flag funkce &amp;lt;code&amp;gt;STRICT&amp;lt;/code&amp;gt;. Je tu drobná zrada. V případě kompozitních typů to není kompatibilní s operátorem &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;. Kompozitní hodnota obsahující pouze &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;y je interně ne nullová, ale operátor &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt; pro takovou kompozitní hodnotu vrátí &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT ROW(NULL, NULL) IS NULL;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT error_on_null(NULL::integer);&lt;br /&gt;
ERROR:  null value not allowed&lt;br /&gt;
SELECT error_on_null(ROW(NULL, NULL));&lt;br /&gt;
┌───────────────┐&lt;br /&gt;
│ error_on_null │&lt;br /&gt;
╞═══════════════╡&lt;br /&gt;
│ (,)           │&lt;br /&gt;
└───────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Roky se v Postgresu mluví o tom, že by měl existovat snadný způsob, jak zpětně z databázového objektu vygenerovat DDL příkaz. Osobně jsem nikdy tuhle potřebu neměl, ale do jisté míry této potřebě rozumím. Skoro v každém admin nástroji můžete iterovat přes databázové objekty a k nim si nechat zobrazit DDL. A skoro každý admin tool, pak tuto funkcionalitu duplicitně implementuje - s chybami nebo bez chyb. Je to kód, který vyžaduje neustálou údržbu a aktualizace. Po letech diskuzí se je v upstreamu první část funkcí &amp;lt;code&amp;gt;pg_get_...ddl&amp;lt;/code&amp;gt; (aktuálně &amp;lt;code&amp;gt;pg_get_database_ddl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pg_get_role_ddl&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_get_tablespace_ddl&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT pg_get_role_ddl(&#039;pavel&#039;);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                       pg_get_role_ddl                                        │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ CREATE ROLE pavel SUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS; │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze je v postgresu funkce generující náhodné číslo v zadaném rozsahu. K nim nyní přibyly funkce pro rozsah typů &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;timestamptz&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SELECT random(current_date - 6, current_date);&lt;br /&gt;
┌────────────┐&lt;br /&gt;
│   random   │&lt;br /&gt;
╞════════════╡&lt;br /&gt;
│ 2026-04-13 │&lt;br /&gt;
└────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT random(current_timestamp - interval &#039;1 week&#039;, current_timestamp);&lt;br /&gt;
┌───────────────────────────────┐&lt;br /&gt;
│            random             │&lt;br /&gt;
╞═══════════════════════════════╡&lt;br /&gt;
│ 2026-04-09 02:30:30.665819+02 │&lt;br /&gt;
└───────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Optimalizace==&lt;br /&gt;
&amp;lt;p&amp;gt;Jako nejdůležitější optimalizaci v nové verzi vidím optimalizaci implementace kontroly referenční integrity. RI je v postgresu realizována v systémových řádkových triggerech, které, až doposud, provedly (pro každý řádek) jeden kontrolní SQL příkaz (s použitím SPI API - stejné API, které se používá např. v PL/pgSQL). Nově se hledá přímo v indexech - přeskakuje se celý aparát SQL. To je první výrazná optimalizace. Druhou výraznou optimalizací je hledání nikoliv jedné hodnoty, ale pole hodnot (n = 64). Podle autora patche je nyní kontrola referenční integrity cca 3x rychlejší. Pořád to bude znát. Výrazně se ale posune hranice, od kdy se vyplatí při masivních importech kontrolu referenční integrity vypínat.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE tab_a(id int PRIMARY KEY);&lt;br /&gt;
INSERT INTO tab_a SELECT generate_series(1,1000);&lt;br /&gt;
VACUUM ANALYZE tab_a;&lt;br /&gt;
&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b_no_ri(id int, a_id int);&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b(id int, a_id int references tab_a(id));&lt;br /&gt;
\timing&lt;br /&gt;
-- postgres 18&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 12844,206 ms (00:12,844)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 659,462 ms&lt;br /&gt;
&lt;br /&gt;
-- postgres 19&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 2728,073 ms (00:02,728)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 673,444 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ukázkový test je best case - zrychlení je cca čtyřnásobné. Stále je import s RI cca 4x pomalejší než bez RI (a to cílová tabulka obsahuje pouze jeden cizí klíč). V praxi to bude jiné - kromě RI je náročná i aktualizace indexů a samozřejmě všechny diskové operace.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Určitě každý, kdo pracuje s Postgresem trochu déle, se setkal s doporučením &amp;quot;nepoužívej &amp;lt;code&amp;gt;NOT IN (SELECT ...&amp;lt;/code&amp;gt;&amp;quot;. Důvodem byla (v některých případech) &amp;quot;špatná&amp;quot; optimalizace. Optimalizátor neměl garanci, že subselect nevrátí &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;. Poté, co se ve verzi 18 přepsal systém pro ukládání omezujících pravidel (constraints), už bylo možné do tuto informaci v optimalizátoru použít. Nyní se by se měl subselect &amp;lt;code&amp;gt;NOT IN&amp;lt;/code&amp;gt; transformovat na tzv anti-join (v těch případech, kdy je garantováno, že žádná proměnná v predikátu nebude &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;). Jinými slovy, pokud optimalizátor bude mít garance, že se v predikátu subselectu nevyskytne &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, tak vygeneruje stejný plán, jako kdybyste použili zápis s &amp;lt;code&amp;gt;NOT EXISTS&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE osoby(id int PRIMARY KEY, jmeno varchar);&lt;br /&gt;
CREATE TABLE faktury(id int primary key,&lt;br /&gt;
                     vlozeno timestamp,&lt;br /&gt;
                     podal int REFERENCES osoby(id) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT *&lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE id NOT IN (SELECT podal&lt;br /&gt;
                            FROM faktury);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT * &lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE NOT EXISTS(SELECT podal &lt;br /&gt;
                            FROM faktury&lt;br /&gt;
                           WHERE podal = osoby.id);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
-- ve starších verzích dostanete různé plány&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ve starších verzích spojení relací vždy předcházelo agregaci. To v některých případech může být neefektivní (pokud agregace výrazně redukuje počet řádek). Pokud jsem chtěl změnit pořadí operací, musel jsem si to vynutit zápisem (poddotazem). V devatenáctce optimalizátor podporuje tzv předběžnou agregaci (eager aggregation), která předbíhá před join:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT sum(pocet_zen + pocet_muzu), okresy.nazev &lt;br /&gt;
                  FROM okresy JOIN obce ON okresy.id = obce.okres_id&lt;br /&gt;
                 GROUP BY okresy.nazev;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                                QUERY PLAN                                                │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Finalize HashAggregate  (cost=157.38..158.15 rows=77 width=18)                                           │&lt;br /&gt;
│   Group Key: okresy.nazev                                                                                │&lt;br /&gt;
│   -&amp;gt;  Hash Join  (cost=3.02..157.00 rows=77 width=18)                                                    │&lt;br /&gt;
│         Hash Cond: ((obce.okres_id)::text = okresy.id)                                                   │&lt;br /&gt;
│         -&amp;gt;  Partial GroupAggregate  (cost=0.28..154.05 rows=77 width=15)                                 │&lt;br /&gt;
│               Group Key: obce.okres_id                                                                   │&lt;br /&gt;
│               -&amp;gt;  Index Only Scan using obce_okres_id_idx on obce  (cost=0.28..122.03 rows=6250 width=7) │&lt;br /&gt;
│         -&amp;gt;  Hash  (cost=1.77..1.77 rows=77 width=17)                                                     │&lt;br /&gt;
│               -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.77 rows=77 width=17)                                 │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(9 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Na datech pro ČR je výše uvedený dotaz cca 3x rychlejší (v pg19 vůči pg18).&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud je jeden řádek zamčený vícero transakcemi, tak se do jeho systémového atributu &amp;lt;code&amp;gt;xmax&amp;lt;/code&amp;gt; uloží tzv &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; (MultiXact je &amp;quot;aparát&amp;quot;, kterým se v Postgresu implementují řádkové zámky). To je unikátní identifikátor skupiny transakcí, které drží zámek. Každá skupina transakcí se skládá z tzv členských záznamů &amp;lt;code&amp;gt;MultiXactMember&amp;lt;/code&amp;gt;, ve kterých se drží identifikátor transakce, typ zámku a stav transakce. Také tyto záznamy mají své unikátní id &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Doposud &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; byla 32bitová hodnota. Nově je tato hodnota 64bitová, a nehrozí její přetečení. &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; i id transakcí jsou stále 32bitové hodnoty (existuje několik rozpracovaných řešení, které zvyšují jejich rozsah), takže stále hrozí přetečení těchto id, a nastartování vynuceného freezování (což u více zatížených systémů může způsobit problémy s produkcí). Eliminovala se ale možnost přetečení &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Je tp důležité, protože &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; rostl ze všech zmíněných id nejrychleji (pokud &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; je počet transakcí se sdílenými zámky, pak růst &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; je &amp;lt;code&amp;gt;nxn&amp;lt;/code&amp;gt;). Informace o MultiXact (skupinách transakcí) lze získat novou funkcí &amp;lt;code&amp;gt;pg_get_multixact_stats()&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přepracoval se kód, který implementuje příkazy &amp;lt;code&amp;gt;LISTEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NOTIFY&amp;lt;/code&amp;gt;. Předchozí verze probouzely každý proces, který čekal na notifikaci (bez ohledu na to jestli čekal nebo nečekal na kanálu, který dostal notifikaci). Stará implementace fungovala dobře, pokud počet použitých kanálů byl malý, a tudíž byla i malá šance, že se probudí proces, který čeká na jiném kanálu než je aktuální notifikace. Uživatelé ale začali notifikace používat i jinak, a reportovali výrazné zpomalení pokud větší množství klientů poslouchalo na větším množství různých kanálů. Ve zprávě ke patchi je uvedeno zpomalení (pro 1 klienta 9100 TPS, pro 1000 klientů 200 TPS). Nová implementace ve sdílené paměti ke každému kanálu drží seznam čekajících klientů. V případě zprávy do některého kanálu se probudí pouze procesy, které na tomto kanálu poslouchají (i zde je vidět pokles TPS, ale výrazně menší - pro 1000 klientů 9000 TPS).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Výchozí komprimace TOASTu bude &amp;lt;code&amp;gt;lz4&amp;lt;/code&amp;gt; (namísto &amp;lt;code&amp;gt;pglz&amp;lt;/code&amp;gt;). LZ4 je jako volba už cca 5 let, a měla by být efektivnější (jak v komprimaci, tak ve využití CPU) než původní LZ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Postupně víc funkcí je akcelerováno pomocí SIMD. Nově to jsou funkce &amp;lt;code&amp;gt;hex_encode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hex_decode&amp;lt;/code&amp;gt; a parsování csv, tsv formátů příkazu &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; (hledání speciálních znaků).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Některé extenze, jako např. &amp;lt;code&amp;gt;pgstattuple&amp;lt;/code&amp;gt;, nově používají direct API pro čtení dat (implementované v pg18). Na systémech s rychlým IO by měly běžet rychleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Na základě reportů uživatelů se upravila implementace hashjoinu, tak aby nedocházelo k extrémnímu nárůstu alokace paměti v případech, kdy atribut použitý pro spojení relací obsahuje velké množství &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; hodnot.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V těch případech, kdy je garantováno, že porovnávané hodnoty jsou ne nullové, tak se operátor &amp;lt;code&amp;gt;IS DISTICT FROM&amp;lt;/code&amp;gt; nahradí operátorem &amp;lt;code&amp;gt;&amp;lt;&amp;gt;&amp;lt;/code&amp;gt;, případně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM&amp;lt;/code&amp;gt; operátorem &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;. Tady je otázkou, jaký bude reálný dopad. Jako programátor používám &amp;lt;code&amp;gt;IS [ NOT ] DISTINCT FROM&amp;lt;/code&amp;gt; jedině v těch případech, které komplikují potenciální NULLy. Je ale pravdou, že drtivou většinu SQL, dnes generují ORM frameworky, ktere nemusí mít vždy dostatečnou chytrost. Výraz &amp;lt;code&amp;gt;IS DISTINCT FROM NULL&amp;lt;/code&amp;gt; se nyní transformuje na &amp;lt;code&amp;gt;IS NOT NULL&amp;lt;/code&amp;gt;, obdobně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM NULL&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Replikace==&lt;br /&gt;
&amp;lt;p&amp;gt;Dlouhodobým cílem implementace logické replikace je podpora multimaster řešení. Zatím je k tomu ještě dlouhá cesta. Chybí podpora replikace DDL příkazů, plná podpora sekvencí, plná podpora řešení replikačních kolizí. Postupuje se v malých krocích. Letos je to podpora jednorázového refrešnutí sekvencí &amp;lt;code&amp;gt;ALTER SUBSCRIPTION ... REFRESH SEQUENCES&amp;lt;/code&amp;gt;. S multimasterem to úplně nepomůže, ale může to zjednodušit upgrade skrze logickou replikaci.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Novým příkazem je příkaz &amp;lt;code&amp;gt;WAIT FOR&amp;lt;/code&amp;gt;, který je možné použít na replikách, a který zajistí čekání na zreplikování zadané transakce. Lze nastavit timeout. Parametrem &amp;lt;code&amp;gt;NO_THROW&amp;lt;/code&amp;gt; zajistí tiché (bez výjimky) ukončení příkazu po timeoutu (změní se pouze vrácená hodnota):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# WAIT FOR LSN &#039;0/306EE20&#039; WITH (TIMEOUT &#039;100ms&#039;, NO_THROW);&lt;br /&gt;
 status&lt;br /&gt;
--------&lt;br /&gt;
 timeout&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V příkazu &amp;lt;code&amp;gt;CREATE PUBLICATION ... FOR ALL TABLES&amp;lt;/code&amp;gt; je nyní možné použít klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE (t1, ...)&amp;lt;/code&amp;gt;. Klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE&amp;lt;/code&amp;gt; lze použít i v příkazu &amp;lt;code&amp;gt;ALTER PUBLICATION&amp;lt;/code&amp;gt;. Pro registraci odběru (&amp;lt;code&amp;gt;CREATE SUBSCRIPTION&amp;lt;/code&amp;gt;) lze místo explicitního connection stringu použít odkaz na dříve definovaný FDW server.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V pohledu &amp;lt;code&amp;gt;pg_replication_slots&amp;lt;/code&amp;gt; je nový sloupec &amp;lt;code&amp;gt;slotsync_skip_reason&amp;lt;/code&amp;gt; popisující důvod, proč nebylo možné synchronizovat repliku. V tom případě bude obsahovat jednu z následujících hodnot: &amp;lt;code&amp;gt;wal_or_rows_removed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wal_not flushed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;no_consistent_snapshot&amp;lt;/code&amp;gt; nebo 	&amp;lt;code&amp;gt;slot_invalidated&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud při registraci odběru nastavíme parametr &amp;lt;code&amp;gt;retain_dead_tuples&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; (výchozí nastavení je &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;), budou se detekovat kolize update-delete, kdy nedojde k update z důvodu smazaného řádku. Pozor, tato volba dočasně blokuje vakuování zrušených řádků (zvlášť pokud je replika nedostupná a nedochází k synchronizaci). Lze nastavit timeout &amp;lt;code&amp;gt;max_retention_duration&amp;lt;/code&amp;gt;, samozřejmě pak ovšem může dojít ke kolizi update-delete. Bez detekce této kolize může dojít k tiché nekonzistenci obsahu napříč různými zdroji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Ostatní==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; podporuje formát &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt; (pouze export).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT JSON&lt;br /&gt;
{&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT (FORMAT JSON, FORCE_ARRAY)&lt;br /&gt;
[&lt;br /&gt;
 {&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nyní také tento příkaz podporuje volbu &amp;lt;code&amp;gt;ON_ERROR SET_NULL&amp;lt;/code&amp;gt;, která způsobí ignorování hodnot, na kterých selže typová konverze. To je možné díky tomu, že se již dříve zavedla podpora tzv měkkých chyb (soft errors). Tyto chyby lze ošetřit s řádově menší režií než běžné chyby (nejsou potřeba subtransakce). Podpora soft errors se v Postgresu objevila s podporou klauzule &amp;lt;code&amp;gt;ON ERROR&amp;lt;/code&amp;gt; SQL/JSON funkcí. V plánu je podpora error safe přetypování (&amp;lt;code&amp;gt;CAST expr AS type xxx DEFAULT expr ON CONVERSION ERROR&amp;lt;/code&amp;gt;). Prvním nezbytným krokem je požadavek, aby konverzní funkce používaly měkké chyby. To teď v upstreamu je, a díky tomu, bylo i relativně jednoduché implementovat &amp;lt;code&amp;gt;COPY ON_ERROR SET_NULL&amp;lt;/code&amp;gt; (error safe casts by měly být v pg20).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, b int);&lt;br /&gt;
&lt;br /&gt;
COPY foo FROM stdin (FORMAT csv, ON_ERROR SET_NULL);&lt;br /&gt;
Enter data to be copied followed by a newline.&lt;br /&gt;
End with a backslash and a period on a line by itself, or an EOF signal.&lt;br /&gt;
&amp;gt;&amp;gt; 10,20&lt;br /&gt;
&amp;gt;&amp;gt; 30,40&lt;br /&gt;
&amp;gt;&amp;gt; ahoj,20&lt;br /&gt;
&amp;gt;&amp;gt; \.&lt;br /&gt;
COPY 3&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM foo;&lt;br /&gt;
┌────┬────┐&lt;br /&gt;
│ a  │ b  │&lt;br /&gt;
╞════╪════╡&lt;br /&gt;
│ 10 │ 20 │&lt;br /&gt;
│ 30 │ 40 │&lt;br /&gt;
│  ∅ │ 20 │&lt;br /&gt;
└────┴────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově také příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; umožňuje číst přímo partišny (partitions). V předchozích verzích bylo nutné použít syntax s vloženým selectem, což má nějakou režii.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce pro zakódování a dekódování textu (&amp;lt;code&amp;gt;encode&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;decode&amp;lt;/code&amp;gt;) nově podporují kódování &amp;lt;code&amp;gt;base64url&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;base32hex&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 41686f6a3c3e2f2b │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base64url&#039;);&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│   encode    │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ QWhvajw-Lys │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base32hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 85K6UQHS7ONIM=== │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dokončit implementaci standardu SQL/JSON, konkrétně implementaci funkce &amp;lt;code&amp;gt;JSON_TABLE&amp;lt;/code&amp;gt; se opět nestihlo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;psql&amp;lt;/code&amp;gt; bude možnost si nastavit zobrazení logických hodnot &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Datový typ &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; akceptuje literály &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Na výstupu se zobrazuje pouze &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
\pset display_true true&lt;br /&gt;
Boolean true display is &amp;quot;true&amp;quot;.&lt;br /&gt;
\pset display_false false&lt;br /&gt;
Boolean false display is &amp;quot;false&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ true     │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT 1 &amp;lt;&amp;gt; 1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ false    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Může se hodit možnost si zobrazit &amp;lt;code&amp;gt;search_path&amp;lt;/code&amp;gt; v promptu. V promptu je také možnost použít symbol &amp;lt;code&amp;gt;%i&amp;lt;/code&amp;gt;, který se nahradí replikačním statusem (&amp;lt;code&amp;gt;primary&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;standby&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==PL/pgSQL==&lt;br /&gt;
&amp;lt;p&amp;gt;PL/pgSQL je relativě stabilizované prostředí, kde je každoročně jen minimum změn. Letos je to jedna malá (a pro většinu uživatelů zanedbatelná změna), a jedna &amp;quot;velká&amp;quot;, která ale interně žádnou změnou není.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou změnou je interní optimalizace exekuce embedded SQL ve tvaru  &amp;lt;code&amp;gt;SELECT výraz INTO proměnná&amp;lt;/code&amp;gt;. Mám pocit, že tento zápis se používal v Sybase a na Sybase navazujících databázích pro inicializaci proměnných. Já jsem se s tímto zápisem setkával v literatuře někdy kolem roku 2000, a už tehdy platilo doporučení tento zápis nepoužívat (v plpgsql se nikdy moc nepoužíval). V posledních letech přišlo víc uživatelů z MSSQL (začalo se migrovat víc aplikací z tohoto serveru), tento zápis používali a zjistili, že tento zápis je cca 20x pomalejší než &amp;quot;nativní&amp;quot; přiřazení &amp;lt;code&amp;gt;proměnna := výraz&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Interně jsou v PL/pgSQL dvě metody jak vyhodnotit výraz. Tzv simple metoda, kde se přeskočí SQL exekutor a přímo zavolá exekutor výrazů, je výrazně rychlejší. Druhou metodou je běžná exekuce skrze SQL exekutor (a SPI API). Až doposud, cokoliv co v zdrojovém kódu funkce bylo SQL příkazem (zde příkazem &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;) se vykonalo běžnou cestou. Nově se detekuje výše zmíněný zápis a vykoná se simple metodou. Pro dlouholeté uživatele Postgresu to nic neznamená, ale lidem, kteří migrují z MSSQL, to může zpříjemnit život.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Druhou, a naopak, velkou změnou je možnost inliningu funkce, která je napsaná v PL/pgSQL (ve speciálních případech). Inlining v kontextu Postgresu je trochu něco jiného než si uživatele představí pod termínem inlining. V Postgresu mohou být funkce volané z nějakého SQL příkazu - typicky příkazu &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;. Pokud nějaká funkce podporuje inlining, tak to znamená, že v AST stromu dotazu se volání funkce nahradí jejím tělem. Teprve pak nastupuje optimalizace, a díky inliningu vlastně optimalizátor vidí dovnitř funkce (jinak je funkce pro optimalizátor black box).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;K tomu, aby PL/pgSQL (nejen v PL/pgSQL) funkce mohla být inlinovaná, potřebujete vlastní kód v Cčkové extenzi. A je to vlastně trik (v tomto případě dost nestydatý podfuk :-)). Už dříve bylo možné napsat extenze, které dodávaly optimalizátoru znalost o vybraných funkcích (jinak, opět, pro optimalizátor, jsou funkce black box). Přímo v jádru je například podpora optimalizátoru pro funkci &amp;lt;code&amp;gt;generate_series&amp;lt;/code&amp;gt; (staré verze pg by v rows měly 1000).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT * FROM generate_series(1,3);&lt;br /&gt;
┌────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                             QUERY PLAN                             │&lt;br /&gt;
╞════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Function Scan on generate_series  (cost=0.00..0.03 rows=3 width=4) │&lt;br /&gt;
└────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Inlining byl dřive podporován pro funkce v jazyku SQL, kdy si planner vytáhl zdrojový kód funkce. V devatenáctce planner může zavolat extenzi, a může si říct nejen o detailnější parametry ohledně exekuce, ale může si říct o substituční SQL. Když ho dostane, tak funkci dále neřeší, a pracuje se substitučním SQL příkazem. Je to docela magie, nicméně efektivní. Kód extenze se volá až v momentu, kdy známe konstantní parametry funkce, a extenze se může rozhodnout - zavolej volanou funkci, nebo zavolej nějaké SQL, zavolej jinou funkci, případně vrať rovnou nějakou speciální hodnotu &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, 0, ... Je to i způsob, jak opravdu efektivně pracovat s dynamickým SQL. Musíte si ovšem napsat kód v Cčkové extenzi. Požadavek na tuto funkcionalitu přišel od vývojářů PostGISu. Cílem jsou optimalizace v PostGISu, dá se to ale použít i jinde. Časem si dovedu představit i nějakou contrib extenzi, která by tuto možnost zpřístupnila i bez nutnosti psát si vlastní extenzi. Škoda, že nemám autoritu vývojářů PostGISu. Dovedl bych si představit podobný trik v analyzátoru. Dost by mi to pomohlo s Orafce. V té pozici samozřejmě nejsem.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Vývoj==&lt;br /&gt;
&amp;lt;p&amp;gt;Každoročně dochází k čištění kódu. Občas se zruší podpora některé platformy. Výjimečně se přidá podpora nové platformy nebo jako v případě pg19 se vrátí podpora dříve odstraněné platformy (AIX - operační systém AIX přestal být podporovaný v pg17 díky nezájmu IBM. Pak se ale v IBM chytli za nos, dodali počítač do testovací farmy, a do AIXu přidali aktualizovaný software potřebný k buildu Postgresu). Další čistky v kódu lze provést přechodem na novější verzi programovacího jazyka - přechodem z C99 na C11 (bohužel to může znamenat, že starých platformách se nové verze Postgresu nepřeloží). Interní datový typ &amp;lt;code&amp;gt;Datum&amp;lt;/code&amp;gt; až do předchozí verze byl 4bajtový na 32bitových platformách a 8bajtový na 64bitových platformách. Nově je 8bajtový na všech podporovaných platformách. Určitě nezanedbatelná část kódu se generuje z definičních souborů. Nově se z definic generuje kód definující konfigurační proměnné. Údržba, verzování, zajištění konzistence definičních souborů je násobně jednodušší než údržba adekvátního kódu v Cčku. Dynamická alokace paměti bude jednodušší díky funkcím &amp;lt;code&amp;gt;GetNamedDSA&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;GetNamedDSMSegment&amp;lt;/code&amp;gt;. Dynamicky sdílenou paměť lze sledovat skrze pohled &amp;lt;code&amp;gt;pg_dsm_registry_allocations&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Mám pocit, že vývoj Postgresu ještě víc zrychlil - je vidět mnohem víc patchů od lidí z Asie (dříve to bylo spíš jenom Japonsko), a o to víc se naráží na kapacitu committerů. Je to paradox, který nejde jednoduše řešit. Postgres je populární díky funkcionalitě a stabilitě. Stabilita je díky pečlivé práci commitetterů (důkladně se řeší každý řádek kódu). Díky popularitě je více programátorů, kteří píší více kódu, více patchů, ale committeři nestíhají, a tak patche zůstávají relativně dlouho ve frontě. Což frustruje programátory. Patch napíšete během měsíce, během měsíce se dá udělat finalizace a pár iterací s committerem, ale mezitím několik měsíců (v horším případě let (3 roky i v případě bezproblémového malého patche)), čekáte, až si na vás některý z committerů udělá čas. Celou dobu musíte udržovat patch v aplikovatelném stavu, musíte reagovat na případné diskuze, musíte sledovat vývoj a případně aktualizovat patch. Je to problém o kterém se ví, diskutuje se o něm, ale není úplně jasné, co by mělo být řešení. Minimálně se zlepšila evidence patchů, která pokrývá i automatické testování na několika různých platformách. Tady je velká klika, že Postgres má extenze. Neskutečně velký objem kódu (funkcionality) je dnes možné řešit skrz extenze mimo komunitu - což výrazně snižuje tlak na committery. V extenzích toho jde udělat hodně, bohužel, ne všechno. Na druhou stranu, extenze také nejsou bez rizika. Určitým způsobem zvyšují fragmentaci ekosystému Postgresu, který pak ztrácí přehlednost (plus ne všechny extenze jsou dostupné v cloudu). Zase, díky tomu je jádro Postgresu stále ještě rozumně velké. O Oracle se kolují zvěsti, že jádro má 14 miliónů řádek, Postgres pod 2 milióny. Náklady na údržbu Postgresu jsou výrazně menší. Kompilace zdrojáků je do 5 minut, regresní testy v největším rozsahu běží 15 minut. S tím ještě lze nějak rozumně pracovat. O Oracle jsem slyšel, že regresní testy běží den.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Popularita Postgresu jde aktuálně až do absurdna. Z Linkedinu mám pocit, že začíná být přepostgresováno (samozřejmě z mé perspektivy a v mé bublině). Hromada příspěvků vygenerovaných AI jsou banality na úrovni žáka prvního stupně (Postgres má VACUUM, indexy jsou super, dotazy mohou být pomalé, atd atd). Doporučení typu - proč ne Redis, proč ne Elastic, na všechno použijte Postgres. Viděl jsem hromadu clickbaitových článků typu - multigenerační architektura Postgresu je tragická, ale s naší AI nebo s naším supportem nebudete mít problém, atd atd. Postgresu dnes rozumí každý, kdo dokáže do AI napsat Postgres. Měl jsem tu možnost vidět naprosto neadekvátní doporučení ohledně konfigurace (dnes nevíte jestli důvodem je neznalost autora nebo naopak jeho vychytralost a snaha o co nejvíc komentářů případně o troling). Historicky popularita Postgresu rostla ve stínu MySQL, Monga a dalších databází a roky byl Postgres ušetřený mediálního balastu. To bohužel už není pravda. Pořád platí, že Postgres je dobrá databáze, stabilní, relativně rychlá, která se ale rozhodně nehodí na vše. Má svoje limity, které je dobré znát, a rozhodně nemůže ve všech ohledech (ve větším rozsahu) nahradit Redis, MySQL nebo Mongo případně Kafku. To je nesmysl, a není to ani cílem komunity. Základem jakékoliv práce je znát limity, chování, a správně v souladu s celkem, používat správné nástroje.&amp;lt;/p&amp;gt;&lt;br /&gt;
----------&lt;br /&gt;
&amp;lt;DPL&amp;gt;category=Verze PostgreSQL&amp;lt;/DPL&amp;gt;&lt;br /&gt;
[[Category:Články]]&lt;br /&gt;
[[Category:Verze PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1586</id>
		<title>PostgreSQL 19 (2026)</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1586"/>
		<updated>2026-05-10T03:15:33Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;i&amp;gt;Autor: Pavel Stěhule&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;O předchozích verzích jsem napsal, že změny byly primárně interní. Z pohledu uživatele, který chce vidět novou SQL syntax, se toho v posledních verzích moc nestalo. Devatenáctka je jiná. Tam je viditelných změn opravdu hodně. Jako každý rok - nová verze je pelmel nových funkcí a různých vylepšení menších nebo větších.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Administrace==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Bloating tabulek může být problém. Skoro všude jsem se setkal se situací, kdy &amp;quot;mazací&amp;quot; skript přestal fungovat (z různých důvodů), přičemž se tato chyba detekovala příliš pozdě, kdy dotčené tabulky měly místo jednotek GB například desítky GB. To už musí zaúřadovat &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, což často znamená vynucenou plánovanou odstávku (kvůli držení exkluzivního zámku). Je to letitý problém, který zkušenější uživatelé řešili buďto pečlivějším monitoringem, v některých případech partišningem (partitioning), případně extenzemi &amp;lt;code&amp;gt;pg_repack&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt;. Autor posledně jmenované extenze Tonda (Antonín Houska) spolu s Alvarem (Alvaro Herrera) poslední dva roky pracovali na integraci &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt; do jádra Postgresu. Paradoxně příkaz, který bude provádět zdrcnutí tabulek, se bude jmenovat &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt;. Základem je logická replikace - zadaná tabulka se lokálně zreplikuje (vytvoří se její nová kopie, a tím se zbaví vnitřního neobsazeného místa). Co je zásadní, je možnost použít volbu &amp;lt;code&amp;gt;CONCURRENTLY&amp;lt;/code&amp;gt;. S touto volbou příkaz nepoužije exkluzivní zámek. Tudíž je možné jej použít za provozu. Nutnou podmínkou je existence primárního klíče (a unikátního indexu).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
REPACK (CONCURRENTLY, VERBOSE) obce;&lt;br /&gt;
INFO:  repacking &amp;quot;public.obce&amp;quot; in physical order&lt;br /&gt;
INFO:  &amp;quot;public.obce&amp;quot;: found 0 removable, 6250 nonremovable row versions in 59 pages&lt;br /&gt;
DETAIL:  0 dead row versions cannot be removed yet.&lt;br /&gt;
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.&lt;br /&gt;
REPACK&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kromě toho, že příkaz &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt; nahrazuje příkaz &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, tak tento příkaz ještě nahrazuje příkaz &amp;lt;code&amp;gt;CLUSTER&amp;lt;/code&amp;gt;, kterým se tabulka fyzicky (jednorázově) přeuspořádá podle zadaného indexu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Možná jste si všimli, že dotaz běžící pod příkazem &amp;lt;code&amp;gt;EXPLAIN ANALYZE&amp;lt;/code&amp;gt; je výrazně pomalejší. Důvodem je měření času - executor, v tomto režimu, neustále poptává aktuální čas, a to má brutální režii. U větších dotazů se vyplatí použít volbu &amp;lt;code&amp;gt;TIMING OFF&amp;lt;/code&amp;gt;. V 19 na x86 se místo systémového času použíjí takty CPU. Je to výrazně rychlejší - zatímco na osmnáctce mi jednoduchý testovací dotaz běžel 2.5x pomalejší v explainu, na devatenáctce pouze 1.5x pomaleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou velkou změnou je vypnutí JIT ve výchozí konfiguraci. JIT se objevil v Postgresu 11, a v Postgresu 12 byl zapnutý ve výchozí konfiguraci. Bohužel se zjistilo, že většině uživatelů, kteří Postgres používají pro OLTP, dělá víc škody než užitku. Došlo to až do stavu, kdy se uživatelům doporučovalo, neoficiálně, po instalaci JIT vypnout. Je tam víc problémů. &amp;lt;code&amp;gt;clang&amp;lt;/code&amp;gt;, na kterém je to postavené, v novějších verzích kompiluje lépe, ale pomaleji. Existují alternativní implementace JIT, ale všechny jsou více než méně experimentální. Druhým problémem je model, na jehož základě se JIT aktivuje. Tento model jednak nedokáže dobře odhadnout náročnost &amp;quot;jitifikace - inliningu, a navíc je citlivý na přestřelení odhadu počtu řádek. Ohledně modelu a citlivosti na odhady pochybuji, že se dá něco dělat. Alternativní implementace JIT mají výrazně nižší režii. Přijde mi to ale jako slepá cesta. Budoucnost vidím v integraci vektorového executoru a vektorových funkcí (tak jak to používá [https://duckdb.org/ DuckDB]). Může to znamenat, že Postgres bude mít duální implementace funkcí (pro skalární parametr, a pro vektor parametrů).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze vytvořit replikační slot pro logickou replikaci, bez nutnosti mít konfiguraci &amp;lt;code&amp;gt;wal_level=logical&amp;lt;/code&amp;gt;. Postačuje nastavení &amp;lt;code&amp;gt;replica&amp;lt;/code&amp;gt;, což je výchozí nastavení. Jakmile je logický replikační slot aktivní, interně se úroveň zápisu do transakčního logu nastaví na &amp;lt;code&amp;gt;logical&amp;lt;/code&amp;gt;. Jaký je aktuální stav zjistíte v konfigurační proměnné &amp;lt;code&amp;gt;effective_wal_level&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Další bombou je možnost zapínat nebo vypínat kontrolní součty (na úrovni datových stránek) za běhu. Kontrolní součty jsou v Postgresu už relativně dlouho, a ačkoliv na dnešním hardware je jejich režie zanedbatelná, tak určitě bude dost databází, kde nebudou zapnuté. Zapnutí kontrolních součtů vyžadovalo odstávku úměrnou velikosti databáze. Navíc se silně doporučuje po zapnutí součtů znovu zreplikovat všechny fyzické repliky. Výhodou je diagnostika, možnost identifikovat poškozené stránky (a přeskočit je), možnost vyrobit replikovaný server ze starého primárního příkazem &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt;. Naplánovat a provést delší odstávku někde nemusí být jednoduché (nebo to může být skoro nemožné). U jednoho mého klienta zapnutí kontrolních součtů na cca 2TB databázi trvalo cca 2 hodiny (na vlastním hardware z roku 2025). Zapnutí se provede voláním funkce &amp;lt;code&amp;gt;pg_enable_data_checksums&amp;lt;/code&amp;gt;. Nastavením volitelných parametrů lze běh funkce zpomalit, tak aby nepřetěžovala IO. Vypnutí provede funkce &amp;lt;code&amp;gt;pg_disable_data_checksums&amp;lt;/code&amp;gt;. Stav procesu můžeme vidět v pohledu &amp;lt;code&amp;gt;pg_stat_progress_data_checksums&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Snad se už konečně vyřešil problém s upgradem databází obsahující extrémně velký počet LO (large objects). Nově binární upgrade (&amp;lt;code&amp;gt;pg_upgrade&amp;lt;/code&amp;gt;) použije pro export metadat LO příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; místo původní sekvence příkazů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- původní sekvence&lt;br /&gt;
SELECT pg_catalog.lo_create(&#039;5432&#039;);&lt;br /&gt;
ALTER LARGE OBJECT 5432 OWNER TO alice;&lt;br /&gt;
GRANT SELECT ON LARGE OBJECT 5432 TO bob;&lt;br /&gt;
&lt;br /&gt;
-- nově&lt;br /&gt;
COPY pg_catalog.pg_largeobject_metadata (oid, lomowner, lomacl) FROM stdin;&lt;br /&gt;
5432 16384 {alice=rw/alice,bob=r/alice}&lt;br /&gt;
\.&lt;br /&gt;
&lt;br /&gt;
COPY pg_catalog.pg_shdepend (dbid, classid, objid, objsubid, refclassid, refobjid, deptype) FROM stdin;&lt;br /&gt;
5 2613 5432 0 1260 16384 o&lt;br /&gt;
5 2613 5432 0 1260 16385 a&lt;br /&gt;
\.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nová implementace by měla být řádově rychlejší.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konečně se dotáhlo do konce začlenění podpory více formátů v příkazu &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Postgres má dva základní příkazy pro export (backup) - &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Historicky tyto příkazy podporovaly pouze &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; formát. Postupem času &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; získal možnost exportu do &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;dictionary&amp;lt;/code&amp;gt; formátu plus import příkazem &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umožňoval paralelní import více tabulek. &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; byl díky podpoře pouze SQL formátu dost omezený. To se nyní změnilo, a v &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; jsou podporovány všechny formáty, které podporuje &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt;. Vypadá to trochu jako workaround. V případě, že se použije jiný než &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; (SQL) formát, tak se vyrobí adresář, který do podadresářů uloží výstup z &amp;lt;code&amp;gt;pg_dumpu&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umí s touto adresářovou strukturou pracovat. Tato možnost se dostala už do 18tky, ale byla na poslední chvíli stažena.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt; zredukovalo kopírování WAL logů z nového primárního serveru na budovanou repliku a to tak, že se budou kopírovat pouze WAL logy vzniklé po rozpadu replikace. V mnoha scénářích se tím výrazně urychlí běh tohoto příkazu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Doposud autovacuum vybíralo tabulky k vakuování na základě porovnání vypočítaných koeficientů a prahových hodnot. Pořadí vybraných tabulek záleželo na fyzickém pořadí v systémové tabulce &amp;lt;code&amp;gt;pg_class&amp;lt;/code&amp;gt;. Nově se vakuum bude prioritizovat podle míry vzdálenosti od prahu. Dalším kritériem je stáří tabulky (počet transakcí od freeze). Stará implementace byla férová v tom, že garantovala, že každá tabulka bude zvakuovaná a že žádná tabulka nebude &amp;quot;předbíhat&amp;quot; ve frontě. Na druhou stranu se mohlo stát, že tabulka s intenzivnějším provozem čekala příliš dlouho a došlo k zbytečnému bloatingu. Nová implementace se snaží být chytřejší. Uvidíme, jak to bude fungovat. Moje zkušenost je taková, že a) není dobré dávat do Postgresu příliš dynamická data, b) je dobré si nastavit počet aktivních autovacuum workerů tak, aby byla určitá rezerva, c) není dobré vytěžovat IO na maximum (je dobré mít dostatečně nadimenzované IO a mít nějakou rezervu). Skóre tabulek můžeme sledovat v pohledu &amp;lt;code&amp;gt;pg_stat_autovacuum_score&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_autovacuum_scores WHERE score &amp;gt; 0.05;&lt;br /&gt;
┌─[ RECORD 1 ]────────┬──────────────────────┐&lt;br /&gt;
│ relid               │ 1262                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_database          │&lt;br /&gt;
│ score               │ 0.15936254737880529  │&lt;br /&gt;
│ xid_score           │ 1e-07                │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0.0793650769622719   │&lt;br /&gt;
│ vacuum_insert_score │ 0.003998400542165933 │&lt;br /&gt;
│ analyze_score       │ 0.15936254737880529  │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
╞═[ RECORD 2 ]════════╪══════════════════════╡&lt;br /&gt;
│ relid               │ 1214                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_shdepend          │&lt;br /&gt;
│ score               │ 0.12                 │&lt;br /&gt;
│ xid_score           │ 1.15e-07             │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0                    │&lt;br /&gt;
│ vacuum_insert_score │ 0.006                │&lt;br /&gt;
│ analyze_score       │ 0.12                 │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
└─────────────────────┴──────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově autovacuum může použít &amp;lt;code&amp;gt;VACUUM&amp;lt;/code&amp;gt; s podporou paralelismu.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přehled o aktuálním stavu recovery je k dispozici v pohledu &amp;lt;code&amp;gt;pg_stat_recovery&amp;lt;/code&amp;gt;. V pohledu &amp;lt;code&amp;gt;pg_stat_statements&amp;lt;/code&amp;gt; jsou dva nové sloupce &amp;lt;code&amp;gt;generic_plan_calls&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;custom_plan_calls&amp;lt;/code&amp;gt; zobrazující kolikrát předpřipravený příkaz (prepared statement) použil generický nebo zákaznický plán. Nový sloupec &amp;lt;code&amp;gt;wal_fpi_bytes&amp;lt;/code&amp;gt; zobrazuje velikost zápisu tzv. plných stránek do transakčního logu. Vysoká hodnota může signalizovat nepříjemně velkou četnost vynucených checkpointů (je nutné zvednout &amp;lt;code&amp;gt;max_wal_size&amp;lt;/code&amp;gt; případně &amp;lt;code&amp;gt;checkpoint_timeout&amp;lt;/code&amp;gt;). V novém pohledu &amp;lt;code&amp;gt;pg_stat_lock&amp;lt;/code&amp;gt; uvidíme počet a celkový čas čekání na různé typy zámků. Zaznamenány jsou pouze ty situace, kdy se čeká na zámek déle než jednu sekundu (stejně jako např. &amp;lt;code&amp;gt;log_lock_waits&amp;lt;/code&amp;gt;, které je v nyní ve výchozí konfiguraci zapnuté). Bohužel zámky, které trvají cca 100ms, mající nepříjemný dopad na dotazy kolem 10ms, zde neuvidíme:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_lock ;&lt;br /&gt;
┌──────────────────┬───────┬───────────┬───────────────────┬───────────────────────────────┐&lt;br /&gt;
│     locktype     │ waits │ wait_time │ fastpath_exceeded │          stats_reset          │&lt;br /&gt;
╞══════════════════╪═══════╪═══════════╪═══════════════════╪═══════════════════════════════╡&lt;br /&gt;
│ relation         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ extend           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ frozenid         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ page             │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ tuple            │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ transactionid    │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ virtualxid       │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ spectoken        │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ object           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ userlock         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ advisory         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ applytransaction │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
└──────────────────┴───────┴───────────┴───────────────────┴───────────────────────────────┘&lt;br /&gt;
(12 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze Postgres podporuje asynchronní IO. Čtení je realizováno dedikovanými procesy (workers). Počáteční implementace pracovala s konfigurovatelným počtem těchto procesů (výchozí nastavení mělo hodnotu 3). Nově je správa workerů dynamičtější - v případě potřeby si je Postgres nastartuje nebo naopak zavře. Místo fixního počtu nyní nastavujeme minimální a maximální počet workerů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io_min_workers=2&lt;br /&gt;
io_max_workers=8 (up to 32)&lt;br /&gt;
io_worker_idle_timeout=60s&lt;br /&gt;
io_worker_launch_interval=100ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Poměrně razantně se změnila konfigurace &amp;lt;code&amp;gt;log_min_messages&amp;lt;/code&amp;gt;, která udává, na které úrovni se mají chyby zapsat do systémového logu (&amp;lt;code&amp;gt;DEBUG5&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;PANIC&amp;lt;/code&amp;gt;). Nově lze tuto úroveň nastavit pro každý typ procesu (&amp;lt;code&amp;gt;archiver&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;autovacuum&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bgworker&amp;lt;/code&amp;gt;, ...) např. &amp;lt;code&amp;gt;error, walsender:debug1, autovacuum:debug1&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Správa partišen (partitions) byla v Postgresu základní. Díky možnosti sloučit nebo rozdělit partišny (partitions) se dostává trochu dál. Je to spíš první krok se spoustou omezení - používá se pouze jedno CPU a po celou dobu je exkluzivně zamknutá rodičovská tabulka. Ale i tak to může dost uživatelům ušetřit práci (a jejich vlastní řešení by pravděpodobně mělo stejná omezení):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_east, sales_central)  INTO sales_all;&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE measurement SPLIT PARTITION measurement_y2006q1 INTO&lt;br /&gt;
   (PARTITION measurement_y2006m01 FOR VALUES FROM (&#039;2006-01-01&#039;) TO (&#039;2006-02-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m02 FOR VALUES FROM (&#039;2006-02-01&#039;) TO (&#039;2006-03-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m03 FOR VALUES FROM (&#039;2006-03-01&#039;) TO (&#039;2006-04-01&#039;));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Oproti předchozím verzím lze zapínat a vypínat všechny typy omezení (nejen cizí klíče):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, CONSTRAINT cc CHECK(a &amp;gt; 0) NOT ENFORCED); &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
INSERT INTO foo VALUES(1);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ERROR:  check constraint &amp;quot;cc&amp;quot; of relation &amp;quot;foo&amp;quot; is violated by some row&lt;br /&gt;
DELETE FROM foo WHERE a = 0;&lt;br /&gt;
DELETE 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
ERROR:  new row for relation &amp;quot;foo&amp;quot; violates check constraint &amp;quot;cc&amp;quot;&lt;br /&gt;
DETAIL:  Failing row contains (0).&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc NOT ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pg_plan_advice&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;p&amp;gt;Až doposud uživatelé Postgresu neměli moc možností, jak ovlivnit generování prováděcích plánů. Hinty ve stylu Oracle byly a jsou z historických důvodů tabu (jsou implementovány extenzí [https://github.com/ossc-db/pg_hint_plan pg_hint_plan]). Uživatel měl pouze možnost penalizace metod executoru - např. &amp;lt;code&amp;gt;enable_nestloop&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;enable_indexscan&amp;lt;/code&amp;gt; nastavením na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Tato penalizace je ale dost hrubá, a neumožňuje jemné ovlivnění plánovače. Přesto se používala a používá. Rober Haas napsal dvě extenze [https://www.postgresql.org/docs/devel/pgplanadvice.html &amp;lt;code&amp;gt;pg_plan_advice&amp;lt;/code&amp;gt;] a [https://www.postgresql.org/docs/devel/pgstashadvice.html &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;]. Prvně zmíněná extenze umožňuje definovat jakási doporučení, která by měl planner respektovat. Pro každý plán lze zpětně dogenerovat tato doporučení:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce&lt;br /&gt;
  ORDER BY pocet_muzu + pocet_zen DESC&lt;br /&gt;
  LIMIT 10;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Limit  (cost=272.19..272.21 rows=10 width=45)                        │&lt;br /&gt;
│   -&amp;gt;  Sort  (cost=272.19..287.81 rows=6250 width=45)                 │&lt;br /&gt;
│         Sort Key: ((pocet_muzu + pocet_zen)) DESC                    │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on obce  (cost=0.00..137.12 rows=6250 width=45) │&lt;br /&gt;
│ Generated Plan Advice:                                               │&lt;br /&gt;
│   SEQ_SCAN(obce)                                                     │&lt;br /&gt;
│   NO_GATHER(obce)                                                    │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                      QUERY PLAN                                      │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Nested Loop  (cost=0.28..12.56 rows=81 width=58)                                     │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17)                          │&lt;br /&gt;
│         Filter: (nazev = &#039;Beroun&#039;::text)                                             │&lt;br /&gt;
│   -&amp;gt;  Index Scan using obce_okres_id_idx on obce  (cost=0.28..9.79 rows=81 width=41) │&lt;br /&gt;
│         Index Cond: ((okres_id)::text = okresy.id)                                   │&lt;br /&gt;
│ Generated Plan Advice:                                                               │&lt;br /&gt;
│   JOIN_ORDER(okresy obce)                                                            │&lt;br /&gt;
│   NESTED_LOOP_PLAIN(obce)                                                            │&lt;br /&gt;
│   SEQ_SCAN(okresy)                                                                   │&lt;br /&gt;
│   INDEX_SCAN(obce public.obce_okres_id_idx)                                          │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                                             │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(11 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Prostřednictvím konfigurační proměnné &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; můžeme ovlivnit chování planneru vlastními doporučeními:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET pg_plan_advice.advice to &#039;JOIN_ORDER(obce okresy)&#039;;&lt;br /&gt;
SET&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌───────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                            QUERY PLAN                             │&lt;br /&gt;
╞═══════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Join  (cost=1.97..140.78 rows=81 width=58)                   │&lt;br /&gt;
│   Hash Cond: ((obce.okres_id)::text = okresy.id)                  │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on obce  (cost=0.00..121.50 rows=6250 width=41)    │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=1.96..1.96 rows=1 width=17)                     │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17) │&lt;br /&gt;
│               Filter: (nazev = &#039;Beroun&#039;::text)                    │&lt;br /&gt;
│ Supplied Plan Advice:                                             │&lt;br /&gt;
│   JOIN_ORDER(obce okresy) /* matched */                           │&lt;br /&gt;
│ Generated Plan Advice:                                            │&lt;br /&gt;
│   JOIN_ORDER(obce okresy)                                         │&lt;br /&gt;
│   HASH_JOIN(okresy)                                               │&lt;br /&gt;
│   SEQ_SCAN(obce okresy)                                           │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                          │&lt;br /&gt;
└───────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(13 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konfigurace planneru prostřednictvím &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; nestačí, pokud potřebujeme ovlivnit plán dotazu z aplikace, u které nemůžeme nebo nechceme měnit zdrojový kód. A proto je tu druhá zmíněná extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;, která umožňuje naše &amp;quot;doporučení&amp;quot; uložit a pak automaticky aplikovat na základě tzv &amp;lt;code&amp;gt;queryid&amp;lt;/code&amp;gt;. Doporučení jsou uložena v pojmenovaných skladech (stashes). Skrze konfigurační proměnnou &amp;lt;code&amp;gt;pg_stash_advice.stash_name&amp;lt;/code&amp;gt; volíme aktivní sklad. Každý uživatel, každá databáze může mít svůj vlastní. Pokud proměnná není nastavená, tak je extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt; neaktivní. Uložené nápovědy jsou perzistentní - při vypnutí serveru se uloží, po startu znovu načtou do paměti.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;SQL&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; je syntaxe, kterou postres přejímá z analytických databází (zde to snad byla [https://duckdb.org/2022/05/04/friendlier-sql#group-by-all DuckDB]). Pokud se použije tento zápis, tak se automaticky agreguje podle všech sloupců, které nejsou v agregační funkci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT sum(pocet_zen + pocet_muzu), okresy.id, okresy.nazev &lt;br /&gt;
  FROM obce join okresy ON obce.okres_id = okresy.id&lt;br /&gt;
 GROUP BY ALL;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tento zápis může ušetřit dost psaní, může to být také &amp;quot;tichý&amp;quot; zabiják výkonu. Čím více atributů je v klauzuli &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;, tím je agregace pomalejší. Zápis &amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; ještě není ve standardu, ale je standardizační komisí akceptován, a měl by být v některé další verzi ANSI/SQL.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Počínaje Postgresem 19 už nebude možnost používat backlash jako escape symbol v řetězcích. Před 15 roky se přešlo na standardní chování (předtím se řetězce v Postgresu chovali stejně jako v Cčku), nicméně nestandardní chování bylo možné vynutit nastavením &amp;lt;code&amp;gt;standard_conforming_strings&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Mezi top vývojáři Postgresu je hodně velká averze k tzv kompatibility flagům (zmíněný flag nebyl výjimkou) (pozn. u komerčních databází jsou naopak kompatibility flagu standardem, a nejen u nich - např. MySQL). Nyní je tato možnost zrušena, a Cčkové stringy dostaneme pouze jen zápisem (jako tzv extended strings):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;ahoj\nsvete&#039;;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│  ?column?   │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ ahoj\nsvete │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT e&#039;Ahoj\nSvete&#039;;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ Ahoj    ↵│&lt;br /&gt;
│ Svete    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze v u window funkcí &amp;lt;code&amp;gt;lead&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lag&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;first_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last_value&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;nth_value&amp;lt;/code&amp;gt; použít klauzuli &amp;lt;code&amp;gt;IGNORE NULLS&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;. Výchozí chování, které bylo implementováno již dříve odpovídá klauzuli &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;SQL/PGQ&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;V tomto případě PG není častým prefixem symbolizujícím Postgres (a Q jako queue), ale Property Graph Queries. Počínaje podporou neatomických datových typů v SQL:2000, přes podporu XML v SQL:2003 se standard rozšířil nad rámec čistě relačních databází (stejně ale už dříve existovala kritika SQL z pohledu čistoty od relačních dogmatiků). Standard SQL:2023 (ISO/IEC 9075-16:2023) SQL rozšiřuje o podporu grafových databází, které mají svůj vlastní datový model odlišný od relačního modelu. Přijde mi to jako dost odvážný krok (a ještě teď tomu nemohu úplně uvěřit). Zatím existovala zřetelná jednota mezi SQL a relačním modelem. Od nové části standardu se očekává, že pomůže s přehlednějším zápisem určitých dotazů, které se až doposud řešily pomocí rekurze. Přiznám se, že zápis dotazu v PGQ (využívajícího ascii art) mi přijde hodně cizí (možná zažívám pocity programátora v Cobolu, když se poprvé podíval na SQL. Osobně mi to nesedí - reprezentaci znalostí ve formátu grafu jsem nikdy nemusel (vím, že je to jen jiná reprezentace téhož)). Row pattern recognition z roku SQL:2016 toho také nemá s relačními databázemi moc společného, takže to takové překvapení není. Práce na této části standardu začaly v roce 2017 (a integrovaly se prvky jazyka [https://neo4j.com/docs/cypher-manual/current/introduction/cypher-overview/ Cypher] (Neo4j) a [https://docs.oracle.com/en/database/oracle/property-graph/20.4/spgdg/property-graph-query-language-pgql.html#GUID-301FF092-1A07-43D2-91E5-0C5AFF3467CC PGQL] (Oracle)).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Základem grafových databází je graf skládající se z uzlů a hran. Ka každému uzlu i hraně mohou být přiřazeny atributy (properties). Hrany mohou být orientované i neorientované. Standard pro takové grafy používá termín Property Graphs. Graf se definuje příkazem &amp;lt;code&amp;gt;CREATE PROPERTY GRAPH&amp;lt;/code&amp;gt; a je to určitá forma pohledu. Přesto, že jsem zkoušel poměrně triviální příklad, nebylo pro mne intuitivní napsat SQL/PGQ dotaz. Pro uživatele bez zkušenosti s Neo4j nebo jinou grafovou databází budou začátky s SQL/PGQ dost bolestivé. V tuto chvíli (duben 2026) ještě není hotová dokumentace. Je možné, že se díky integraci SQL/PGQ do Postgresu setkám s grafovými databázemi častěji (SQL/PGQ je podporováno v DuckDB a v Oracle):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE public.uzivatele (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  jmeno character varying&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE public.zpravy (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  odesilatel integer,&lt;br /&gt;
  prijemce integer,&lt;br /&gt;
  tema text&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- uzivatel - odeslal -&amp;gt; uzivatel&lt;br /&gt;
CREATE PROPERTY GRAPH public.pg1&lt;br /&gt;
  VERTEX TABLES (&lt;br /&gt;
    public.uzivatele AS uzivatel KEY (id) PROPERTIES (id, jmeno)&lt;br /&gt;
  )&lt;br /&gt;
  EDGE TABLES (&lt;br /&gt;
    public.zpravy AS odeslal KEY (id)&lt;br /&gt;
    SOURCE KEY (odesilatel) REFERENCES uzivatel (id)&lt;br /&gt;
    DESTINATION KEY (prijemce) REFERENCES uzivatel (id)&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (1, &#039;Pavel&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (2, &#039;Zdenek&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (3, &#039;Tomas&#039;);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.zpravy VALUES (1, 1, 2, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (2, 2, 1, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (3, 1, 3, &#039;dotaz ohledne dopravy&#039;);&lt;br /&gt;
&lt;br /&gt;
-- od koho uzivatel Pavel dostal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) &amp;lt;-[IS odeslal]- (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
└────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- komu uzivatel Pavel poslal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) -[IS odeslal]-&amp;gt; (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
│ Tomas  │&lt;br /&gt;
└────────┘&lt;br /&gt;
(2 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Osobně si nedovedu představit, že bych psal dotazy v SQL/PGQ (myslím, že podobně na tom bude většina uživatelů podobně). Je otázkou, jestli se SQL/PGQ neuplatní ve spolupráci s AI. V tomto případě se běžný dotaz rozpadá do dvou kroků. Navíc i joinovací podmínka získává label, takže je to v určitém smyslu více popisné, než běžné SQL, a je tak možné, že tento zápis bude AI více sedět.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pomalu se pokračuje na implementaci tzv temporálních tabulek. Letos je to podpora klauzule &amp;lt;code&amp;gt;FOR PORTION OF valid_at FROM TO&amp;lt;/code&amp;gt;. Zjednodušeně, pokud máme temporální databáze nebo temporální tabulky, tak se můžeme podívat na stav dat v nějakém čase. Pokud se použije klauzule &amp;lt;code&amp;gt;FOR PORTION OF FROM TO&amp;lt;/code&amp;gt;, tak se jedná o tzv temporální &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- je nutne mit nainstalovanou extenzi btree_gist&lt;br /&gt;
CREATE TABLE ceny(&lt;br /&gt;
  id int,&lt;br /&gt;
  valid_at daterange,&lt;br /&gt;
  nazev text,&lt;br /&gt;
  cena int,&lt;br /&gt;
  PRIMARY KEY (id, valid_at WITHOUT OVERLAPS)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
-- jednotna cena mezi 2020-01-01 a 2025-12-31&lt;br /&gt;
INSERT INTO ceny VALUES(1, &#039;[2020-01-01,2026-01-01)&#039;, &#039;pecivo&#039;, 20);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- uprava ceny mezi 2021-01-01 a 2021-02-28&lt;br /&gt;
UPDATE ceny&lt;br /&gt;
   FOR PORTION OF valid_at FROM &#039;2021-01-01&#039; TO &#039;2021-03-01&#039;&lt;br /&gt;
   SET cena = 30&lt;br /&gt;
 WHERE id = 1;&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny ORDER BY valid_at;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2021-01-01) │ pecivo │   20 │&lt;br /&gt;
│  1 │ [2021-01-01,2021-03-01) │ pecivo │   30 │&lt;br /&gt;
│  1 │ [2021-03-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Nové datové typy a funkce&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;V Postgresu se můžete setkat s datovými typy s prefixem &amp;lt;code&amp;gt;reg&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;regrole&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regproc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regclass&amp;lt;/code&amp;gt;. Tyto datové typy jsou vždy spojeny s jednou konkrétní systémovou tabulkou a hodnoty těchto typů vždy nesou unikátní číselný identifikátor databázového objektu. Tyto typy podporují přetypování z textu, což se používá pro zkrácený zápis vyhledávání nějakého databázového objektu v katalogu. Nově můžeme používat typ &amp;lt;code&amp;gt;regdatabase&amp;lt;/code&amp;gt; a tento typ se odkazuje, jak je patrné z názvu, na tabulku &amp;lt;code&amp;gt;pg_database&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ regdatabase │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ template1   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase::oid;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT oid&lt;br /&gt;
 FROM pg_database &lt;br /&gt;
 WHERE datname = &#039;template1&#039;;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Díky těmto typům jsou dotazy nad systémovým katalogem kratší a čitelnější. Navíc autor dotazů nemusí brát v potaz některé detaily (jako například case sensitivitu), kde se chování SQL identifikátorů liší od SQL stringů. To je ošetřeno interně při přetypování.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce &amp;lt;code&amp;gt;error_on_null&amp;lt;/code&amp;gt; vyhodí výjimku, pokud je parametr NULL. Jinak vrátí hodnotu parametru. Implementace je extrémně jednoduchá - sleduje flag &amp;lt;code&amp;gt;isnull&amp;lt;/code&amp;gt;. Každý parametr každé SQL funkce má tento flag. Stejné chování má flag funkce &amp;lt;code&amp;gt;STRICT&amp;lt;/code&amp;gt;. Je tu drobná zrada. V případě kompozitních typů to není kompatibilní s operátorem &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;. Kompozitní hodnota obsahující pouze &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;y je interně ne nullová, ale operátor &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt; pro takovou kompozitní hodnotu vrátí &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT ROW(NULL, NULL) IS NULL;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT error_on_null(NULL::integer);&lt;br /&gt;
ERROR:  null value not allowed&lt;br /&gt;
SELECT error_on_null(ROW(NULL, NULL));&lt;br /&gt;
┌───────────────┐&lt;br /&gt;
│ error_on_null │&lt;br /&gt;
╞═══════════════╡&lt;br /&gt;
│ (,)           │&lt;br /&gt;
└───────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Roky se v Postgresu mluví o tom, že by měl existovat snadný způsob, jak zpětně z databázového objektu vygenerovat DDL příkaz. Osobně jsem nikdy tuhle potřebu neměl, ale do jisté míry této potřebě rozumím. Skoro v každém admin nástroji můžete iterovat přes databázové objekty a k nim si nechat zobrazit DDL. A skoro každý admin tool, pak tuto funkcionalitu duplicitně implementuje - s chybami nebo bez chyb. Je to kód, který vyžaduje neustálou údržbu a aktualizace. Po letech diskuzí se je v upstreamu první část funkcí &amp;lt;code&amp;gt;pg_get_...ddl&amp;lt;/code&amp;gt; (aktuálně &amp;lt;code&amp;gt;pg_get_database_ddl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pg_get_role_ddl&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_get_tablespace_ddl&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT pg_get_role_ddl(&#039;pavel&#039;);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                       pg_get_role_ddl                                        │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ CREATE ROLE pavel SUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS; │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze je v postgresu funkce generující náhodné číslo v zadaném rozsahu. K nim nyní přibyly funkce pro rozsah typů &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;timestamptz&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SELECT random(current_date - 6, current_date);&lt;br /&gt;
┌────────────┐&lt;br /&gt;
│   random   │&lt;br /&gt;
╞════════════╡&lt;br /&gt;
│ 2026-04-13 │&lt;br /&gt;
└────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT random(current_timestamp - interval &#039;1 week&#039;, current_timestamp);&lt;br /&gt;
┌───────────────────────────────┐&lt;br /&gt;
│            random             │&lt;br /&gt;
╞═══════════════════════════════╡&lt;br /&gt;
│ 2026-04-09 02:30:30.665819+02 │&lt;br /&gt;
└───────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Optimalizace&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Jako nejdůležitější optimalizaci v nové verzi vidím optimalizaci implementace kontroly referenční integrity. RI je v postgresu realizována v systémových řádkových triggerech, které, až doposud, provedly (pro každý řádek) jeden kontrolní SQL příkaz (s použitím SPI API - stejné API, které se používá např. v PL/pgSQL). Nově se hledá přímo v indexech - přeskakuje se celý aparát SQL. To je první výrazná optimalizace. Druhou výraznou optimalizací je hledání nikoliv jedné hodnoty, ale pole hodnot (n = 64). Podle autora patche je nyní kontrola referenční integrity cca 3x rychlejší. Pořád to bude znát. Výrazně se ale posune hranice, od kdy se vyplatí při masivních importech kontrolu referenční integrity vypínat.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE tab_a(id int PRIMARY KEY);&lt;br /&gt;
INSERT INTO tab_a SELECT generate_series(1,1000);&lt;br /&gt;
VACUUM ANALYZE tab_a;&lt;br /&gt;
&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b_no_ri(id int, a_id int);&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b(id int, a_id int references tab_a(id));&lt;br /&gt;
\timing&lt;br /&gt;
-- postgres 18&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 12844,206 ms (00:12,844)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 659,462 ms&lt;br /&gt;
&lt;br /&gt;
-- postgres 19&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 2728,073 ms (00:02,728)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 673,444 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ukázkový test je best case - zrychlení je cca čtyřnásobné. Stále je import s RI cca 4x pomalejší než bez RI (a to cílová tabulka obsahuje pouze jeden cizí klíč). V praxi to bude jiné - kromě RI je náročná i aktualizace indexů a samozřejmě všechny diskové operace.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Určitě každý, kdo pracuje s Postgresem trochu déle, se setkal s doporučením &amp;quot;nepoužívej &amp;lt;code&amp;gt;NOT IN (SELECT ...&amp;lt;/code&amp;gt;&amp;quot;. Důvodem byla (v některých případech) &amp;quot;špatná&amp;quot; optimalizace. Optimalizátor neměl garanci, že subselect nevrátí &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;. Poté, co se ve verzi 18 přepsal systém pro ukládání omezujících pravidel (constraints), už bylo možné do tuto informaci v optimalizátoru použít. Nyní se by se měl subselect &amp;lt;code&amp;gt;NOT IN&amp;lt;/code&amp;gt; transformovat na tzv anti-join (v těch případech, kdy je garantováno, že žádná proměnná v predikátu nebude &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;). Jinými slovy, pokud optimalizátor bude mít garance, že se v predikátu subselectu nevyskytne &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, tak vygeneruje stejný plán, jako kdybyste použili zápis s &amp;lt;code&amp;gt;NOT EXISTS&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE osoby(id int PRIMARY KEY, jmeno varchar);&lt;br /&gt;
CREATE TABLE faktury(id int primary key,&lt;br /&gt;
                     vlozeno timestamp,&lt;br /&gt;
                     podal int REFERENCES osoby(id) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT *&lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE id NOT IN (SELECT podal&lt;br /&gt;
                            FROM faktury);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT * &lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE NOT EXISTS(SELECT podal &lt;br /&gt;
                            FROM faktury&lt;br /&gt;
                           WHERE podal = osoby.id);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
-- ve starších verzích dostanete různé plány&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ve starších verzích spojení relací vždy předcházelo agregaci. To v některých případech může být neefektivní (pokud agregace výrazně redukuje počet řádek). Pokud jsem chtěl změnit pořadí operací, musel jsem si to vynutit zápisem (poddotazem). V devatenáctce optimalizátor podporuje tzv předběžnou agregaci (eager aggregation), která předbíhá před join:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT sum(pocet_zen + pocet_muzu), okresy.nazev &lt;br /&gt;
                  FROM okresy JOIN obce ON okresy.id = obce.okres_id&lt;br /&gt;
                 GROUP BY okresy.nazev;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                                QUERY PLAN                                                │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Finalize HashAggregate  (cost=157.38..158.15 rows=77 width=18)                                           │&lt;br /&gt;
│   Group Key: okresy.nazev                                                                                │&lt;br /&gt;
│   -&amp;gt;  Hash Join  (cost=3.02..157.00 rows=77 width=18)                                                    │&lt;br /&gt;
│         Hash Cond: ((obce.okres_id)::text = okresy.id)                                                   │&lt;br /&gt;
│         -&amp;gt;  Partial GroupAggregate  (cost=0.28..154.05 rows=77 width=15)                                 │&lt;br /&gt;
│               Group Key: obce.okres_id                                                                   │&lt;br /&gt;
│               -&amp;gt;  Index Only Scan using obce_okres_id_idx on obce  (cost=0.28..122.03 rows=6250 width=7) │&lt;br /&gt;
│         -&amp;gt;  Hash  (cost=1.77..1.77 rows=77 width=17)                                                     │&lt;br /&gt;
│               -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.77 rows=77 width=17)                                 │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(9 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Na datech pro ČR je výše uvedený dotaz cca 3x rychlejší (v pg19 vůči pg18).&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud je jeden řádek zamčený vícero transakcemi, tak se do jeho systémového atributu &amp;lt;code&amp;gt;xmax&amp;lt;/code&amp;gt; uloží tzv &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; (MultiXact je &amp;quot;aparát&amp;quot;, kterým se v Postgresu implementují řádkové zámky). To je unikátní identifikátor skupiny transakcí, které drží zámek. Každá skupina transakcí se skládá z tzv členských záznamů &amp;lt;code&amp;gt;MultiXactMember&amp;lt;/code&amp;gt;, ve kterých se drží identifikátor transakce, typ zámku a stav transakce. Také tyto záznamy mají své unikátní id &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Doposud &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; byla 32bitová hodnota. Nově je tato hodnota 64bitová, a nehrozí její přetečení. &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; i id transakcí jsou stále 32bitové hodnoty (existuje několik rozpracovaných řešení, které zvyšují jejich rozsah), takže stále hrozí přetečení těchto id, a nastartování vynuceného freezování (což u více zatížených systémů může způsobit problémy s produkcí). Eliminovala se ale možnost přetečení &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Je tp důležité, protože &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; rostl ze všech zmíněných id nejrychleji (pokud &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; je počet transakcí se sdílenými zámky, pak růst &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; je &amp;lt;code&amp;gt;nxn&amp;lt;/code&amp;gt;). Informace o MultiXact (skupinách transakcí) lze získat novou funkcí &amp;lt;code&amp;gt;pg_get_multixact_stats()&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přepracoval se kód, který implementuje příkazy &amp;lt;code&amp;gt;LISTEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NOTIFY&amp;lt;/code&amp;gt;. Předchozí verze probouzely každý proces, který čekal na notifikaci (bez ohledu na to jestli čekal nebo nečekal na kanálu, který dostal notifikaci). Stará implementace fungovala dobře, pokud počet použitých kanálů byl malý, a tudíž byla i malá šance, že se probudí proces, který čeká na jiném kanálu než je aktuální notifikace. Uživatelé ale začali notifikace používat i jinak, a reportovali výrazné zpomalení pokud větší množství klientů poslouchalo na větším množství různých kanálů. Ve zprávě ke patchi je uvedeno zpomalení (pro 1 klienta 9100 TPS, pro 1000 klientů 200 TPS). Nová implementace ve sdílené paměti ke každému kanálu drží seznam čekajících klientů. V případě zprávy do některého kanálu se probudí pouze procesy, které na tomto kanálu poslouchají (i zde je vidět pokles TPS, ale výrazně menší - pro 1000 klientů 9000 TPS).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Výchozí komprimace TOASTu bude &amp;lt;code&amp;gt;lz4&amp;lt;/code&amp;gt; (namísto &amp;lt;code&amp;gt;pglz&amp;lt;/code&amp;gt;). LZ4 je jako volba už cca 5 let, a měla by být efektivnější (jak v komprimaci, tak ve využití CPU) než původní LZ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Postupně víc funkcí je akcelerováno pomocí SIMD. Nově to jsou funkce &amp;lt;code&amp;gt;hex_encode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hex_decode&amp;lt;/code&amp;gt; a parsování csv, tsv formátů příkazu &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; (hledání speciálních znaků).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Některé extenze, jako např. &amp;lt;code&amp;gt;pgstattuple&amp;lt;/code&amp;gt;, nově používají direct API pro čtení dat (implementované v pg18). Na systémech s rychlým IO by měly běžet rychleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Na základě reportů uživatelů se upravila implementace hashjoinu, tak aby nedocházelo k extrémnímu nárůstu alokace paměti v případech, kdy atribut použitý pro spojení relací obsahuje velké množství &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; hodnot.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V těch případech, kdy je garantováno, že porovnávané hodnoty jsou ne nullové, tak se operátor &amp;lt;code&amp;gt;IS DISTICT FROM&amp;lt;/code&amp;gt; nahradí operátorem &amp;lt;code&amp;gt;&amp;lt;&amp;gt;&amp;lt;/code&amp;gt;, případně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM&amp;lt;/code&amp;gt; operátorem &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;. Tady je otázkou, jaký bude reálný dopad. Jako programátor používám &amp;lt;code&amp;gt;IS [ NOT ] DISTINCT FROM&amp;lt;/code&amp;gt; jedině v těch případech, které komplikují potenciální NULLy. Je ale pravdou, že drtivou většinu SQL, dnes generují ORM frameworky, ktere nemusí mít vždy dostatečnou chytrost. Výraz &amp;lt;code&amp;gt;IS DISTINCT FROM NULL&amp;lt;/code&amp;gt; se nyní transformuje na &amp;lt;code&amp;gt;IS NOT NULL&amp;lt;/code&amp;gt;, obdobně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM NULL&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Replikace&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dlouhodobým cílem implementace logické replikace je podpora multimaster řešení. Zatím je k tomu ještě dlouhá cesta. Chybí podpora replikace DDL příkazů, plná podpora sekvencí, plná podpora řešení replikačních kolizí. Postupuje se v malých krocích. Letos je to podpora jednorázového refrešnutí sekvencí &amp;lt;code&amp;gt;ALTER SUBSCRIPTION ... REFRESH SEQUENCES&amp;lt;/code&amp;gt;. S multimasterem to úplně nepomůže, ale může to zjednodušit upgrade skrze logickou replikaci.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Novým příkazem je příkaz &amp;lt;code&amp;gt;WAIT FOR&amp;lt;/code&amp;gt;, který je možné použít na replikách, a který zajistí čekání na zreplikování zadané transakce. Lze nastavit timeout. Parametrem &amp;lt;code&amp;gt;NO_THROW&amp;lt;/code&amp;gt; zajistí tiché (bez výjimky) ukončení příkazu po timeoutu (změní se pouze vrácená hodnota):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# WAIT FOR LSN &#039;0/306EE20&#039; WITH (TIMEOUT &#039;100ms&#039;, NO_THROW);&lt;br /&gt;
 status&lt;br /&gt;
--------&lt;br /&gt;
 timeout&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V příkazu &amp;lt;code&amp;gt;CREATE PUBLICATION ... FOR ALL TABLES&amp;lt;/code&amp;gt; je nyní možné použít klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE (t1, ...)&amp;lt;/code&amp;gt;. Klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE&amp;lt;/code&amp;gt; lze použít i v příkazu &amp;lt;code&amp;gt;ALTER PUBLICATION&amp;lt;/code&amp;gt;. Pro registraci odběru (&amp;lt;code&amp;gt;CREATE SUBSCRIPTION&amp;lt;/code&amp;gt;) lze místo explicitního connection stringu použít odkaz na dříve definovaný FDW server.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V pohledu &amp;lt;code&amp;gt;pg_replication_slots&amp;lt;/code&amp;gt; je nový sloupec &amp;lt;code&amp;gt;slotsync_skip_reason&amp;lt;/code&amp;gt; popisující důvod, proč nebylo možné synchronizovat repliku. V tom případě bude obsahovat jednu z následujících hodnot: &amp;lt;code&amp;gt;wal_or_rows_removed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wal_not flushed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;no_consistent_snapshot&amp;lt;/code&amp;gt; nebo 	&amp;lt;code&amp;gt;slot_invalidated&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud při registraci odběru nastavíme parametr &amp;lt;code&amp;gt;retain_dead_tuples&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; (výchozí nastavení je &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;), budou se detekovat kolize update-delete, kdy nedojde k update z důvodu smazaného řádku. Pozor, tato volba dočasně blokuje vakuování zrušených řádků (zvlášť pokud je replika nedostupná a nedochází k synchronizaci). Lze nastavit timeout &amp;lt;code&amp;gt;max_retention_duration&amp;lt;/code&amp;gt;, samozřejmě pak ovšem může dojít ke kolizi update-delete. Bez detekce této kolize může dojít k tiché nekonzistenci obsahu napříč různými zdroji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Ostatní&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; podporuje formát &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt; (pouze export).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT JSON&lt;br /&gt;
{&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT (FORMAT JSON, FORCE_ARRAY)&lt;br /&gt;
[&lt;br /&gt;
 {&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nyní také tento příkaz podporuje volbu &amp;lt;code&amp;gt;ON_ERROR SET_NULL&amp;lt;/code&amp;gt;, která způsobí ignorování hodnot, na kterých selže typová konverze. To je možné díky tomu, že se již dříve zavedla podpora tzv měkkých chyb (soft errors). Tyto chyby lze ošetřit s řádově menší režií než běžné chyby (nejsou potřeba subtransakce). Podpora soft errors se v Postgresu objevila s podporou klauzule &amp;lt;code&amp;gt;ON ERROR&amp;lt;/code&amp;gt; SQL/JSON funkcí. V plánu je podpora error safe přetypování (&amp;lt;code&amp;gt;CAST expr AS type xxx DEFAULT expr ON CONVERSION ERROR&amp;lt;/code&amp;gt;). Prvním nezbytným krokem je požadavek, aby konverzní funkce používaly měkké chyby. To teď v upstreamu je, a díky tomu, bylo i relativně jednoduché implementovat &amp;lt;code&amp;gt;COPY ON_ERROR SET_NULL&amp;lt;/code&amp;gt; (error safe casts by měly být v pg20).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, b int);&lt;br /&gt;
&lt;br /&gt;
COPY foo FROM stdin (FORMAT csv, ON_ERROR SET_NULL);&lt;br /&gt;
Enter data to be copied followed by a newline.&lt;br /&gt;
End with a backslash and a period on a line by itself, or an EOF signal.&lt;br /&gt;
&amp;gt;&amp;gt; 10,20&lt;br /&gt;
&amp;gt;&amp;gt; 30,40&lt;br /&gt;
&amp;gt;&amp;gt; ahoj,20&lt;br /&gt;
&amp;gt;&amp;gt; \.&lt;br /&gt;
COPY 3&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM foo;&lt;br /&gt;
┌────┬────┐&lt;br /&gt;
│ a  │ b  │&lt;br /&gt;
╞════╪════╡&lt;br /&gt;
│ 10 │ 20 │&lt;br /&gt;
│ 30 │ 40 │&lt;br /&gt;
│  ∅ │ 20 │&lt;br /&gt;
└────┴────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově také příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; umožňuje číst přímo partišny (partitions). V předchozích verzích bylo nutné použít syntax s vloženým selectem, což má nějakou režii.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce pro zakódování a dekódování textu (&amp;lt;code&amp;gt;encode&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;decode&amp;lt;/code&amp;gt;) nově podporují kódování &amp;lt;code&amp;gt;base64url&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;base32hex&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 41686f6a3c3e2f2b │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base64url&#039;);&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│   encode    │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ QWhvajw-Lys │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base32hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 85K6UQHS7ONIM=== │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dokončit implementaci standardu SQL/JSON, konkrétně implementaci funkce &amp;lt;code&amp;gt;JSON_TABLE&amp;lt;/code&amp;gt; se opět nestihlo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;psql&amp;lt;/code&amp;gt; bude možnost si nastavit zobrazení logických hodnot &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Datový typ &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; akceptuje literály &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Na výstupu se zobrazuje pouze &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
\pset display_true true&lt;br /&gt;
Boolean true display is &amp;quot;true&amp;quot;.&lt;br /&gt;
\pset display_false false&lt;br /&gt;
Boolean false display is &amp;quot;false&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ true     │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT 1 &amp;lt;&amp;gt; 1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ false    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Může se hodit možnost si zobrazit &amp;lt;code&amp;gt;search_path&amp;lt;/code&amp;gt; v promptu. V promptu je také možnost použít symbol &amp;lt;code&amp;gt;%i&amp;lt;/code&amp;gt;, který se nahradí replikačním statusem (&amp;lt;code&amp;gt;primary&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;standby&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;PL/pgSQL&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;PL/pgSQL je relativě stabilizované prostředí, kde je každoročně jen minimum změn. Letos je to jedna malá (a pro většinu uživatelů zanedbatelná změna), a jedna &amp;quot;velká&amp;quot;, která ale interně žádnou změnou není.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou změnou je interní optimalizace exekuce embedded SQL ve tvaru  &amp;lt;code&amp;gt;SELECT výraz INTO proměnná&amp;lt;/code&amp;gt;. Mám pocit, že tento zápis se používal v Sybase a na Sybase navazujících databázích pro inicializaci proměnných. Já jsem se s tímto zápisem setkával v literatuře někdy kolem roku 2000, a už tehdy platilo doporučení tento zápis nepoužívat (v plpgsql se nikdy moc nepoužíval). V posledních letech přišlo víc uživatelů z MSSQL (začalo se migrovat víc aplikací z tohoto serveru), tento zápis používali a zjistili, že tento zápis je cca 20x pomalejší než &amp;quot;nativní&amp;quot; přiřazení &amp;lt;code&amp;gt;proměnna := výraz&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Interně jsou v PL/pgSQL dvě metody jak vyhodnotit výraz. Tzv simple metoda, kde se přeskočí SQL exekutor a přímo zavolá exekutor výrazů, je výrazně rychlejší. Druhou metodou je běžná exekuce skrze SQL exekutor (a SPI API). Až doposud, cokoliv co v zdrojovém kódu funkce bylo SQL příkazem (zde příkazem &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;) se vykonalo běžnou cestou. Nově se detekuje výše zmíněný zápis a vykoná se simple metodou. Pro dlouholeté uživatele Postgresu to nic neznamená, ale lidem, kteří migrují z MSSQL, to může zpříjemnit život.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Druhou, a naopak, velkou změnou je možnost inliningu funkce, která je napsaná v PL/pgSQL (ve speciálních případech). Inlining v kontextu Postgresu je trochu něco jiného než si uživatele představí pod termínem inlining. V Postgresu mohou být funkce volané z nějakého SQL příkazu - typicky příkazu &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;. Pokud nějaká funkce podporuje inlining, tak to znamená, že v AST stromu dotazu se volání funkce nahradí jejím tělem. Teprve pak nastupuje optimalizace, a díky inliningu vlastně optimalizátor vidí dovnitř funkce (jinak je funkce pro optimalizátor black box).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;K tomu, aby PL/pgSQL (nejen v PL/pgSQL) funkce mohla být inlinovaná, potřebujete vlastní kód v Cčkové extenzi. A je to vlastně trik (v tomto případě dost nestydatý podfuk :-)). Už dříve bylo možné napsat extenze, které dodávaly optimalizátoru znalost o vybraných funkcích (jinak, opět, pro optimalizátor, jsou funkce black box). Přímo v jádru je například podpora optimalizátoru pro funkci &amp;lt;code&amp;gt;generate_series&amp;lt;/code&amp;gt; (staré verze pg by v rows měly 1000).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT * FROM generate_series(1,3);&lt;br /&gt;
┌────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                             QUERY PLAN                             │&lt;br /&gt;
╞════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Function Scan on generate_series  (cost=0.00..0.03 rows=3 width=4) │&lt;br /&gt;
└────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Inlining byl dřive podporován pro funkce v jazyku SQL, kdy si planner vytáhl zdrojový kód funkce. V devatenáctce planner může zavolat extenzi, a může si říct nejen o detailnější parametry ohledně exekuce, ale může si říct o substituční SQL. Když ho dostane, tak funkci dále neřeší, a pracuje se substitučním SQL příkazem. Je to docela magie, nicméně efektivní. Kód extenze se volá až v momentu, kdy známe konstantní parametry funkce, a extenze se může rozhodnout - zavolej volanou funkci, nebo zavolej nějaké SQL, zavolej jinou funkci, případně vrať rovnou nějakou speciální hodnotu &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, 0, ... Je to i způsob, jak opravdu efektivně pracovat s dynamickým SQL. Musíte si ovšem napsat kód v Cčkové extenzi. Požadavek na tuto funkcionalitu přišel od vývojářů PostGISu. Cílem jsou optimalizace v PostGISu, dá se to ale použít i jinde. Časem si dovedu představit i nějakou contrib extenzi, která by tuto možnost zpřístupnila i bez nutnosti psát si vlastní extenzi. Škoda, že nemám autoritu vývojářů PostGISu. Dovedl bych si představit podobný trik v analyzátoru. Dost by mi to pomohlo s Orafce. V té pozici samozřejmě nejsem.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Vývoj&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Každoročně dochází k čištění kódu. Občas se zruší podpora některé platformy. Výjimečně se přidá podpora nové platformy nebo jako v případě pg19 se vrátí podpora dříve odstraněné platformy (AIX - operační systém AIX přestal být podporovaný v pg17 díky nezájmu IBM. Pak se ale v IBM chytli za nos, dodali počítač do testovací farmy, a do AIXu přidali aktualizovaný software potřebný k buildu Postgresu). Další čistky v kódu lze provést přechodem na novější verzi programovacího jazyka - přechodem z C99 na C11 (bohužel to může znamenat, že starých platformách se nové verze Postgresu nepřeloží). Interní datový typ &amp;lt;code&amp;gt;Datum&amp;lt;/code&amp;gt; až do předchozí verze byl 4bajtový na 32bitových platformách a 8bajtový na 64bitových platformách. Nově je 8bajtový na všech podporovaných platformách. Určitě nezanedbatelná část kódu se generuje z definičních souborů. Nově se z definic generuje kód definující konfigurační proměnné. Údržba, verzování, zajištění konzistence definičních souborů je násobně jednodušší než údržba adekvátního kódu v Cčku. Dynamická alokace paměti bude jednodušší díky funkcím &amp;lt;code&amp;gt;GetNamedDSA&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;GetNamedDSMSegment&amp;lt;/code&amp;gt;. Dynamicky sdílenou paměť lze sledovat skrze pohled &amp;lt;code&amp;gt;pg_dsm_registry_allocations&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Mám pocit, že vývoj Postgresu ještě víc zrychlil - je vidět mnohem víc patchů od lidí z Asie (dříve to bylo spíš jenom Japonsko), a o to víc se naráží na kapacitu committerů. Je to paradox, který nejde jednoduše řešit. Postgres je populární díky funkcionalitě a stabilitě. Stabilita je díky pečlivé práci commitetterů (důkladně se řeší každý řádek kódu). Díky popularitě je více programátorů, kteří píší více kódu, více patchů, ale committeři nestíhají, a tak patche zůstávají relativně dlouho ve frontě. Což frustruje programátory. Patch napíšete během měsíce, během měsíce se dá udělat finalizace a pár iterací s committerem, ale mezitím několik měsíců (v horším případě let (3 roky i v případě bezproblémového malého patche)), čekáte, až si na vás některý z committerů udělá čas. Celou dobu musíte udržovat patch v aplikovatelném stavu, musíte reagovat na případné diskuze, musíte sledovat vývoj a případně aktualizovat patch. Je to problém o kterém se ví, diskutuje se o něm, ale není úplně jasné, co by mělo být řešení. Minimálně se zlepšila evidence patchů, která pokrývá i automatické testování na několika různých platformách. Tady je velká klika, že Postgres má extenze. Neskutečně velký objem kódu (funkcionality) je dnes možné řešit skrz extenze mimo komunitu - což výrazně snižuje tlak na committery. V extenzích toho jde udělat hodně, bohužel, ne všechno. Na druhou stranu, extenze také nejsou bez rizika. Určitým způsobem zvyšují fragmentaci ekosystému Postgresu, který pak ztrácí přehlednost (plus ne všechny extenze jsou dostupné v cloudu). Zase, díky tomu je jádro Postgresu stále ještě rozumně velké. O Oracle se kolují zvěsti, že jádro má 14 miliónů řádek, Postgres pod 2 milióny. Náklady na údržbu Postgresu jsou výrazně menší. Kompilace zdrojáků je do 5 minut, regresní testy v největším rozsahu běží 15 minut. S tím ještě lze nějak rozumně pracovat. O Oracle jsem slyšel, že regresní testy běží den.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Popularita Postgresu jde aktuálně až do absurdna. Z Linkedinu mám pocit, že začíná být přepostgresováno (samozřejmě z mé perspektivy a v mé bublině). Hromada příspěvků vygenerovaných AI jsou banality na úrovni žáka prvního stupně (Postgres má VACUUM, indexy jsou super, dotazy mohou být pomalé, atd atd). Doporučení typu - proč ne Redis, proč ne Elastic, na všechno použijte Postgres. Viděl jsem hromadu clickbaitových článků typu - multigenerační architektura Postgresu je tragická, ale s naší AI nebo s naším supportem nebudete mít problém, atd atd. Postgresu dnes rozumí každý, kdo dokáže do AI napsat Postgres. Měl jsem tu možnost vidět naprosto neadekvátní doporučení ohledně konfigurace (dnes nevíte jestli důvodem je neznalost autora nebo naopak jeho vychytralost a snaha o co nejvíc komentářů případně o troling). Historicky popularita Postgresu rostla ve stínu MySQL, Monga a dalších databází a roky byl Postgres ušetřený mediálního balastu. To bohužel už není pravda. Pořád platí, že Postgres je dobrá databáze, stabilní, relativně rychlá, která se ale rozhodně nehodí na vše. Má svoje limity, které je dobré znát, a rozhodně nemůže ve všech ohledech (ve větším rozsahu) nahradit Redis, MySQL nebo Mongo případně Kafku. To je nesmysl, a není to ani cílem komunity. Základem jakékoliv práce je znát limity, chování, a správně v souladu s celkem, používat správné nástroje.&amp;lt;/p&amp;gt;&lt;br /&gt;
----------&lt;br /&gt;
&amp;lt;DPL&amp;gt;category=Verze PostgreSQL&amp;lt;/DPL&amp;gt;&lt;br /&gt;
[[Category:Články]]&lt;br /&gt;
[[Category:Verze PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1585</id>
		<title>PostgreSQL 19 (2026)</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1585"/>
		<updated>2026-05-10T03:15:18Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;i&amp;gt;Autor: Pavel Stěhule&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;O předchozích verzích jsem napsal, že změny byly primárně interní. Z pohledu uživatele, který chce vidět novou SQL syntax, se toho v posledních verzích moc nestalo. Devatenáctka je jiná. Tam je viditelných změn opravdu hodně. Jako každý rok - nová verze je pelmel nových funkcí a různých vylepšení menších nebo větších.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Administrace&lt;br /&gt;
====&lt;br /&gt;
&amp;lt;p&amp;gt;Bloating tabulek může být problém. Skoro všude jsem se setkal se situací, kdy &amp;quot;mazací&amp;quot; skript přestal fungovat (z různých důvodů), přičemž se tato chyba detekovala příliš pozdě, kdy dotčené tabulky měly místo jednotek GB například desítky GB. To už musí zaúřadovat &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, což často znamená vynucenou plánovanou odstávku (kvůli držení exkluzivního zámku). Je to letitý problém, který zkušenější uživatelé řešili buďto pečlivějším monitoringem, v některých případech partišningem (partitioning), případně extenzemi &amp;lt;code&amp;gt;pg_repack&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt;. Autor posledně jmenované extenze Tonda (Antonín Houska) spolu s Alvarem (Alvaro Herrera) poslední dva roky pracovali na integraci &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt; do jádra Postgresu. Paradoxně příkaz, který bude provádět zdrcnutí tabulek, se bude jmenovat &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt;. Základem je logická replikace - zadaná tabulka se lokálně zreplikuje (vytvoří se její nová kopie, a tím se zbaví vnitřního neobsazeného místa). Co je zásadní, je možnost použít volbu &amp;lt;code&amp;gt;CONCURRENTLY&amp;lt;/code&amp;gt;. S touto volbou příkaz nepoužije exkluzivní zámek. Tudíž je možné jej použít za provozu. Nutnou podmínkou je existence primárního klíče (a unikátního indexu).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
REPACK (CONCURRENTLY, VERBOSE) obce;&lt;br /&gt;
INFO:  repacking &amp;quot;public.obce&amp;quot; in physical order&lt;br /&gt;
INFO:  &amp;quot;public.obce&amp;quot;: found 0 removable, 6250 nonremovable row versions in 59 pages&lt;br /&gt;
DETAIL:  0 dead row versions cannot be removed yet.&lt;br /&gt;
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.&lt;br /&gt;
REPACK&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kromě toho, že příkaz &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt; nahrazuje příkaz &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, tak tento příkaz ještě nahrazuje příkaz &amp;lt;code&amp;gt;CLUSTER&amp;lt;/code&amp;gt;, kterým se tabulka fyzicky (jednorázově) přeuspořádá podle zadaného indexu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Možná jste si všimli, že dotaz běžící pod příkazem &amp;lt;code&amp;gt;EXPLAIN ANALYZE&amp;lt;/code&amp;gt; je výrazně pomalejší. Důvodem je měření času - executor, v tomto režimu, neustále poptává aktuální čas, a to má brutální režii. U větších dotazů se vyplatí použít volbu &amp;lt;code&amp;gt;TIMING OFF&amp;lt;/code&amp;gt;. V 19 na x86 se místo systémového času použíjí takty CPU. Je to výrazně rychlejší - zatímco na osmnáctce mi jednoduchý testovací dotaz běžel 2.5x pomalejší v explainu, na devatenáctce pouze 1.5x pomaleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou velkou změnou je vypnutí JIT ve výchozí konfiguraci. JIT se objevil v Postgresu 11, a v Postgresu 12 byl zapnutý ve výchozí konfiguraci. Bohužel se zjistilo, že většině uživatelů, kteří Postgres používají pro OLTP, dělá víc škody než užitku. Došlo to až do stavu, kdy se uživatelům doporučovalo, neoficiálně, po instalaci JIT vypnout. Je tam víc problémů. &amp;lt;code&amp;gt;clang&amp;lt;/code&amp;gt;, na kterém je to postavené, v novějších verzích kompiluje lépe, ale pomaleji. Existují alternativní implementace JIT, ale všechny jsou více než méně experimentální. Druhým problémem je model, na jehož základě se JIT aktivuje. Tento model jednak nedokáže dobře odhadnout náročnost &amp;quot;jitifikace - inliningu, a navíc je citlivý na přestřelení odhadu počtu řádek. Ohledně modelu a citlivosti na odhady pochybuji, že se dá něco dělat. Alternativní implementace JIT mají výrazně nižší režii. Přijde mi to ale jako slepá cesta. Budoucnost vidím v integraci vektorového executoru a vektorových funkcí (tak jak to používá [https://duckdb.org/ DuckDB]). Může to znamenat, že Postgres bude mít duální implementace funkcí (pro skalární parametr, a pro vektor parametrů).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze vytvořit replikační slot pro logickou replikaci, bez nutnosti mít konfiguraci &amp;lt;code&amp;gt;wal_level=logical&amp;lt;/code&amp;gt;. Postačuje nastavení &amp;lt;code&amp;gt;replica&amp;lt;/code&amp;gt;, což je výchozí nastavení. Jakmile je logický replikační slot aktivní, interně se úroveň zápisu do transakčního logu nastaví na &amp;lt;code&amp;gt;logical&amp;lt;/code&amp;gt;. Jaký je aktuální stav zjistíte v konfigurační proměnné &amp;lt;code&amp;gt;effective_wal_level&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Další bombou je možnost zapínat nebo vypínat kontrolní součty (na úrovni datových stránek) za běhu. Kontrolní součty jsou v Postgresu už relativně dlouho, a ačkoliv na dnešním hardware je jejich režie zanedbatelná, tak určitě bude dost databází, kde nebudou zapnuté. Zapnutí kontrolních součtů vyžadovalo odstávku úměrnou velikosti databáze. Navíc se silně doporučuje po zapnutí součtů znovu zreplikovat všechny fyzické repliky. Výhodou je diagnostika, možnost identifikovat poškozené stránky (a přeskočit je), možnost vyrobit replikovaný server ze starého primárního příkazem &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt;. Naplánovat a provést delší odstávku někde nemusí být jednoduché (nebo to může být skoro nemožné). U jednoho mého klienta zapnutí kontrolních součtů na cca 2TB databázi trvalo cca 2 hodiny (na vlastním hardware z roku 2025). Zapnutí se provede voláním funkce &amp;lt;code&amp;gt;pg_enable_data_checksums&amp;lt;/code&amp;gt;. Nastavením volitelných parametrů lze běh funkce zpomalit, tak aby nepřetěžovala IO. Vypnutí provede funkce &amp;lt;code&amp;gt;pg_disable_data_checksums&amp;lt;/code&amp;gt;. Stav procesu můžeme vidět v pohledu &amp;lt;code&amp;gt;pg_stat_progress_data_checksums&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Snad se už konečně vyřešil problém s upgradem databází obsahující extrémně velký počet LO (large objects). Nově binární upgrade (&amp;lt;code&amp;gt;pg_upgrade&amp;lt;/code&amp;gt;) použije pro export metadat LO příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; místo původní sekvence příkazů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- původní sekvence&lt;br /&gt;
SELECT pg_catalog.lo_create(&#039;5432&#039;);&lt;br /&gt;
ALTER LARGE OBJECT 5432 OWNER TO alice;&lt;br /&gt;
GRANT SELECT ON LARGE OBJECT 5432 TO bob;&lt;br /&gt;
&lt;br /&gt;
-- nově&lt;br /&gt;
COPY pg_catalog.pg_largeobject_metadata (oid, lomowner, lomacl) FROM stdin;&lt;br /&gt;
5432 16384 {alice=rw/alice,bob=r/alice}&lt;br /&gt;
\.&lt;br /&gt;
&lt;br /&gt;
COPY pg_catalog.pg_shdepend (dbid, classid, objid, objsubid, refclassid, refobjid, deptype) FROM stdin;&lt;br /&gt;
5 2613 5432 0 1260 16384 o&lt;br /&gt;
5 2613 5432 0 1260 16385 a&lt;br /&gt;
\.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nová implementace by měla být řádově rychlejší.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konečně se dotáhlo do konce začlenění podpory více formátů v příkazu &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Postgres má dva základní příkazy pro export (backup) - &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Historicky tyto příkazy podporovaly pouze &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; formát. Postupem času &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; získal možnost exportu do &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;dictionary&amp;lt;/code&amp;gt; formátu plus import příkazem &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umožňoval paralelní import více tabulek. &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; byl díky podpoře pouze SQL formátu dost omezený. To se nyní změnilo, a v &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; jsou podporovány všechny formáty, které podporuje &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt;. Vypadá to trochu jako workaround. V případě, že se použije jiný než &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; (SQL) formát, tak se vyrobí adresář, který do podadresářů uloží výstup z &amp;lt;code&amp;gt;pg_dumpu&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umí s touto adresářovou strukturou pracovat. Tato možnost se dostala už do 18tky, ale byla na poslední chvíli stažena.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt; zredukovalo kopírování WAL logů z nového primárního serveru na budovanou repliku a to tak, že se budou kopírovat pouze WAL logy vzniklé po rozpadu replikace. V mnoha scénářích se tím výrazně urychlí běh tohoto příkazu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Doposud autovacuum vybíralo tabulky k vakuování na základě porovnání vypočítaných koeficientů a prahových hodnot. Pořadí vybraných tabulek záleželo na fyzickém pořadí v systémové tabulce &amp;lt;code&amp;gt;pg_class&amp;lt;/code&amp;gt;. Nově se vakuum bude prioritizovat podle míry vzdálenosti od prahu. Dalším kritériem je stáří tabulky (počet transakcí od freeze). Stará implementace byla férová v tom, že garantovala, že každá tabulka bude zvakuovaná a že žádná tabulka nebude &amp;quot;předbíhat&amp;quot; ve frontě. Na druhou stranu se mohlo stát, že tabulka s intenzivnějším provozem čekala příliš dlouho a došlo k zbytečnému bloatingu. Nová implementace se snaží být chytřejší. Uvidíme, jak to bude fungovat. Moje zkušenost je taková, že a) není dobré dávat do Postgresu příliš dynamická data, b) je dobré si nastavit počet aktivních autovacuum workerů tak, aby byla určitá rezerva, c) není dobré vytěžovat IO na maximum (je dobré mít dostatečně nadimenzované IO a mít nějakou rezervu). Skóre tabulek můžeme sledovat v pohledu &amp;lt;code&amp;gt;pg_stat_autovacuum_score&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_autovacuum_scores WHERE score &amp;gt; 0.05;&lt;br /&gt;
┌─[ RECORD 1 ]────────┬──────────────────────┐&lt;br /&gt;
│ relid               │ 1262                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_database          │&lt;br /&gt;
│ score               │ 0.15936254737880529  │&lt;br /&gt;
│ xid_score           │ 1e-07                │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0.0793650769622719   │&lt;br /&gt;
│ vacuum_insert_score │ 0.003998400542165933 │&lt;br /&gt;
│ analyze_score       │ 0.15936254737880529  │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
╞═[ RECORD 2 ]════════╪══════════════════════╡&lt;br /&gt;
│ relid               │ 1214                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_shdepend          │&lt;br /&gt;
│ score               │ 0.12                 │&lt;br /&gt;
│ xid_score           │ 1.15e-07             │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0                    │&lt;br /&gt;
│ vacuum_insert_score │ 0.006                │&lt;br /&gt;
│ analyze_score       │ 0.12                 │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
└─────────────────────┴──────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově autovacuum může použít &amp;lt;code&amp;gt;VACUUM&amp;lt;/code&amp;gt; s podporou paralelismu.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přehled o aktuálním stavu recovery je k dispozici v pohledu &amp;lt;code&amp;gt;pg_stat_recovery&amp;lt;/code&amp;gt;. V pohledu &amp;lt;code&amp;gt;pg_stat_statements&amp;lt;/code&amp;gt; jsou dva nové sloupce &amp;lt;code&amp;gt;generic_plan_calls&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;custom_plan_calls&amp;lt;/code&amp;gt; zobrazující kolikrát předpřipravený příkaz (prepared statement) použil generický nebo zákaznický plán. Nový sloupec &amp;lt;code&amp;gt;wal_fpi_bytes&amp;lt;/code&amp;gt; zobrazuje velikost zápisu tzv. plných stránek do transakčního logu. Vysoká hodnota může signalizovat nepříjemně velkou četnost vynucených checkpointů (je nutné zvednout &amp;lt;code&amp;gt;max_wal_size&amp;lt;/code&amp;gt; případně &amp;lt;code&amp;gt;checkpoint_timeout&amp;lt;/code&amp;gt;). V novém pohledu &amp;lt;code&amp;gt;pg_stat_lock&amp;lt;/code&amp;gt; uvidíme počet a celkový čas čekání na různé typy zámků. Zaznamenány jsou pouze ty situace, kdy se čeká na zámek déle než jednu sekundu (stejně jako např. &amp;lt;code&amp;gt;log_lock_waits&amp;lt;/code&amp;gt;, které je v nyní ve výchozí konfiguraci zapnuté). Bohužel zámky, které trvají cca 100ms, mající nepříjemný dopad na dotazy kolem 10ms, zde neuvidíme:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_lock ;&lt;br /&gt;
┌──────────────────┬───────┬───────────┬───────────────────┬───────────────────────────────┐&lt;br /&gt;
│     locktype     │ waits │ wait_time │ fastpath_exceeded │          stats_reset          │&lt;br /&gt;
╞══════════════════╪═══════╪═══════════╪═══════════════════╪═══════════════════════════════╡&lt;br /&gt;
│ relation         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ extend           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ frozenid         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ page             │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ tuple            │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ transactionid    │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ virtualxid       │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ spectoken        │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ object           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ userlock         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ advisory         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ applytransaction │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
└──────────────────┴───────┴───────────┴───────────────────┴───────────────────────────────┘&lt;br /&gt;
(12 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze Postgres podporuje asynchronní IO. Čtení je realizováno dedikovanými procesy (workers). Počáteční implementace pracovala s konfigurovatelným počtem těchto procesů (výchozí nastavení mělo hodnotu 3). Nově je správa workerů dynamičtější - v případě potřeby si je Postgres nastartuje nebo naopak zavře. Místo fixního počtu nyní nastavujeme minimální a maximální počet workerů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io_min_workers=2&lt;br /&gt;
io_max_workers=8 (up to 32)&lt;br /&gt;
io_worker_idle_timeout=60s&lt;br /&gt;
io_worker_launch_interval=100ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Poměrně razantně se změnila konfigurace &amp;lt;code&amp;gt;log_min_messages&amp;lt;/code&amp;gt;, která udává, na které úrovni se mají chyby zapsat do systémového logu (&amp;lt;code&amp;gt;DEBUG5&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;PANIC&amp;lt;/code&amp;gt;). Nově lze tuto úroveň nastavit pro každý typ procesu (&amp;lt;code&amp;gt;archiver&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;autovacuum&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bgworker&amp;lt;/code&amp;gt;, ...) např. &amp;lt;code&amp;gt;error, walsender:debug1, autovacuum:debug1&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Správa partišen (partitions) byla v Postgresu základní. Díky možnosti sloučit nebo rozdělit partišny (partitions) se dostává trochu dál. Je to spíš první krok se spoustou omezení - používá se pouze jedno CPU a po celou dobu je exkluzivně zamknutá rodičovská tabulka. Ale i tak to může dost uživatelům ušetřit práci (a jejich vlastní řešení by pravděpodobně mělo stejná omezení):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_east, sales_central)  INTO sales_all;&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE measurement SPLIT PARTITION measurement_y2006q1 INTO&lt;br /&gt;
   (PARTITION measurement_y2006m01 FOR VALUES FROM (&#039;2006-01-01&#039;) TO (&#039;2006-02-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m02 FOR VALUES FROM (&#039;2006-02-01&#039;) TO (&#039;2006-03-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m03 FOR VALUES FROM (&#039;2006-03-01&#039;) TO (&#039;2006-04-01&#039;));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Oproti předchozím verzím lze zapínat a vypínat všechny typy omezení (nejen cizí klíče):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, CONSTRAINT cc CHECK(a &amp;gt; 0) NOT ENFORCED); &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
INSERT INTO foo VALUES(1);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ERROR:  check constraint &amp;quot;cc&amp;quot; of relation &amp;quot;foo&amp;quot; is violated by some row&lt;br /&gt;
DELETE FROM foo WHERE a = 0;&lt;br /&gt;
DELETE 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
ERROR:  new row for relation &amp;quot;foo&amp;quot; violates check constraint &amp;quot;cc&amp;quot;&lt;br /&gt;
DETAIL:  Failing row contains (0).&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc NOT ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pg_plan_advice&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;p&amp;gt;Až doposud uživatelé Postgresu neměli moc možností, jak ovlivnit generování prováděcích plánů. Hinty ve stylu Oracle byly a jsou z historických důvodů tabu (jsou implementovány extenzí [https://github.com/ossc-db/pg_hint_plan pg_hint_plan]). Uživatel měl pouze možnost penalizace metod executoru - např. &amp;lt;code&amp;gt;enable_nestloop&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;enable_indexscan&amp;lt;/code&amp;gt; nastavením na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Tato penalizace je ale dost hrubá, a neumožňuje jemné ovlivnění plánovače. Přesto se používala a používá. Rober Haas napsal dvě extenze [https://www.postgresql.org/docs/devel/pgplanadvice.html &amp;lt;code&amp;gt;pg_plan_advice&amp;lt;/code&amp;gt;] a [https://www.postgresql.org/docs/devel/pgstashadvice.html &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;]. Prvně zmíněná extenze umožňuje definovat jakási doporučení, která by měl planner respektovat. Pro každý plán lze zpětně dogenerovat tato doporučení:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce&lt;br /&gt;
  ORDER BY pocet_muzu + pocet_zen DESC&lt;br /&gt;
  LIMIT 10;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Limit  (cost=272.19..272.21 rows=10 width=45)                        │&lt;br /&gt;
│   -&amp;gt;  Sort  (cost=272.19..287.81 rows=6250 width=45)                 │&lt;br /&gt;
│         Sort Key: ((pocet_muzu + pocet_zen)) DESC                    │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on obce  (cost=0.00..137.12 rows=6250 width=45) │&lt;br /&gt;
│ Generated Plan Advice:                                               │&lt;br /&gt;
│   SEQ_SCAN(obce)                                                     │&lt;br /&gt;
│   NO_GATHER(obce)                                                    │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                      QUERY PLAN                                      │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Nested Loop  (cost=0.28..12.56 rows=81 width=58)                                     │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17)                          │&lt;br /&gt;
│         Filter: (nazev = &#039;Beroun&#039;::text)                                             │&lt;br /&gt;
│   -&amp;gt;  Index Scan using obce_okres_id_idx on obce  (cost=0.28..9.79 rows=81 width=41) │&lt;br /&gt;
│         Index Cond: ((okres_id)::text = okresy.id)                                   │&lt;br /&gt;
│ Generated Plan Advice:                                                               │&lt;br /&gt;
│   JOIN_ORDER(okresy obce)                                                            │&lt;br /&gt;
│   NESTED_LOOP_PLAIN(obce)                                                            │&lt;br /&gt;
│   SEQ_SCAN(okresy)                                                                   │&lt;br /&gt;
│   INDEX_SCAN(obce public.obce_okres_id_idx)                                          │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                                             │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(11 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Prostřednictvím konfigurační proměnné &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; můžeme ovlivnit chování planneru vlastními doporučeními:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET pg_plan_advice.advice to &#039;JOIN_ORDER(obce okresy)&#039;;&lt;br /&gt;
SET&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌───────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                            QUERY PLAN                             │&lt;br /&gt;
╞═══════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Join  (cost=1.97..140.78 rows=81 width=58)                   │&lt;br /&gt;
│   Hash Cond: ((obce.okres_id)::text = okresy.id)                  │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on obce  (cost=0.00..121.50 rows=6250 width=41)    │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=1.96..1.96 rows=1 width=17)                     │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17) │&lt;br /&gt;
│               Filter: (nazev = &#039;Beroun&#039;::text)                    │&lt;br /&gt;
│ Supplied Plan Advice:                                             │&lt;br /&gt;
│   JOIN_ORDER(obce okresy) /* matched */                           │&lt;br /&gt;
│ Generated Plan Advice:                                            │&lt;br /&gt;
│   JOIN_ORDER(obce okresy)                                         │&lt;br /&gt;
│   HASH_JOIN(okresy)                                               │&lt;br /&gt;
│   SEQ_SCAN(obce okresy)                                           │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                          │&lt;br /&gt;
└───────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(13 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konfigurace planneru prostřednictvím &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; nestačí, pokud potřebujeme ovlivnit plán dotazu z aplikace, u které nemůžeme nebo nechceme měnit zdrojový kód. A proto je tu druhá zmíněná extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;, která umožňuje naše &amp;quot;doporučení&amp;quot; uložit a pak automaticky aplikovat na základě tzv &amp;lt;code&amp;gt;queryid&amp;lt;/code&amp;gt;. Doporučení jsou uložena v pojmenovaných skladech (stashes). Skrze konfigurační proměnnou &amp;lt;code&amp;gt;pg_stash_advice.stash_name&amp;lt;/code&amp;gt; volíme aktivní sklad. Každý uživatel, každá databáze může mít svůj vlastní. Pokud proměnná není nastavená, tak je extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt; neaktivní. Uložené nápovědy jsou perzistentní - při vypnutí serveru se uloží, po startu znovu načtou do paměti.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;SQL&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; je syntaxe, kterou postres přejímá z analytických databází (zde to snad byla [https://duckdb.org/2022/05/04/friendlier-sql#group-by-all DuckDB]). Pokud se použije tento zápis, tak se automaticky agreguje podle všech sloupců, které nejsou v agregační funkci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT sum(pocet_zen + pocet_muzu), okresy.id, okresy.nazev &lt;br /&gt;
  FROM obce join okresy ON obce.okres_id = okresy.id&lt;br /&gt;
 GROUP BY ALL;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tento zápis může ušetřit dost psaní, může to být také &amp;quot;tichý&amp;quot; zabiják výkonu. Čím více atributů je v klauzuli &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;, tím je agregace pomalejší. Zápis &amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; ještě není ve standardu, ale je standardizační komisí akceptován, a měl by být v některé další verzi ANSI/SQL.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Počínaje Postgresem 19 už nebude možnost používat backlash jako escape symbol v řetězcích. Před 15 roky se přešlo na standardní chování (předtím se řetězce v Postgresu chovali stejně jako v Cčku), nicméně nestandardní chování bylo možné vynutit nastavením &amp;lt;code&amp;gt;standard_conforming_strings&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Mezi top vývojáři Postgresu je hodně velká averze k tzv kompatibility flagům (zmíněný flag nebyl výjimkou) (pozn. u komerčních databází jsou naopak kompatibility flagu standardem, a nejen u nich - např. MySQL). Nyní je tato možnost zrušena, a Cčkové stringy dostaneme pouze jen zápisem (jako tzv extended strings):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;ahoj\nsvete&#039;;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│  ?column?   │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ ahoj\nsvete │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT e&#039;Ahoj\nSvete&#039;;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ Ahoj    ↵│&lt;br /&gt;
│ Svete    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze v u window funkcí &amp;lt;code&amp;gt;lead&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lag&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;first_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last_value&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;nth_value&amp;lt;/code&amp;gt; použít klauzuli &amp;lt;code&amp;gt;IGNORE NULLS&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;. Výchozí chování, které bylo implementováno již dříve odpovídá klauzuli &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;SQL/PGQ&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;V tomto případě PG není častým prefixem symbolizujícím Postgres (a Q jako queue), ale Property Graph Queries. Počínaje podporou neatomických datových typů v SQL:2000, přes podporu XML v SQL:2003 se standard rozšířil nad rámec čistě relačních databází (stejně ale už dříve existovala kritika SQL z pohledu čistoty od relačních dogmatiků). Standard SQL:2023 (ISO/IEC 9075-16:2023) SQL rozšiřuje o podporu grafových databází, které mají svůj vlastní datový model odlišný od relačního modelu. Přijde mi to jako dost odvážný krok (a ještě teď tomu nemohu úplně uvěřit). Zatím existovala zřetelná jednota mezi SQL a relačním modelem. Od nové části standardu se očekává, že pomůže s přehlednějším zápisem určitých dotazů, které se až doposud řešily pomocí rekurze. Přiznám se, že zápis dotazu v PGQ (využívajícího ascii art) mi přijde hodně cizí (možná zažívám pocity programátora v Cobolu, když se poprvé podíval na SQL. Osobně mi to nesedí - reprezentaci znalostí ve formátu grafu jsem nikdy nemusel (vím, že je to jen jiná reprezentace téhož)). Row pattern recognition z roku SQL:2016 toho také nemá s relačními databázemi moc společného, takže to takové překvapení není. Práce na této části standardu začaly v roce 2017 (a integrovaly se prvky jazyka [https://neo4j.com/docs/cypher-manual/current/introduction/cypher-overview/ Cypher] (Neo4j) a [https://docs.oracle.com/en/database/oracle/property-graph/20.4/spgdg/property-graph-query-language-pgql.html#GUID-301FF092-1A07-43D2-91E5-0C5AFF3467CC PGQL] (Oracle)).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Základem grafových databází je graf skládající se z uzlů a hran. Ka každému uzlu i hraně mohou být přiřazeny atributy (properties). Hrany mohou být orientované i neorientované. Standard pro takové grafy používá termín Property Graphs. Graf se definuje příkazem &amp;lt;code&amp;gt;CREATE PROPERTY GRAPH&amp;lt;/code&amp;gt; a je to určitá forma pohledu. Přesto, že jsem zkoušel poměrně triviální příklad, nebylo pro mne intuitivní napsat SQL/PGQ dotaz. Pro uživatele bez zkušenosti s Neo4j nebo jinou grafovou databází budou začátky s SQL/PGQ dost bolestivé. V tuto chvíli (duben 2026) ještě není hotová dokumentace. Je možné, že se díky integraci SQL/PGQ do Postgresu setkám s grafovými databázemi častěji (SQL/PGQ je podporováno v DuckDB a v Oracle):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE public.uzivatele (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  jmeno character varying&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE public.zpravy (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  odesilatel integer,&lt;br /&gt;
  prijemce integer,&lt;br /&gt;
  tema text&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- uzivatel - odeslal -&amp;gt; uzivatel&lt;br /&gt;
CREATE PROPERTY GRAPH public.pg1&lt;br /&gt;
  VERTEX TABLES (&lt;br /&gt;
    public.uzivatele AS uzivatel KEY (id) PROPERTIES (id, jmeno)&lt;br /&gt;
  )&lt;br /&gt;
  EDGE TABLES (&lt;br /&gt;
    public.zpravy AS odeslal KEY (id)&lt;br /&gt;
    SOURCE KEY (odesilatel) REFERENCES uzivatel (id)&lt;br /&gt;
    DESTINATION KEY (prijemce) REFERENCES uzivatel (id)&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (1, &#039;Pavel&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (2, &#039;Zdenek&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (3, &#039;Tomas&#039;);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.zpravy VALUES (1, 1, 2, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (2, 2, 1, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (3, 1, 3, &#039;dotaz ohledne dopravy&#039;);&lt;br /&gt;
&lt;br /&gt;
-- od koho uzivatel Pavel dostal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) &amp;lt;-[IS odeslal]- (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
└────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- komu uzivatel Pavel poslal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) -[IS odeslal]-&amp;gt; (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
│ Tomas  │&lt;br /&gt;
└────────┘&lt;br /&gt;
(2 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Osobně si nedovedu představit, že bych psal dotazy v SQL/PGQ (myslím, že podobně na tom bude většina uživatelů podobně). Je otázkou, jestli se SQL/PGQ neuplatní ve spolupráci s AI. V tomto případě se běžný dotaz rozpadá do dvou kroků. Navíc i joinovací podmínka získává label, takže je to v určitém smyslu více popisné, než běžné SQL, a je tak možné, že tento zápis bude AI více sedět.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pomalu se pokračuje na implementaci tzv temporálních tabulek. Letos je to podpora klauzule &amp;lt;code&amp;gt;FOR PORTION OF valid_at FROM TO&amp;lt;/code&amp;gt;. Zjednodušeně, pokud máme temporální databáze nebo temporální tabulky, tak se můžeme podívat na stav dat v nějakém čase. Pokud se použije klauzule &amp;lt;code&amp;gt;FOR PORTION OF FROM TO&amp;lt;/code&amp;gt;, tak se jedná o tzv temporální &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- je nutne mit nainstalovanou extenzi btree_gist&lt;br /&gt;
CREATE TABLE ceny(&lt;br /&gt;
  id int,&lt;br /&gt;
  valid_at daterange,&lt;br /&gt;
  nazev text,&lt;br /&gt;
  cena int,&lt;br /&gt;
  PRIMARY KEY (id, valid_at WITHOUT OVERLAPS)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
-- jednotna cena mezi 2020-01-01 a 2025-12-31&lt;br /&gt;
INSERT INTO ceny VALUES(1, &#039;[2020-01-01,2026-01-01)&#039;, &#039;pecivo&#039;, 20);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- uprava ceny mezi 2021-01-01 a 2021-02-28&lt;br /&gt;
UPDATE ceny&lt;br /&gt;
   FOR PORTION OF valid_at FROM &#039;2021-01-01&#039; TO &#039;2021-03-01&#039;&lt;br /&gt;
   SET cena = 30&lt;br /&gt;
 WHERE id = 1;&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny ORDER BY valid_at;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2021-01-01) │ pecivo │   20 │&lt;br /&gt;
│  1 │ [2021-01-01,2021-03-01) │ pecivo │   30 │&lt;br /&gt;
│  1 │ [2021-03-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Nové datové typy a funkce&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;V Postgresu se můžete setkat s datovými typy s prefixem &amp;lt;code&amp;gt;reg&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;regrole&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regproc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regclass&amp;lt;/code&amp;gt;. Tyto datové typy jsou vždy spojeny s jednou konkrétní systémovou tabulkou a hodnoty těchto typů vždy nesou unikátní číselný identifikátor databázového objektu. Tyto typy podporují přetypování z textu, což se používá pro zkrácený zápis vyhledávání nějakého databázového objektu v katalogu. Nově můžeme používat typ &amp;lt;code&amp;gt;regdatabase&amp;lt;/code&amp;gt; a tento typ se odkazuje, jak je patrné z názvu, na tabulku &amp;lt;code&amp;gt;pg_database&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ regdatabase │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ template1   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase::oid;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT oid&lt;br /&gt;
 FROM pg_database &lt;br /&gt;
 WHERE datname = &#039;template1&#039;;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Díky těmto typům jsou dotazy nad systémovým katalogem kratší a čitelnější. Navíc autor dotazů nemusí brát v potaz některé detaily (jako například case sensitivitu), kde se chování SQL identifikátorů liší od SQL stringů. To je ošetřeno interně při přetypování.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce &amp;lt;code&amp;gt;error_on_null&amp;lt;/code&amp;gt; vyhodí výjimku, pokud je parametr NULL. Jinak vrátí hodnotu parametru. Implementace je extrémně jednoduchá - sleduje flag &amp;lt;code&amp;gt;isnull&amp;lt;/code&amp;gt;. Každý parametr každé SQL funkce má tento flag. Stejné chování má flag funkce &amp;lt;code&amp;gt;STRICT&amp;lt;/code&amp;gt;. Je tu drobná zrada. V případě kompozitních typů to není kompatibilní s operátorem &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;. Kompozitní hodnota obsahující pouze &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;y je interně ne nullová, ale operátor &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt; pro takovou kompozitní hodnotu vrátí &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT ROW(NULL, NULL) IS NULL;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT error_on_null(NULL::integer);&lt;br /&gt;
ERROR:  null value not allowed&lt;br /&gt;
SELECT error_on_null(ROW(NULL, NULL));&lt;br /&gt;
┌───────────────┐&lt;br /&gt;
│ error_on_null │&lt;br /&gt;
╞═══════════════╡&lt;br /&gt;
│ (,)           │&lt;br /&gt;
└───────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Roky se v Postgresu mluví o tom, že by měl existovat snadný způsob, jak zpětně z databázového objektu vygenerovat DDL příkaz. Osobně jsem nikdy tuhle potřebu neměl, ale do jisté míry této potřebě rozumím. Skoro v každém admin nástroji můžete iterovat přes databázové objekty a k nim si nechat zobrazit DDL. A skoro každý admin tool, pak tuto funkcionalitu duplicitně implementuje - s chybami nebo bez chyb. Je to kód, který vyžaduje neustálou údržbu a aktualizace. Po letech diskuzí se je v upstreamu první část funkcí &amp;lt;code&amp;gt;pg_get_...ddl&amp;lt;/code&amp;gt; (aktuálně &amp;lt;code&amp;gt;pg_get_database_ddl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pg_get_role_ddl&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_get_tablespace_ddl&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT pg_get_role_ddl(&#039;pavel&#039;);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                       pg_get_role_ddl                                        │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ CREATE ROLE pavel SUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS; │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze je v postgresu funkce generující náhodné číslo v zadaném rozsahu. K nim nyní přibyly funkce pro rozsah typů &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;timestamptz&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SELECT random(current_date - 6, current_date);&lt;br /&gt;
┌────────────┐&lt;br /&gt;
│   random   │&lt;br /&gt;
╞════════════╡&lt;br /&gt;
│ 2026-04-13 │&lt;br /&gt;
└────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT random(current_timestamp - interval &#039;1 week&#039;, current_timestamp);&lt;br /&gt;
┌───────────────────────────────┐&lt;br /&gt;
│            random             │&lt;br /&gt;
╞═══════════════════════════════╡&lt;br /&gt;
│ 2026-04-09 02:30:30.665819+02 │&lt;br /&gt;
└───────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Optimalizace&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Jako nejdůležitější optimalizaci v nové verzi vidím optimalizaci implementace kontroly referenční integrity. RI je v postgresu realizována v systémových řádkových triggerech, které, až doposud, provedly (pro každý řádek) jeden kontrolní SQL příkaz (s použitím SPI API - stejné API, které se používá např. v PL/pgSQL). Nově se hledá přímo v indexech - přeskakuje se celý aparát SQL. To je první výrazná optimalizace. Druhou výraznou optimalizací je hledání nikoliv jedné hodnoty, ale pole hodnot (n = 64). Podle autora patche je nyní kontrola referenční integrity cca 3x rychlejší. Pořád to bude znát. Výrazně se ale posune hranice, od kdy se vyplatí při masivních importech kontrolu referenční integrity vypínat.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE tab_a(id int PRIMARY KEY);&lt;br /&gt;
INSERT INTO tab_a SELECT generate_series(1,1000);&lt;br /&gt;
VACUUM ANALYZE tab_a;&lt;br /&gt;
&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b_no_ri(id int, a_id int);&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b(id int, a_id int references tab_a(id));&lt;br /&gt;
\timing&lt;br /&gt;
-- postgres 18&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 12844,206 ms (00:12,844)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 659,462 ms&lt;br /&gt;
&lt;br /&gt;
-- postgres 19&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 2728,073 ms (00:02,728)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 673,444 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ukázkový test je best case - zrychlení je cca čtyřnásobné. Stále je import s RI cca 4x pomalejší než bez RI (a to cílová tabulka obsahuje pouze jeden cizí klíč). V praxi to bude jiné - kromě RI je náročná i aktualizace indexů a samozřejmě všechny diskové operace.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Určitě každý, kdo pracuje s Postgresem trochu déle, se setkal s doporučením &amp;quot;nepoužívej &amp;lt;code&amp;gt;NOT IN (SELECT ...&amp;lt;/code&amp;gt;&amp;quot;. Důvodem byla (v některých případech) &amp;quot;špatná&amp;quot; optimalizace. Optimalizátor neměl garanci, že subselect nevrátí &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;. Poté, co se ve verzi 18 přepsal systém pro ukládání omezujících pravidel (constraints), už bylo možné do tuto informaci v optimalizátoru použít. Nyní se by se měl subselect &amp;lt;code&amp;gt;NOT IN&amp;lt;/code&amp;gt; transformovat na tzv anti-join (v těch případech, kdy je garantováno, že žádná proměnná v predikátu nebude &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;). Jinými slovy, pokud optimalizátor bude mít garance, že se v predikátu subselectu nevyskytne &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, tak vygeneruje stejný plán, jako kdybyste použili zápis s &amp;lt;code&amp;gt;NOT EXISTS&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE osoby(id int PRIMARY KEY, jmeno varchar);&lt;br /&gt;
CREATE TABLE faktury(id int primary key,&lt;br /&gt;
                     vlozeno timestamp,&lt;br /&gt;
                     podal int REFERENCES osoby(id) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT *&lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE id NOT IN (SELECT podal&lt;br /&gt;
                            FROM faktury);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT * &lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE NOT EXISTS(SELECT podal &lt;br /&gt;
                            FROM faktury&lt;br /&gt;
                           WHERE podal = osoby.id);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
-- ve starších verzích dostanete různé plány&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ve starších verzích spojení relací vždy předcházelo agregaci. To v některých případech může být neefektivní (pokud agregace výrazně redukuje počet řádek). Pokud jsem chtěl změnit pořadí operací, musel jsem si to vynutit zápisem (poddotazem). V devatenáctce optimalizátor podporuje tzv předběžnou agregaci (eager aggregation), která předbíhá před join:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT sum(pocet_zen + pocet_muzu), okresy.nazev &lt;br /&gt;
                  FROM okresy JOIN obce ON okresy.id = obce.okres_id&lt;br /&gt;
                 GROUP BY okresy.nazev;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                                QUERY PLAN                                                │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Finalize HashAggregate  (cost=157.38..158.15 rows=77 width=18)                                           │&lt;br /&gt;
│   Group Key: okresy.nazev                                                                                │&lt;br /&gt;
│   -&amp;gt;  Hash Join  (cost=3.02..157.00 rows=77 width=18)                                                    │&lt;br /&gt;
│         Hash Cond: ((obce.okres_id)::text = okresy.id)                                                   │&lt;br /&gt;
│         -&amp;gt;  Partial GroupAggregate  (cost=0.28..154.05 rows=77 width=15)                                 │&lt;br /&gt;
│               Group Key: obce.okres_id                                                                   │&lt;br /&gt;
│               -&amp;gt;  Index Only Scan using obce_okres_id_idx on obce  (cost=0.28..122.03 rows=6250 width=7) │&lt;br /&gt;
│         -&amp;gt;  Hash  (cost=1.77..1.77 rows=77 width=17)                                                     │&lt;br /&gt;
│               -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.77 rows=77 width=17)                                 │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(9 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Na datech pro ČR je výše uvedený dotaz cca 3x rychlejší (v pg19 vůči pg18).&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud je jeden řádek zamčený vícero transakcemi, tak se do jeho systémového atributu &amp;lt;code&amp;gt;xmax&amp;lt;/code&amp;gt; uloží tzv &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; (MultiXact je &amp;quot;aparát&amp;quot;, kterým se v Postgresu implementují řádkové zámky). To je unikátní identifikátor skupiny transakcí, které drží zámek. Každá skupina transakcí se skládá z tzv členských záznamů &amp;lt;code&amp;gt;MultiXactMember&amp;lt;/code&amp;gt;, ve kterých se drží identifikátor transakce, typ zámku a stav transakce. Také tyto záznamy mají své unikátní id &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Doposud &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; byla 32bitová hodnota. Nově je tato hodnota 64bitová, a nehrozí její přetečení. &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; i id transakcí jsou stále 32bitové hodnoty (existuje několik rozpracovaných řešení, které zvyšují jejich rozsah), takže stále hrozí přetečení těchto id, a nastartování vynuceného freezování (což u více zatížených systémů může způsobit problémy s produkcí). Eliminovala se ale možnost přetečení &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Je tp důležité, protože &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; rostl ze všech zmíněných id nejrychleji (pokud &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; je počet transakcí se sdílenými zámky, pak růst &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; je &amp;lt;code&amp;gt;nxn&amp;lt;/code&amp;gt;). Informace o MultiXact (skupinách transakcí) lze získat novou funkcí &amp;lt;code&amp;gt;pg_get_multixact_stats()&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přepracoval se kód, který implementuje příkazy &amp;lt;code&amp;gt;LISTEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NOTIFY&amp;lt;/code&amp;gt;. Předchozí verze probouzely každý proces, který čekal na notifikaci (bez ohledu na to jestli čekal nebo nečekal na kanálu, který dostal notifikaci). Stará implementace fungovala dobře, pokud počet použitých kanálů byl malý, a tudíž byla i malá šance, že se probudí proces, který čeká na jiném kanálu než je aktuální notifikace. Uživatelé ale začali notifikace používat i jinak, a reportovali výrazné zpomalení pokud větší množství klientů poslouchalo na větším množství různých kanálů. Ve zprávě ke patchi je uvedeno zpomalení (pro 1 klienta 9100 TPS, pro 1000 klientů 200 TPS). Nová implementace ve sdílené paměti ke každému kanálu drží seznam čekajících klientů. V případě zprávy do některého kanálu se probudí pouze procesy, které na tomto kanálu poslouchají (i zde je vidět pokles TPS, ale výrazně menší - pro 1000 klientů 9000 TPS).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Výchozí komprimace TOASTu bude &amp;lt;code&amp;gt;lz4&amp;lt;/code&amp;gt; (namísto &amp;lt;code&amp;gt;pglz&amp;lt;/code&amp;gt;). LZ4 je jako volba už cca 5 let, a měla by být efektivnější (jak v komprimaci, tak ve využití CPU) než původní LZ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Postupně víc funkcí je akcelerováno pomocí SIMD. Nově to jsou funkce &amp;lt;code&amp;gt;hex_encode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hex_decode&amp;lt;/code&amp;gt; a parsování csv, tsv formátů příkazu &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; (hledání speciálních znaků).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Některé extenze, jako např. &amp;lt;code&amp;gt;pgstattuple&amp;lt;/code&amp;gt;, nově používají direct API pro čtení dat (implementované v pg18). Na systémech s rychlým IO by měly běžet rychleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Na základě reportů uživatelů se upravila implementace hashjoinu, tak aby nedocházelo k extrémnímu nárůstu alokace paměti v případech, kdy atribut použitý pro spojení relací obsahuje velké množství &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; hodnot.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V těch případech, kdy je garantováno, že porovnávané hodnoty jsou ne nullové, tak se operátor &amp;lt;code&amp;gt;IS DISTICT FROM&amp;lt;/code&amp;gt; nahradí operátorem &amp;lt;code&amp;gt;&amp;lt;&amp;gt;&amp;lt;/code&amp;gt;, případně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM&amp;lt;/code&amp;gt; operátorem &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;. Tady je otázkou, jaký bude reálný dopad. Jako programátor používám &amp;lt;code&amp;gt;IS [ NOT ] DISTINCT FROM&amp;lt;/code&amp;gt; jedině v těch případech, které komplikují potenciální NULLy. Je ale pravdou, že drtivou většinu SQL, dnes generují ORM frameworky, ktere nemusí mít vždy dostatečnou chytrost. Výraz &amp;lt;code&amp;gt;IS DISTINCT FROM NULL&amp;lt;/code&amp;gt; se nyní transformuje na &amp;lt;code&amp;gt;IS NOT NULL&amp;lt;/code&amp;gt;, obdobně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM NULL&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Replikace&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dlouhodobým cílem implementace logické replikace je podpora multimaster řešení. Zatím je k tomu ještě dlouhá cesta. Chybí podpora replikace DDL příkazů, plná podpora sekvencí, plná podpora řešení replikačních kolizí. Postupuje se v malých krocích. Letos je to podpora jednorázového refrešnutí sekvencí &amp;lt;code&amp;gt;ALTER SUBSCRIPTION ... REFRESH SEQUENCES&amp;lt;/code&amp;gt;. S multimasterem to úplně nepomůže, ale může to zjednodušit upgrade skrze logickou replikaci.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Novým příkazem je příkaz &amp;lt;code&amp;gt;WAIT FOR&amp;lt;/code&amp;gt;, který je možné použít na replikách, a který zajistí čekání na zreplikování zadané transakce. Lze nastavit timeout. Parametrem &amp;lt;code&amp;gt;NO_THROW&amp;lt;/code&amp;gt; zajistí tiché (bez výjimky) ukončení příkazu po timeoutu (změní se pouze vrácená hodnota):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# WAIT FOR LSN &#039;0/306EE20&#039; WITH (TIMEOUT &#039;100ms&#039;, NO_THROW);&lt;br /&gt;
 status&lt;br /&gt;
--------&lt;br /&gt;
 timeout&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V příkazu &amp;lt;code&amp;gt;CREATE PUBLICATION ... FOR ALL TABLES&amp;lt;/code&amp;gt; je nyní možné použít klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE (t1, ...)&amp;lt;/code&amp;gt;. Klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE&amp;lt;/code&amp;gt; lze použít i v příkazu &amp;lt;code&amp;gt;ALTER PUBLICATION&amp;lt;/code&amp;gt;. Pro registraci odběru (&amp;lt;code&amp;gt;CREATE SUBSCRIPTION&amp;lt;/code&amp;gt;) lze místo explicitního connection stringu použít odkaz na dříve definovaný FDW server.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V pohledu &amp;lt;code&amp;gt;pg_replication_slots&amp;lt;/code&amp;gt; je nový sloupec &amp;lt;code&amp;gt;slotsync_skip_reason&amp;lt;/code&amp;gt; popisující důvod, proč nebylo možné synchronizovat repliku. V tom případě bude obsahovat jednu z následujících hodnot: &amp;lt;code&amp;gt;wal_or_rows_removed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wal_not flushed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;no_consistent_snapshot&amp;lt;/code&amp;gt; nebo 	&amp;lt;code&amp;gt;slot_invalidated&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud při registraci odběru nastavíme parametr &amp;lt;code&amp;gt;retain_dead_tuples&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; (výchozí nastavení je &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;), budou se detekovat kolize update-delete, kdy nedojde k update z důvodu smazaného řádku. Pozor, tato volba dočasně blokuje vakuování zrušených řádků (zvlášť pokud je replika nedostupná a nedochází k synchronizaci). Lze nastavit timeout &amp;lt;code&amp;gt;max_retention_duration&amp;lt;/code&amp;gt;, samozřejmě pak ovšem může dojít ke kolizi update-delete. Bez detekce této kolize může dojít k tiché nekonzistenci obsahu napříč různými zdroji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Ostatní&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; podporuje formát &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt; (pouze export).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT JSON&lt;br /&gt;
{&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT (FORMAT JSON, FORCE_ARRAY)&lt;br /&gt;
[&lt;br /&gt;
 {&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nyní také tento příkaz podporuje volbu &amp;lt;code&amp;gt;ON_ERROR SET_NULL&amp;lt;/code&amp;gt;, která způsobí ignorování hodnot, na kterých selže typová konverze. To je možné díky tomu, že se již dříve zavedla podpora tzv měkkých chyb (soft errors). Tyto chyby lze ošetřit s řádově menší režií než běžné chyby (nejsou potřeba subtransakce). Podpora soft errors se v Postgresu objevila s podporou klauzule &amp;lt;code&amp;gt;ON ERROR&amp;lt;/code&amp;gt; SQL/JSON funkcí. V plánu je podpora error safe přetypování (&amp;lt;code&amp;gt;CAST expr AS type xxx DEFAULT expr ON CONVERSION ERROR&amp;lt;/code&amp;gt;). Prvním nezbytným krokem je požadavek, aby konverzní funkce používaly měkké chyby. To teď v upstreamu je, a díky tomu, bylo i relativně jednoduché implementovat &amp;lt;code&amp;gt;COPY ON_ERROR SET_NULL&amp;lt;/code&amp;gt; (error safe casts by měly být v pg20).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, b int);&lt;br /&gt;
&lt;br /&gt;
COPY foo FROM stdin (FORMAT csv, ON_ERROR SET_NULL);&lt;br /&gt;
Enter data to be copied followed by a newline.&lt;br /&gt;
End with a backslash and a period on a line by itself, or an EOF signal.&lt;br /&gt;
&amp;gt;&amp;gt; 10,20&lt;br /&gt;
&amp;gt;&amp;gt; 30,40&lt;br /&gt;
&amp;gt;&amp;gt; ahoj,20&lt;br /&gt;
&amp;gt;&amp;gt; \.&lt;br /&gt;
COPY 3&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM foo;&lt;br /&gt;
┌────┬────┐&lt;br /&gt;
│ a  │ b  │&lt;br /&gt;
╞════╪════╡&lt;br /&gt;
│ 10 │ 20 │&lt;br /&gt;
│ 30 │ 40 │&lt;br /&gt;
│  ∅ │ 20 │&lt;br /&gt;
└────┴────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově také příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; umožňuje číst přímo partišny (partitions). V předchozích verzích bylo nutné použít syntax s vloženým selectem, což má nějakou režii.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce pro zakódování a dekódování textu (&amp;lt;code&amp;gt;encode&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;decode&amp;lt;/code&amp;gt;) nově podporují kódování &amp;lt;code&amp;gt;base64url&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;base32hex&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 41686f6a3c3e2f2b │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base64url&#039;);&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│   encode    │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ QWhvajw-Lys │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base32hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 85K6UQHS7ONIM=== │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dokončit implementaci standardu SQL/JSON, konkrétně implementaci funkce &amp;lt;code&amp;gt;JSON_TABLE&amp;lt;/code&amp;gt; se opět nestihlo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;psql&amp;lt;/code&amp;gt; bude možnost si nastavit zobrazení logických hodnot &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Datový typ &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; akceptuje literály &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Na výstupu se zobrazuje pouze &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
\pset display_true true&lt;br /&gt;
Boolean true display is &amp;quot;true&amp;quot;.&lt;br /&gt;
\pset display_false false&lt;br /&gt;
Boolean false display is &amp;quot;false&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ true     │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT 1 &amp;lt;&amp;gt; 1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ false    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Může se hodit možnost si zobrazit &amp;lt;code&amp;gt;search_path&amp;lt;/code&amp;gt; v promptu. V promptu je také možnost použít symbol &amp;lt;code&amp;gt;%i&amp;lt;/code&amp;gt;, který se nahradí replikačním statusem (&amp;lt;code&amp;gt;primary&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;standby&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;PL/pgSQL&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;PL/pgSQL je relativě stabilizované prostředí, kde je každoročně jen minimum změn. Letos je to jedna malá (a pro většinu uživatelů zanedbatelná změna), a jedna &amp;quot;velká&amp;quot;, která ale interně žádnou změnou není.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou změnou je interní optimalizace exekuce embedded SQL ve tvaru  &amp;lt;code&amp;gt;SELECT výraz INTO proměnná&amp;lt;/code&amp;gt;. Mám pocit, že tento zápis se používal v Sybase a na Sybase navazujících databázích pro inicializaci proměnných. Já jsem se s tímto zápisem setkával v literatuře někdy kolem roku 2000, a už tehdy platilo doporučení tento zápis nepoužívat (v plpgsql se nikdy moc nepoužíval). V posledních letech přišlo víc uživatelů z MSSQL (začalo se migrovat víc aplikací z tohoto serveru), tento zápis používali a zjistili, že tento zápis je cca 20x pomalejší než &amp;quot;nativní&amp;quot; přiřazení &amp;lt;code&amp;gt;proměnna := výraz&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Interně jsou v PL/pgSQL dvě metody jak vyhodnotit výraz. Tzv simple metoda, kde se přeskočí SQL exekutor a přímo zavolá exekutor výrazů, je výrazně rychlejší. Druhou metodou je běžná exekuce skrze SQL exekutor (a SPI API). Až doposud, cokoliv co v zdrojovém kódu funkce bylo SQL příkazem (zde příkazem &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;) se vykonalo běžnou cestou. Nově se detekuje výše zmíněný zápis a vykoná se simple metodou. Pro dlouholeté uživatele Postgresu to nic neznamená, ale lidem, kteří migrují z MSSQL, to může zpříjemnit život.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Druhou, a naopak, velkou změnou je možnost inliningu funkce, která je napsaná v PL/pgSQL (ve speciálních případech). Inlining v kontextu Postgresu je trochu něco jiného než si uživatele představí pod termínem inlining. V Postgresu mohou být funkce volané z nějakého SQL příkazu - typicky příkazu &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;. Pokud nějaká funkce podporuje inlining, tak to znamená, že v AST stromu dotazu se volání funkce nahradí jejím tělem. Teprve pak nastupuje optimalizace, a díky inliningu vlastně optimalizátor vidí dovnitř funkce (jinak je funkce pro optimalizátor black box).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;K tomu, aby PL/pgSQL (nejen v PL/pgSQL) funkce mohla být inlinovaná, potřebujete vlastní kód v Cčkové extenzi. A je to vlastně trik (v tomto případě dost nestydatý podfuk :-)). Už dříve bylo možné napsat extenze, které dodávaly optimalizátoru znalost o vybraných funkcích (jinak, opět, pro optimalizátor, jsou funkce black box). Přímo v jádru je například podpora optimalizátoru pro funkci &amp;lt;code&amp;gt;generate_series&amp;lt;/code&amp;gt; (staré verze pg by v rows měly 1000).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT * FROM generate_series(1,3);&lt;br /&gt;
┌────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                             QUERY PLAN                             │&lt;br /&gt;
╞════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Function Scan on generate_series  (cost=0.00..0.03 rows=3 width=4) │&lt;br /&gt;
└────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Inlining byl dřive podporován pro funkce v jazyku SQL, kdy si planner vytáhl zdrojový kód funkce. V devatenáctce planner může zavolat extenzi, a může si říct nejen o detailnější parametry ohledně exekuce, ale může si říct o substituční SQL. Když ho dostane, tak funkci dále neřeší, a pracuje se substitučním SQL příkazem. Je to docela magie, nicméně efektivní. Kód extenze se volá až v momentu, kdy známe konstantní parametry funkce, a extenze se může rozhodnout - zavolej volanou funkci, nebo zavolej nějaké SQL, zavolej jinou funkci, případně vrať rovnou nějakou speciální hodnotu &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, 0, ... Je to i způsob, jak opravdu efektivně pracovat s dynamickým SQL. Musíte si ovšem napsat kód v Cčkové extenzi. Požadavek na tuto funkcionalitu přišel od vývojářů PostGISu. Cílem jsou optimalizace v PostGISu, dá se to ale použít i jinde. Časem si dovedu představit i nějakou contrib extenzi, která by tuto možnost zpřístupnila i bez nutnosti psát si vlastní extenzi. Škoda, že nemám autoritu vývojářů PostGISu. Dovedl bych si představit podobný trik v analyzátoru. Dost by mi to pomohlo s Orafce. V té pozici samozřejmě nejsem.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Vývoj&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Každoročně dochází k čištění kódu. Občas se zruší podpora některé platformy. Výjimečně se přidá podpora nové platformy nebo jako v případě pg19 se vrátí podpora dříve odstraněné platformy (AIX - operační systém AIX přestal být podporovaný v pg17 díky nezájmu IBM. Pak se ale v IBM chytli za nos, dodali počítač do testovací farmy, a do AIXu přidali aktualizovaný software potřebný k buildu Postgresu). Další čistky v kódu lze provést přechodem na novější verzi programovacího jazyka - přechodem z C99 na C11 (bohužel to může znamenat, že starých platformách se nové verze Postgresu nepřeloží). Interní datový typ &amp;lt;code&amp;gt;Datum&amp;lt;/code&amp;gt; až do předchozí verze byl 4bajtový na 32bitových platformách a 8bajtový na 64bitových platformách. Nově je 8bajtový na všech podporovaných platformách. Určitě nezanedbatelná část kódu se generuje z definičních souborů. Nově se z definic generuje kód definující konfigurační proměnné. Údržba, verzování, zajištění konzistence definičních souborů je násobně jednodušší než údržba adekvátního kódu v Cčku. Dynamická alokace paměti bude jednodušší díky funkcím &amp;lt;code&amp;gt;GetNamedDSA&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;GetNamedDSMSegment&amp;lt;/code&amp;gt;. Dynamicky sdílenou paměť lze sledovat skrze pohled &amp;lt;code&amp;gt;pg_dsm_registry_allocations&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Mám pocit, že vývoj Postgresu ještě víc zrychlil - je vidět mnohem víc patchů od lidí z Asie (dříve to bylo spíš jenom Japonsko), a o to víc se naráží na kapacitu committerů. Je to paradox, který nejde jednoduše řešit. Postgres je populární díky funkcionalitě a stabilitě. Stabilita je díky pečlivé práci commitetterů (důkladně se řeší každý řádek kódu). Díky popularitě je více programátorů, kteří píší více kódu, více patchů, ale committeři nestíhají, a tak patche zůstávají relativně dlouho ve frontě. Což frustruje programátory. Patch napíšete během měsíce, během měsíce se dá udělat finalizace a pár iterací s committerem, ale mezitím několik měsíců (v horším případě let (3 roky i v případě bezproblémového malého patche)), čekáte, až si na vás některý z committerů udělá čas. Celou dobu musíte udržovat patch v aplikovatelném stavu, musíte reagovat na případné diskuze, musíte sledovat vývoj a případně aktualizovat patch. Je to problém o kterém se ví, diskutuje se o něm, ale není úplně jasné, co by mělo být řešení. Minimálně se zlepšila evidence patchů, která pokrývá i automatické testování na několika různých platformách. Tady je velká klika, že Postgres má extenze. Neskutečně velký objem kódu (funkcionality) je dnes možné řešit skrz extenze mimo komunitu - což výrazně snižuje tlak na committery. V extenzích toho jde udělat hodně, bohužel, ne všechno. Na druhou stranu, extenze také nejsou bez rizika. Určitým způsobem zvyšují fragmentaci ekosystému Postgresu, který pak ztrácí přehlednost (plus ne všechny extenze jsou dostupné v cloudu). Zase, díky tomu je jádro Postgresu stále ještě rozumně velké. O Oracle se kolují zvěsti, že jádro má 14 miliónů řádek, Postgres pod 2 milióny. Náklady na údržbu Postgresu jsou výrazně menší. Kompilace zdrojáků je do 5 minut, regresní testy v největším rozsahu běží 15 minut. S tím ještě lze nějak rozumně pracovat. O Oracle jsem slyšel, že regresní testy běží den.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Popularita Postgresu jde aktuálně až do absurdna. Z Linkedinu mám pocit, že začíná být přepostgresováno (samozřejmě z mé perspektivy a v mé bublině). Hromada příspěvků vygenerovaných AI jsou banality na úrovni žáka prvního stupně (Postgres má VACUUM, indexy jsou super, dotazy mohou být pomalé, atd atd). Doporučení typu - proč ne Redis, proč ne Elastic, na všechno použijte Postgres. Viděl jsem hromadu clickbaitových článků typu - multigenerační architektura Postgresu je tragická, ale s naší AI nebo s naším supportem nebudete mít problém, atd atd. Postgresu dnes rozumí každý, kdo dokáže do AI napsat Postgres. Měl jsem tu možnost vidět naprosto neadekvátní doporučení ohledně konfigurace (dnes nevíte jestli důvodem je neznalost autora nebo naopak jeho vychytralost a snaha o co nejvíc komentářů případně o troling). Historicky popularita Postgresu rostla ve stínu MySQL, Monga a dalších databází a roky byl Postgres ušetřený mediálního balastu. To bohužel už není pravda. Pořád platí, že Postgres je dobrá databáze, stabilní, relativně rychlá, která se ale rozhodně nehodí na vše. Má svoje limity, které je dobré znát, a rozhodně nemůže ve všech ohledech (ve větším rozsahu) nahradit Redis, MySQL nebo Mongo případně Kafku. To je nesmysl, a není to ani cílem komunity. Základem jakékoliv práce je znát limity, chování, a správně v souladu s celkem, používat správné nástroje.&amp;lt;/p&amp;gt;&lt;br /&gt;
----------&lt;br /&gt;
&amp;lt;DPL&amp;gt;category=Verze PostgreSQL&amp;lt;/DPL&amp;gt;&lt;br /&gt;
[[Category:Články]]&lt;br /&gt;
[[Category:Verze PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1584</id>
		<title>PostgreSQL 19 (2026)</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1584"/>
		<updated>2026-05-10T03:14:51Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;i&amp;gt;Autor: Pavel Stěhule&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;O předchozích verzích jsem napsal, že změny byly primárně interní. Z pohledu uživatele, který chce vidět novou SQL syntax, se toho v posledních verzích moc nestalo. Devatenáctka je jiná. Tam je viditelných změn opravdu hodně. Jako každý rok - nová verze je pelmel nových funkcí a různých vylepšení menších nebo větších.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Administrace&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;p&amp;gt;Bloating tabulek může být problém. Skoro všude jsem se setkal se situací, kdy &amp;quot;mazací&amp;quot; skript přestal fungovat (z různých důvodů), přičemž se tato chyba detekovala příliš pozdě, kdy dotčené tabulky měly místo jednotek GB například desítky GB. To už musí zaúřadovat &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, což často znamená vynucenou plánovanou odstávku (kvůli držení exkluzivního zámku). Je to letitý problém, který zkušenější uživatelé řešili buďto pečlivějším monitoringem, v některých případech partišningem (partitioning), případně extenzemi &amp;lt;code&amp;gt;pg_repack&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt;. Autor posledně jmenované extenze Tonda (Antonín Houska) spolu s Alvarem (Alvaro Herrera) poslední dva roky pracovali na integraci &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt; do jádra Postgresu. Paradoxně příkaz, který bude provádět zdrcnutí tabulek, se bude jmenovat &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt;. Základem je logická replikace - zadaná tabulka se lokálně zreplikuje (vytvoří se její nová kopie, a tím se zbaví vnitřního neobsazeného místa). Co je zásadní, je možnost použít volbu &amp;lt;code&amp;gt;CONCURRENTLY&amp;lt;/code&amp;gt;. S touto volbou příkaz nepoužije exkluzivní zámek. Tudíž je možné jej použít za provozu. Nutnou podmínkou je existence primárního klíče (a unikátního indexu).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
REPACK (CONCURRENTLY, VERBOSE) obce;&lt;br /&gt;
INFO:  repacking &amp;quot;public.obce&amp;quot; in physical order&lt;br /&gt;
INFO:  &amp;quot;public.obce&amp;quot;: found 0 removable, 6250 nonremovable row versions in 59 pages&lt;br /&gt;
DETAIL:  0 dead row versions cannot be removed yet.&lt;br /&gt;
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.&lt;br /&gt;
REPACK&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kromě toho, že příkaz &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt; nahrazuje příkaz &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, tak tento příkaz ještě nahrazuje příkaz &amp;lt;code&amp;gt;CLUSTER&amp;lt;/code&amp;gt;, kterým se tabulka fyzicky (jednorázově) přeuspořádá podle zadaného indexu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Možná jste si všimli, že dotaz běžící pod příkazem &amp;lt;code&amp;gt;EXPLAIN ANALYZE&amp;lt;/code&amp;gt; je výrazně pomalejší. Důvodem je měření času - executor, v tomto režimu, neustále poptává aktuální čas, a to má brutální režii. U větších dotazů se vyplatí použít volbu &amp;lt;code&amp;gt;TIMING OFF&amp;lt;/code&amp;gt;. V 19 na x86 se místo systémového času použíjí takty CPU. Je to výrazně rychlejší - zatímco na osmnáctce mi jednoduchý testovací dotaz běžel 2.5x pomalejší v explainu, na devatenáctce pouze 1.5x pomaleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou velkou změnou je vypnutí JIT ve výchozí konfiguraci. JIT se objevil v Postgresu 11, a v Postgresu 12 byl zapnutý ve výchozí konfiguraci. Bohužel se zjistilo, že většině uživatelů, kteří Postgres používají pro OLTP, dělá víc škody než užitku. Došlo to až do stavu, kdy se uživatelům doporučovalo, neoficiálně, po instalaci JIT vypnout. Je tam víc problémů. &amp;lt;code&amp;gt;clang&amp;lt;/code&amp;gt;, na kterém je to postavené, v novějších verzích kompiluje lépe, ale pomaleji. Existují alternativní implementace JIT, ale všechny jsou více než méně experimentální. Druhým problémem je model, na jehož základě se JIT aktivuje. Tento model jednak nedokáže dobře odhadnout náročnost &amp;quot;jitifikace - inliningu, a navíc je citlivý na přestřelení odhadu počtu řádek. Ohledně modelu a citlivosti na odhady pochybuji, že se dá něco dělat. Alternativní implementace JIT mají výrazně nižší režii. Přijde mi to ale jako slepá cesta. Budoucnost vidím v integraci vektorového executoru a vektorových funkcí (tak jak to používá [https://duckdb.org/ DuckDB]). Může to znamenat, že Postgres bude mít duální implementace funkcí (pro skalární parametr, a pro vektor parametrů).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze vytvořit replikační slot pro logickou replikaci, bez nutnosti mít konfiguraci &amp;lt;code&amp;gt;wal_level=logical&amp;lt;/code&amp;gt;. Postačuje nastavení &amp;lt;code&amp;gt;replica&amp;lt;/code&amp;gt;, což je výchozí nastavení. Jakmile je logický replikační slot aktivní, interně se úroveň zápisu do transakčního logu nastaví na &amp;lt;code&amp;gt;logical&amp;lt;/code&amp;gt;. Jaký je aktuální stav zjistíte v konfigurační proměnné &amp;lt;code&amp;gt;effective_wal_level&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Další bombou je možnost zapínat nebo vypínat kontrolní součty (na úrovni datových stránek) za běhu. Kontrolní součty jsou v Postgresu už relativně dlouho, a ačkoliv na dnešním hardware je jejich režie zanedbatelná, tak určitě bude dost databází, kde nebudou zapnuté. Zapnutí kontrolních součtů vyžadovalo odstávku úměrnou velikosti databáze. Navíc se silně doporučuje po zapnutí součtů znovu zreplikovat všechny fyzické repliky. Výhodou je diagnostika, možnost identifikovat poškozené stránky (a přeskočit je), možnost vyrobit replikovaný server ze starého primárního příkazem &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt;. Naplánovat a provést delší odstávku někde nemusí být jednoduché (nebo to může být skoro nemožné). U jednoho mého klienta zapnutí kontrolních součtů na cca 2TB databázi trvalo cca 2 hodiny (na vlastním hardware z roku 2025). Zapnutí se provede voláním funkce &amp;lt;code&amp;gt;pg_enable_data_checksums&amp;lt;/code&amp;gt;. Nastavením volitelných parametrů lze běh funkce zpomalit, tak aby nepřetěžovala IO. Vypnutí provede funkce &amp;lt;code&amp;gt;pg_disable_data_checksums&amp;lt;/code&amp;gt;. Stav procesu můžeme vidět v pohledu &amp;lt;code&amp;gt;pg_stat_progress_data_checksums&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Snad se už konečně vyřešil problém s upgradem databází obsahující extrémně velký počet LO (large objects). Nově binární upgrade (&amp;lt;code&amp;gt;pg_upgrade&amp;lt;/code&amp;gt;) použije pro export metadat LO příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; místo původní sekvence příkazů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- původní sekvence&lt;br /&gt;
SELECT pg_catalog.lo_create(&#039;5432&#039;);&lt;br /&gt;
ALTER LARGE OBJECT 5432 OWNER TO alice;&lt;br /&gt;
GRANT SELECT ON LARGE OBJECT 5432 TO bob;&lt;br /&gt;
&lt;br /&gt;
-- nově&lt;br /&gt;
COPY pg_catalog.pg_largeobject_metadata (oid, lomowner, lomacl) FROM stdin;&lt;br /&gt;
5432 16384 {alice=rw/alice,bob=r/alice}&lt;br /&gt;
\.&lt;br /&gt;
&lt;br /&gt;
COPY pg_catalog.pg_shdepend (dbid, classid, objid, objsubid, refclassid, refobjid, deptype) FROM stdin;&lt;br /&gt;
5 2613 5432 0 1260 16384 o&lt;br /&gt;
5 2613 5432 0 1260 16385 a&lt;br /&gt;
\.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nová implementace by měla být řádově rychlejší.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konečně se dotáhlo do konce začlenění podpory více formátů v příkazu &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Postgres má dva základní příkazy pro export (backup) - &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Historicky tyto příkazy podporovaly pouze &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; formát. Postupem času &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; získal možnost exportu do &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;dictionary&amp;lt;/code&amp;gt; formátu plus import příkazem &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umožňoval paralelní import více tabulek. &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; byl díky podpoře pouze SQL formátu dost omezený. To se nyní změnilo, a v &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; jsou podporovány všechny formáty, které podporuje &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt;. Vypadá to trochu jako workaround. V případě, že se použije jiný než &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; (SQL) formát, tak se vyrobí adresář, který do podadresářů uloží výstup z &amp;lt;code&amp;gt;pg_dumpu&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umí s touto adresářovou strukturou pracovat. Tato možnost se dostala už do 18tky, ale byla na poslední chvíli stažena.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt; zredukovalo kopírování WAL logů z nového primárního serveru na budovanou repliku a to tak, že se budou kopírovat pouze WAL logy vzniklé po rozpadu replikace. V mnoha scénářích se tím výrazně urychlí běh tohoto příkazu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Doposud autovacuum vybíralo tabulky k vakuování na základě porovnání vypočítaných koeficientů a prahových hodnot. Pořadí vybraných tabulek záleželo na fyzickém pořadí v systémové tabulce &amp;lt;code&amp;gt;pg_class&amp;lt;/code&amp;gt;. Nově se vakuum bude prioritizovat podle míry vzdálenosti od prahu. Dalším kritériem je stáří tabulky (počet transakcí od freeze). Stará implementace byla férová v tom, že garantovala, že každá tabulka bude zvakuovaná a že žádná tabulka nebude &amp;quot;předbíhat&amp;quot; ve frontě. Na druhou stranu se mohlo stát, že tabulka s intenzivnějším provozem čekala příliš dlouho a došlo k zbytečnému bloatingu. Nová implementace se snaží být chytřejší. Uvidíme, jak to bude fungovat. Moje zkušenost je taková, že a) není dobré dávat do Postgresu příliš dynamická data, b) je dobré si nastavit počet aktivních autovacuum workerů tak, aby byla určitá rezerva, c) není dobré vytěžovat IO na maximum (je dobré mít dostatečně nadimenzované IO a mít nějakou rezervu). Skóre tabulek můžeme sledovat v pohledu &amp;lt;code&amp;gt;pg_stat_autovacuum_score&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_autovacuum_scores WHERE score &amp;gt; 0.05;&lt;br /&gt;
┌─[ RECORD 1 ]────────┬──────────────────────┐&lt;br /&gt;
│ relid               │ 1262                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_database          │&lt;br /&gt;
│ score               │ 0.15936254737880529  │&lt;br /&gt;
│ xid_score           │ 1e-07                │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0.0793650769622719   │&lt;br /&gt;
│ vacuum_insert_score │ 0.003998400542165933 │&lt;br /&gt;
│ analyze_score       │ 0.15936254737880529  │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
╞═[ RECORD 2 ]════════╪══════════════════════╡&lt;br /&gt;
│ relid               │ 1214                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_shdepend          │&lt;br /&gt;
│ score               │ 0.12                 │&lt;br /&gt;
│ xid_score           │ 1.15e-07             │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0                    │&lt;br /&gt;
│ vacuum_insert_score │ 0.006                │&lt;br /&gt;
│ analyze_score       │ 0.12                 │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
└─────────────────────┴──────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově autovacuum může použít &amp;lt;code&amp;gt;VACUUM&amp;lt;/code&amp;gt; s podporou paralelismu.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přehled o aktuálním stavu recovery je k dispozici v pohledu &amp;lt;code&amp;gt;pg_stat_recovery&amp;lt;/code&amp;gt;. V pohledu &amp;lt;code&amp;gt;pg_stat_statements&amp;lt;/code&amp;gt; jsou dva nové sloupce &amp;lt;code&amp;gt;generic_plan_calls&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;custom_plan_calls&amp;lt;/code&amp;gt; zobrazující kolikrát předpřipravený příkaz (prepared statement) použil generický nebo zákaznický plán. Nový sloupec &amp;lt;code&amp;gt;wal_fpi_bytes&amp;lt;/code&amp;gt; zobrazuje velikost zápisu tzv. plných stránek do transakčního logu. Vysoká hodnota může signalizovat nepříjemně velkou četnost vynucených checkpointů (je nutné zvednout &amp;lt;code&amp;gt;max_wal_size&amp;lt;/code&amp;gt; případně &amp;lt;code&amp;gt;checkpoint_timeout&amp;lt;/code&amp;gt;). V novém pohledu &amp;lt;code&amp;gt;pg_stat_lock&amp;lt;/code&amp;gt; uvidíme počet a celkový čas čekání na různé typy zámků. Zaznamenány jsou pouze ty situace, kdy se čeká na zámek déle než jednu sekundu (stejně jako např. &amp;lt;code&amp;gt;log_lock_waits&amp;lt;/code&amp;gt;, které je v nyní ve výchozí konfiguraci zapnuté). Bohužel zámky, které trvají cca 100ms, mající nepříjemný dopad na dotazy kolem 10ms, zde neuvidíme:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_lock ;&lt;br /&gt;
┌──────────────────┬───────┬───────────┬───────────────────┬───────────────────────────────┐&lt;br /&gt;
│     locktype     │ waits │ wait_time │ fastpath_exceeded │          stats_reset          │&lt;br /&gt;
╞══════════════════╪═══════╪═══════════╪═══════════════════╪═══════════════════════════════╡&lt;br /&gt;
│ relation         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ extend           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ frozenid         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ page             │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ tuple            │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ transactionid    │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ virtualxid       │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ spectoken        │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ object           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ userlock         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ advisory         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ applytransaction │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
└──────────────────┴───────┴───────────┴───────────────────┴───────────────────────────────┘&lt;br /&gt;
(12 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze Postgres podporuje asynchronní IO. Čtení je realizováno dedikovanými procesy (workers). Počáteční implementace pracovala s konfigurovatelným počtem těchto procesů (výchozí nastavení mělo hodnotu 3). Nově je správa workerů dynamičtější - v případě potřeby si je Postgres nastartuje nebo naopak zavře. Místo fixního počtu nyní nastavujeme minimální a maximální počet workerů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io_min_workers=2&lt;br /&gt;
io_max_workers=8 (up to 32)&lt;br /&gt;
io_worker_idle_timeout=60s&lt;br /&gt;
io_worker_launch_interval=100ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Poměrně razantně se změnila konfigurace &amp;lt;code&amp;gt;log_min_messages&amp;lt;/code&amp;gt;, která udává, na které úrovni se mají chyby zapsat do systémového logu (&amp;lt;code&amp;gt;DEBUG5&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;PANIC&amp;lt;/code&amp;gt;). Nově lze tuto úroveň nastavit pro každý typ procesu (&amp;lt;code&amp;gt;archiver&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;autovacuum&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bgworker&amp;lt;/code&amp;gt;, ...) např. &amp;lt;code&amp;gt;error, walsender:debug1, autovacuum:debug1&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Správa partišen (partitions) byla v Postgresu základní. Díky možnosti sloučit nebo rozdělit partišny (partitions) se dostává trochu dál. Je to spíš první krok se spoustou omezení - používá se pouze jedno CPU a po celou dobu je exkluzivně zamknutá rodičovská tabulka. Ale i tak to může dost uživatelům ušetřit práci (a jejich vlastní řešení by pravděpodobně mělo stejná omezení):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_east, sales_central)  INTO sales_all;&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE measurement SPLIT PARTITION measurement_y2006q1 INTO&lt;br /&gt;
   (PARTITION measurement_y2006m01 FOR VALUES FROM (&#039;2006-01-01&#039;) TO (&#039;2006-02-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m02 FOR VALUES FROM (&#039;2006-02-01&#039;) TO (&#039;2006-03-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m03 FOR VALUES FROM (&#039;2006-03-01&#039;) TO (&#039;2006-04-01&#039;));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Oproti předchozím verzím lze zapínat a vypínat všechny typy omezení (nejen cizí klíče):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, CONSTRAINT cc CHECK(a &amp;gt; 0) NOT ENFORCED); &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
INSERT INTO foo VALUES(1);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ERROR:  check constraint &amp;quot;cc&amp;quot; of relation &amp;quot;foo&amp;quot; is violated by some row&lt;br /&gt;
DELETE FROM foo WHERE a = 0;&lt;br /&gt;
DELETE 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
ERROR:  new row for relation &amp;quot;foo&amp;quot; violates check constraint &amp;quot;cc&amp;quot;&lt;br /&gt;
DETAIL:  Failing row contains (0).&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc NOT ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
pg_plan_advice&lt;br /&gt;
----&lt;br /&gt;
&amp;lt;p&amp;gt;Až doposud uživatelé Postgresu neměli moc možností, jak ovlivnit generování prováděcích plánů. Hinty ve stylu Oracle byly a jsou z historických důvodů tabu (jsou implementovány extenzí [https://github.com/ossc-db/pg_hint_plan pg_hint_plan]). Uživatel měl pouze možnost penalizace metod executoru - např. &amp;lt;code&amp;gt;enable_nestloop&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;enable_indexscan&amp;lt;/code&amp;gt; nastavením na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Tato penalizace je ale dost hrubá, a neumožňuje jemné ovlivnění plánovače. Přesto se používala a používá. Rober Haas napsal dvě extenze [https://www.postgresql.org/docs/devel/pgplanadvice.html &amp;lt;code&amp;gt;pg_plan_advice&amp;lt;/code&amp;gt;] a [https://www.postgresql.org/docs/devel/pgstashadvice.html &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;]. Prvně zmíněná extenze umožňuje definovat jakási doporučení, která by měl planner respektovat. Pro každý plán lze zpětně dogenerovat tato doporučení:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce&lt;br /&gt;
  ORDER BY pocet_muzu + pocet_zen DESC&lt;br /&gt;
  LIMIT 10;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Limit  (cost=272.19..272.21 rows=10 width=45)                        │&lt;br /&gt;
│   -&amp;gt;  Sort  (cost=272.19..287.81 rows=6250 width=45)                 │&lt;br /&gt;
│         Sort Key: ((pocet_muzu + pocet_zen)) DESC                    │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on obce  (cost=0.00..137.12 rows=6250 width=45) │&lt;br /&gt;
│ Generated Plan Advice:                                               │&lt;br /&gt;
│   SEQ_SCAN(obce)                                                     │&lt;br /&gt;
│   NO_GATHER(obce)                                                    │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                      QUERY PLAN                                      │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Nested Loop  (cost=0.28..12.56 rows=81 width=58)                                     │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17)                          │&lt;br /&gt;
│         Filter: (nazev = &#039;Beroun&#039;::text)                                             │&lt;br /&gt;
│   -&amp;gt;  Index Scan using obce_okres_id_idx on obce  (cost=0.28..9.79 rows=81 width=41) │&lt;br /&gt;
│         Index Cond: ((okres_id)::text = okresy.id)                                   │&lt;br /&gt;
│ Generated Plan Advice:                                                               │&lt;br /&gt;
│   JOIN_ORDER(okresy obce)                                                            │&lt;br /&gt;
│   NESTED_LOOP_PLAIN(obce)                                                            │&lt;br /&gt;
│   SEQ_SCAN(okresy)                                                                   │&lt;br /&gt;
│   INDEX_SCAN(obce public.obce_okres_id_idx)                                          │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                                             │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(11 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Prostřednictvím konfigurační proměnné &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; můžeme ovlivnit chování planneru vlastními doporučeními:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET pg_plan_advice.advice to &#039;JOIN_ORDER(obce okresy)&#039;;&lt;br /&gt;
SET&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌───────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                            QUERY PLAN                             │&lt;br /&gt;
╞═══════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Join  (cost=1.97..140.78 rows=81 width=58)                   │&lt;br /&gt;
│   Hash Cond: ((obce.okres_id)::text = okresy.id)                  │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on obce  (cost=0.00..121.50 rows=6250 width=41)    │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=1.96..1.96 rows=1 width=17)                     │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17) │&lt;br /&gt;
│               Filter: (nazev = &#039;Beroun&#039;::text)                    │&lt;br /&gt;
│ Supplied Plan Advice:                                             │&lt;br /&gt;
│   JOIN_ORDER(obce okresy) /* matched */                           │&lt;br /&gt;
│ Generated Plan Advice:                                            │&lt;br /&gt;
│   JOIN_ORDER(obce okresy)                                         │&lt;br /&gt;
│   HASH_JOIN(okresy)                                               │&lt;br /&gt;
│   SEQ_SCAN(obce okresy)                                           │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                          │&lt;br /&gt;
└───────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(13 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konfigurace planneru prostřednictvím &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; nestačí, pokud potřebujeme ovlivnit plán dotazu z aplikace, u které nemůžeme nebo nechceme měnit zdrojový kód. A proto je tu druhá zmíněná extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;, která umožňuje naše &amp;quot;doporučení&amp;quot; uložit a pak automaticky aplikovat na základě tzv &amp;lt;code&amp;gt;queryid&amp;lt;/code&amp;gt;. Doporučení jsou uložena v pojmenovaných skladech (stashes). Skrze konfigurační proměnnou &amp;lt;code&amp;gt;pg_stash_advice.stash_name&amp;lt;/code&amp;gt; volíme aktivní sklad. Každý uživatel, každá databáze může mít svůj vlastní. Pokud proměnná není nastavená, tak je extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt; neaktivní. Uložené nápovědy jsou perzistentní - při vypnutí serveru se uloží, po startu znovu načtou do paměti.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;SQL&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; je syntaxe, kterou postres přejímá z analytických databází (zde to snad byla [https://duckdb.org/2022/05/04/friendlier-sql#group-by-all DuckDB]). Pokud se použije tento zápis, tak se automaticky agreguje podle všech sloupců, které nejsou v agregační funkci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT sum(pocet_zen + pocet_muzu), okresy.id, okresy.nazev &lt;br /&gt;
  FROM obce join okresy ON obce.okres_id = okresy.id&lt;br /&gt;
 GROUP BY ALL;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tento zápis může ušetřit dost psaní, může to být také &amp;quot;tichý&amp;quot; zabiják výkonu. Čím více atributů je v klauzuli &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;, tím je agregace pomalejší. Zápis &amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; ještě není ve standardu, ale je standardizační komisí akceptován, a měl by být v některé další verzi ANSI/SQL.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Počínaje Postgresem 19 už nebude možnost používat backlash jako escape symbol v řetězcích. Před 15 roky se přešlo na standardní chování (předtím se řetězce v Postgresu chovali stejně jako v Cčku), nicméně nestandardní chování bylo možné vynutit nastavením &amp;lt;code&amp;gt;standard_conforming_strings&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Mezi top vývojáři Postgresu je hodně velká averze k tzv kompatibility flagům (zmíněný flag nebyl výjimkou) (pozn. u komerčních databází jsou naopak kompatibility flagu standardem, a nejen u nich - např. MySQL). Nyní je tato možnost zrušena, a Cčkové stringy dostaneme pouze jen zápisem (jako tzv extended strings):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;ahoj\nsvete&#039;;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│  ?column?   │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ ahoj\nsvete │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT e&#039;Ahoj\nSvete&#039;;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ Ahoj    ↵│&lt;br /&gt;
│ Svete    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze v u window funkcí &amp;lt;code&amp;gt;lead&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lag&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;first_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last_value&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;nth_value&amp;lt;/code&amp;gt; použít klauzuli &amp;lt;code&amp;gt;IGNORE NULLS&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;. Výchozí chování, které bylo implementováno již dříve odpovídá klauzuli &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;SQL/PGQ&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;V tomto případě PG není častým prefixem symbolizujícím Postgres (a Q jako queue), ale Property Graph Queries. Počínaje podporou neatomických datových typů v SQL:2000, přes podporu XML v SQL:2003 se standard rozšířil nad rámec čistě relačních databází (stejně ale už dříve existovala kritika SQL z pohledu čistoty od relačních dogmatiků). Standard SQL:2023 (ISO/IEC 9075-16:2023) SQL rozšiřuje o podporu grafových databází, které mají svůj vlastní datový model odlišný od relačního modelu. Přijde mi to jako dost odvážný krok (a ještě teď tomu nemohu úplně uvěřit). Zatím existovala zřetelná jednota mezi SQL a relačním modelem. Od nové části standardu se očekává, že pomůže s přehlednějším zápisem určitých dotazů, které se až doposud řešily pomocí rekurze. Přiznám se, že zápis dotazu v PGQ (využívajícího ascii art) mi přijde hodně cizí (možná zažívám pocity programátora v Cobolu, když se poprvé podíval na SQL. Osobně mi to nesedí - reprezentaci znalostí ve formátu grafu jsem nikdy nemusel (vím, že je to jen jiná reprezentace téhož)). Row pattern recognition z roku SQL:2016 toho také nemá s relačními databázemi moc společného, takže to takové překvapení není. Práce na této části standardu začaly v roce 2017 (a integrovaly se prvky jazyka [https://neo4j.com/docs/cypher-manual/current/introduction/cypher-overview/ Cypher] (Neo4j) a [https://docs.oracle.com/en/database/oracle/property-graph/20.4/spgdg/property-graph-query-language-pgql.html#GUID-301FF092-1A07-43D2-91E5-0C5AFF3467CC PGQL] (Oracle)).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Základem grafových databází je graf skládající se z uzlů a hran. Ka každému uzlu i hraně mohou být přiřazeny atributy (properties). Hrany mohou být orientované i neorientované. Standard pro takové grafy používá termín Property Graphs. Graf se definuje příkazem &amp;lt;code&amp;gt;CREATE PROPERTY GRAPH&amp;lt;/code&amp;gt; a je to určitá forma pohledu. Přesto, že jsem zkoušel poměrně triviální příklad, nebylo pro mne intuitivní napsat SQL/PGQ dotaz. Pro uživatele bez zkušenosti s Neo4j nebo jinou grafovou databází budou začátky s SQL/PGQ dost bolestivé. V tuto chvíli (duben 2026) ještě není hotová dokumentace. Je možné, že se díky integraci SQL/PGQ do Postgresu setkám s grafovými databázemi častěji (SQL/PGQ je podporováno v DuckDB a v Oracle):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE public.uzivatele (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  jmeno character varying&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE public.zpravy (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  odesilatel integer,&lt;br /&gt;
  prijemce integer,&lt;br /&gt;
  tema text&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- uzivatel - odeslal -&amp;gt; uzivatel&lt;br /&gt;
CREATE PROPERTY GRAPH public.pg1&lt;br /&gt;
  VERTEX TABLES (&lt;br /&gt;
    public.uzivatele AS uzivatel KEY (id) PROPERTIES (id, jmeno)&lt;br /&gt;
  )&lt;br /&gt;
  EDGE TABLES (&lt;br /&gt;
    public.zpravy AS odeslal KEY (id)&lt;br /&gt;
    SOURCE KEY (odesilatel) REFERENCES uzivatel (id)&lt;br /&gt;
    DESTINATION KEY (prijemce) REFERENCES uzivatel (id)&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (1, &#039;Pavel&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (2, &#039;Zdenek&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (3, &#039;Tomas&#039;);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.zpravy VALUES (1, 1, 2, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (2, 2, 1, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (3, 1, 3, &#039;dotaz ohledne dopravy&#039;);&lt;br /&gt;
&lt;br /&gt;
-- od koho uzivatel Pavel dostal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) &amp;lt;-[IS odeslal]- (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
└────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- komu uzivatel Pavel poslal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) -[IS odeslal]-&amp;gt; (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
│ Tomas  │&lt;br /&gt;
└────────┘&lt;br /&gt;
(2 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Osobně si nedovedu představit, že bych psal dotazy v SQL/PGQ (myslím, že podobně na tom bude většina uživatelů podobně). Je otázkou, jestli se SQL/PGQ neuplatní ve spolupráci s AI. V tomto případě se běžný dotaz rozpadá do dvou kroků. Navíc i joinovací podmínka získává label, takže je to v určitém smyslu více popisné, než běžné SQL, a je tak možné, že tento zápis bude AI více sedět.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pomalu se pokračuje na implementaci tzv temporálních tabulek. Letos je to podpora klauzule &amp;lt;code&amp;gt;FOR PORTION OF valid_at FROM TO&amp;lt;/code&amp;gt;. Zjednodušeně, pokud máme temporální databáze nebo temporální tabulky, tak se můžeme podívat na stav dat v nějakém čase. Pokud se použije klauzule &amp;lt;code&amp;gt;FOR PORTION OF FROM TO&amp;lt;/code&amp;gt;, tak se jedná o tzv temporální &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- je nutne mit nainstalovanou extenzi btree_gist&lt;br /&gt;
CREATE TABLE ceny(&lt;br /&gt;
  id int,&lt;br /&gt;
  valid_at daterange,&lt;br /&gt;
  nazev text,&lt;br /&gt;
  cena int,&lt;br /&gt;
  PRIMARY KEY (id, valid_at WITHOUT OVERLAPS)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
-- jednotna cena mezi 2020-01-01 a 2025-12-31&lt;br /&gt;
INSERT INTO ceny VALUES(1, &#039;[2020-01-01,2026-01-01)&#039;, &#039;pecivo&#039;, 20);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- uprava ceny mezi 2021-01-01 a 2021-02-28&lt;br /&gt;
UPDATE ceny&lt;br /&gt;
   FOR PORTION OF valid_at FROM &#039;2021-01-01&#039; TO &#039;2021-03-01&#039;&lt;br /&gt;
   SET cena = 30&lt;br /&gt;
 WHERE id = 1;&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny ORDER BY valid_at;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2021-01-01) │ pecivo │   20 │&lt;br /&gt;
│  1 │ [2021-01-01,2021-03-01) │ pecivo │   30 │&lt;br /&gt;
│  1 │ [2021-03-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Nové datové typy a funkce&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;V Postgresu se můžete setkat s datovými typy s prefixem &amp;lt;code&amp;gt;reg&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;regrole&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regproc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regclass&amp;lt;/code&amp;gt;. Tyto datové typy jsou vždy spojeny s jednou konkrétní systémovou tabulkou a hodnoty těchto typů vždy nesou unikátní číselný identifikátor databázového objektu. Tyto typy podporují přetypování z textu, což se používá pro zkrácený zápis vyhledávání nějakého databázového objektu v katalogu. Nově můžeme používat typ &amp;lt;code&amp;gt;regdatabase&amp;lt;/code&amp;gt; a tento typ se odkazuje, jak je patrné z názvu, na tabulku &amp;lt;code&amp;gt;pg_database&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ regdatabase │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ template1   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase::oid;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT oid&lt;br /&gt;
 FROM pg_database &lt;br /&gt;
 WHERE datname = &#039;template1&#039;;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Díky těmto typům jsou dotazy nad systémovým katalogem kratší a čitelnější. Navíc autor dotazů nemusí brát v potaz některé detaily (jako například case sensitivitu), kde se chování SQL identifikátorů liší od SQL stringů. To je ošetřeno interně při přetypování.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce &amp;lt;code&amp;gt;error_on_null&amp;lt;/code&amp;gt; vyhodí výjimku, pokud je parametr NULL. Jinak vrátí hodnotu parametru. Implementace je extrémně jednoduchá - sleduje flag &amp;lt;code&amp;gt;isnull&amp;lt;/code&amp;gt;. Každý parametr každé SQL funkce má tento flag. Stejné chování má flag funkce &amp;lt;code&amp;gt;STRICT&amp;lt;/code&amp;gt;. Je tu drobná zrada. V případě kompozitních typů to není kompatibilní s operátorem &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;. Kompozitní hodnota obsahující pouze &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;y je interně ne nullová, ale operátor &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt; pro takovou kompozitní hodnotu vrátí &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT ROW(NULL, NULL) IS NULL;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT error_on_null(NULL::integer);&lt;br /&gt;
ERROR:  null value not allowed&lt;br /&gt;
SELECT error_on_null(ROW(NULL, NULL));&lt;br /&gt;
┌───────────────┐&lt;br /&gt;
│ error_on_null │&lt;br /&gt;
╞═══════════════╡&lt;br /&gt;
│ (,)           │&lt;br /&gt;
└───────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Roky se v Postgresu mluví o tom, že by měl existovat snadný způsob, jak zpětně z databázového objektu vygenerovat DDL příkaz. Osobně jsem nikdy tuhle potřebu neměl, ale do jisté míry této potřebě rozumím. Skoro v každém admin nástroji můžete iterovat přes databázové objekty a k nim si nechat zobrazit DDL. A skoro každý admin tool, pak tuto funkcionalitu duplicitně implementuje - s chybami nebo bez chyb. Je to kód, který vyžaduje neustálou údržbu a aktualizace. Po letech diskuzí se je v upstreamu první část funkcí &amp;lt;code&amp;gt;pg_get_...ddl&amp;lt;/code&amp;gt; (aktuálně &amp;lt;code&amp;gt;pg_get_database_ddl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pg_get_role_ddl&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_get_tablespace_ddl&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT pg_get_role_ddl(&#039;pavel&#039;);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                       pg_get_role_ddl                                        │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ CREATE ROLE pavel SUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS; │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze je v postgresu funkce generující náhodné číslo v zadaném rozsahu. K nim nyní přibyly funkce pro rozsah typů &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;timestamptz&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SELECT random(current_date - 6, current_date);&lt;br /&gt;
┌────────────┐&lt;br /&gt;
│   random   │&lt;br /&gt;
╞════════════╡&lt;br /&gt;
│ 2026-04-13 │&lt;br /&gt;
└────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT random(current_timestamp - interval &#039;1 week&#039;, current_timestamp);&lt;br /&gt;
┌───────────────────────────────┐&lt;br /&gt;
│            random             │&lt;br /&gt;
╞═══════════════════════════════╡&lt;br /&gt;
│ 2026-04-09 02:30:30.665819+02 │&lt;br /&gt;
└───────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Optimalizace&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Jako nejdůležitější optimalizaci v nové verzi vidím optimalizaci implementace kontroly referenční integrity. RI je v postgresu realizována v systémových řádkových triggerech, které, až doposud, provedly (pro každý řádek) jeden kontrolní SQL příkaz (s použitím SPI API - stejné API, které se používá např. v PL/pgSQL). Nově se hledá přímo v indexech - přeskakuje se celý aparát SQL. To je první výrazná optimalizace. Druhou výraznou optimalizací je hledání nikoliv jedné hodnoty, ale pole hodnot (n = 64). Podle autora patche je nyní kontrola referenční integrity cca 3x rychlejší. Pořád to bude znát. Výrazně se ale posune hranice, od kdy se vyplatí při masivních importech kontrolu referenční integrity vypínat.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE tab_a(id int PRIMARY KEY);&lt;br /&gt;
INSERT INTO tab_a SELECT generate_series(1,1000);&lt;br /&gt;
VACUUM ANALYZE tab_a;&lt;br /&gt;
&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b_no_ri(id int, a_id int);&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b(id int, a_id int references tab_a(id));&lt;br /&gt;
\timing&lt;br /&gt;
-- postgres 18&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 12844,206 ms (00:12,844)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 659,462 ms&lt;br /&gt;
&lt;br /&gt;
-- postgres 19&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 2728,073 ms (00:02,728)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 673,444 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ukázkový test je best case - zrychlení je cca čtyřnásobné. Stále je import s RI cca 4x pomalejší než bez RI (a to cílová tabulka obsahuje pouze jeden cizí klíč). V praxi to bude jiné - kromě RI je náročná i aktualizace indexů a samozřejmě všechny diskové operace.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Určitě každý, kdo pracuje s Postgresem trochu déle, se setkal s doporučením &amp;quot;nepoužívej &amp;lt;code&amp;gt;NOT IN (SELECT ...&amp;lt;/code&amp;gt;&amp;quot;. Důvodem byla (v některých případech) &amp;quot;špatná&amp;quot; optimalizace. Optimalizátor neměl garanci, že subselect nevrátí &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;. Poté, co se ve verzi 18 přepsal systém pro ukládání omezujících pravidel (constraints), už bylo možné do tuto informaci v optimalizátoru použít. Nyní se by se měl subselect &amp;lt;code&amp;gt;NOT IN&amp;lt;/code&amp;gt; transformovat na tzv anti-join (v těch případech, kdy je garantováno, že žádná proměnná v predikátu nebude &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;). Jinými slovy, pokud optimalizátor bude mít garance, že se v predikátu subselectu nevyskytne &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, tak vygeneruje stejný plán, jako kdybyste použili zápis s &amp;lt;code&amp;gt;NOT EXISTS&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE osoby(id int PRIMARY KEY, jmeno varchar);&lt;br /&gt;
CREATE TABLE faktury(id int primary key,&lt;br /&gt;
                     vlozeno timestamp,&lt;br /&gt;
                     podal int REFERENCES osoby(id) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT *&lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE id NOT IN (SELECT podal&lt;br /&gt;
                            FROM faktury);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT * &lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE NOT EXISTS(SELECT podal &lt;br /&gt;
                            FROM faktury&lt;br /&gt;
                           WHERE podal = osoby.id);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
-- ve starších verzích dostanete různé plány&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ve starších verzích spojení relací vždy předcházelo agregaci. To v některých případech může být neefektivní (pokud agregace výrazně redukuje počet řádek). Pokud jsem chtěl změnit pořadí operací, musel jsem si to vynutit zápisem (poddotazem). V devatenáctce optimalizátor podporuje tzv předběžnou agregaci (eager aggregation), která předbíhá před join:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT sum(pocet_zen + pocet_muzu), okresy.nazev &lt;br /&gt;
                  FROM okresy JOIN obce ON okresy.id = obce.okres_id&lt;br /&gt;
                 GROUP BY okresy.nazev;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                                QUERY PLAN                                                │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Finalize HashAggregate  (cost=157.38..158.15 rows=77 width=18)                                           │&lt;br /&gt;
│   Group Key: okresy.nazev                                                                                │&lt;br /&gt;
│   -&amp;gt;  Hash Join  (cost=3.02..157.00 rows=77 width=18)                                                    │&lt;br /&gt;
│         Hash Cond: ((obce.okres_id)::text = okresy.id)                                                   │&lt;br /&gt;
│         -&amp;gt;  Partial GroupAggregate  (cost=0.28..154.05 rows=77 width=15)                                 │&lt;br /&gt;
│               Group Key: obce.okres_id                                                                   │&lt;br /&gt;
│               -&amp;gt;  Index Only Scan using obce_okres_id_idx on obce  (cost=0.28..122.03 rows=6250 width=7) │&lt;br /&gt;
│         -&amp;gt;  Hash  (cost=1.77..1.77 rows=77 width=17)                                                     │&lt;br /&gt;
│               -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.77 rows=77 width=17)                                 │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(9 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Na datech pro ČR je výše uvedený dotaz cca 3x rychlejší (v pg19 vůči pg18).&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud je jeden řádek zamčený vícero transakcemi, tak se do jeho systémového atributu &amp;lt;code&amp;gt;xmax&amp;lt;/code&amp;gt; uloží tzv &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; (MultiXact je &amp;quot;aparát&amp;quot;, kterým se v Postgresu implementují řádkové zámky). To je unikátní identifikátor skupiny transakcí, které drží zámek. Každá skupina transakcí se skládá z tzv členských záznamů &amp;lt;code&amp;gt;MultiXactMember&amp;lt;/code&amp;gt;, ve kterých se drží identifikátor transakce, typ zámku a stav transakce. Také tyto záznamy mají své unikátní id &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Doposud &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; byla 32bitová hodnota. Nově je tato hodnota 64bitová, a nehrozí její přetečení. &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; i id transakcí jsou stále 32bitové hodnoty (existuje několik rozpracovaných řešení, které zvyšují jejich rozsah), takže stále hrozí přetečení těchto id, a nastartování vynuceného freezování (což u více zatížených systémů může způsobit problémy s produkcí). Eliminovala se ale možnost přetečení &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Je tp důležité, protože &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; rostl ze všech zmíněných id nejrychleji (pokud &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; je počet transakcí se sdílenými zámky, pak růst &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; je &amp;lt;code&amp;gt;nxn&amp;lt;/code&amp;gt;). Informace o MultiXact (skupinách transakcí) lze získat novou funkcí &amp;lt;code&amp;gt;pg_get_multixact_stats()&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přepracoval se kód, který implementuje příkazy &amp;lt;code&amp;gt;LISTEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NOTIFY&amp;lt;/code&amp;gt;. Předchozí verze probouzely každý proces, který čekal na notifikaci (bez ohledu na to jestli čekal nebo nečekal na kanálu, který dostal notifikaci). Stará implementace fungovala dobře, pokud počet použitých kanálů byl malý, a tudíž byla i malá šance, že se probudí proces, který čeká na jiném kanálu než je aktuální notifikace. Uživatelé ale začali notifikace používat i jinak, a reportovali výrazné zpomalení pokud větší množství klientů poslouchalo na větším množství různých kanálů. Ve zprávě ke patchi je uvedeno zpomalení (pro 1 klienta 9100 TPS, pro 1000 klientů 200 TPS). Nová implementace ve sdílené paměti ke každému kanálu drží seznam čekajících klientů. V případě zprávy do některého kanálu se probudí pouze procesy, které na tomto kanálu poslouchají (i zde je vidět pokles TPS, ale výrazně menší - pro 1000 klientů 9000 TPS).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Výchozí komprimace TOASTu bude &amp;lt;code&amp;gt;lz4&amp;lt;/code&amp;gt; (namísto &amp;lt;code&amp;gt;pglz&amp;lt;/code&amp;gt;). LZ4 je jako volba už cca 5 let, a měla by být efektivnější (jak v komprimaci, tak ve využití CPU) než původní LZ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Postupně víc funkcí je akcelerováno pomocí SIMD. Nově to jsou funkce &amp;lt;code&amp;gt;hex_encode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hex_decode&amp;lt;/code&amp;gt; a parsování csv, tsv formátů příkazu &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; (hledání speciálních znaků).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Některé extenze, jako např. &amp;lt;code&amp;gt;pgstattuple&amp;lt;/code&amp;gt;, nově používají direct API pro čtení dat (implementované v pg18). Na systémech s rychlým IO by měly běžet rychleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Na základě reportů uživatelů se upravila implementace hashjoinu, tak aby nedocházelo k extrémnímu nárůstu alokace paměti v případech, kdy atribut použitý pro spojení relací obsahuje velké množství &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; hodnot.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V těch případech, kdy je garantováno, že porovnávané hodnoty jsou ne nullové, tak se operátor &amp;lt;code&amp;gt;IS DISTICT FROM&amp;lt;/code&amp;gt; nahradí operátorem &amp;lt;code&amp;gt;&amp;lt;&amp;gt;&amp;lt;/code&amp;gt;, případně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM&amp;lt;/code&amp;gt; operátorem &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;. Tady je otázkou, jaký bude reálný dopad. Jako programátor používám &amp;lt;code&amp;gt;IS [ NOT ] DISTINCT FROM&amp;lt;/code&amp;gt; jedině v těch případech, které komplikují potenciální NULLy. Je ale pravdou, že drtivou většinu SQL, dnes generují ORM frameworky, ktere nemusí mít vždy dostatečnou chytrost. Výraz &amp;lt;code&amp;gt;IS DISTINCT FROM NULL&amp;lt;/code&amp;gt; se nyní transformuje na &amp;lt;code&amp;gt;IS NOT NULL&amp;lt;/code&amp;gt;, obdobně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM NULL&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Replikace&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dlouhodobým cílem implementace logické replikace je podpora multimaster řešení. Zatím je k tomu ještě dlouhá cesta. Chybí podpora replikace DDL příkazů, plná podpora sekvencí, plná podpora řešení replikačních kolizí. Postupuje se v malých krocích. Letos je to podpora jednorázového refrešnutí sekvencí &amp;lt;code&amp;gt;ALTER SUBSCRIPTION ... REFRESH SEQUENCES&amp;lt;/code&amp;gt;. S multimasterem to úplně nepomůže, ale může to zjednodušit upgrade skrze logickou replikaci.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Novým příkazem je příkaz &amp;lt;code&amp;gt;WAIT FOR&amp;lt;/code&amp;gt;, který je možné použít na replikách, a který zajistí čekání na zreplikování zadané transakce. Lze nastavit timeout. Parametrem &amp;lt;code&amp;gt;NO_THROW&amp;lt;/code&amp;gt; zajistí tiché (bez výjimky) ukončení příkazu po timeoutu (změní se pouze vrácená hodnota):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# WAIT FOR LSN &#039;0/306EE20&#039; WITH (TIMEOUT &#039;100ms&#039;, NO_THROW);&lt;br /&gt;
 status&lt;br /&gt;
--------&lt;br /&gt;
 timeout&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V příkazu &amp;lt;code&amp;gt;CREATE PUBLICATION ... FOR ALL TABLES&amp;lt;/code&amp;gt; je nyní možné použít klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE (t1, ...)&amp;lt;/code&amp;gt;. Klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE&amp;lt;/code&amp;gt; lze použít i v příkazu &amp;lt;code&amp;gt;ALTER PUBLICATION&amp;lt;/code&amp;gt;. Pro registraci odběru (&amp;lt;code&amp;gt;CREATE SUBSCRIPTION&amp;lt;/code&amp;gt;) lze místo explicitního connection stringu použít odkaz na dříve definovaný FDW server.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V pohledu &amp;lt;code&amp;gt;pg_replication_slots&amp;lt;/code&amp;gt; je nový sloupec &amp;lt;code&amp;gt;slotsync_skip_reason&amp;lt;/code&amp;gt; popisující důvod, proč nebylo možné synchronizovat repliku. V tom případě bude obsahovat jednu z následujících hodnot: &amp;lt;code&amp;gt;wal_or_rows_removed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wal_not flushed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;no_consistent_snapshot&amp;lt;/code&amp;gt; nebo 	&amp;lt;code&amp;gt;slot_invalidated&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud při registraci odběru nastavíme parametr &amp;lt;code&amp;gt;retain_dead_tuples&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; (výchozí nastavení je &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;), budou se detekovat kolize update-delete, kdy nedojde k update z důvodu smazaného řádku. Pozor, tato volba dočasně blokuje vakuování zrušených řádků (zvlášť pokud je replika nedostupná a nedochází k synchronizaci). Lze nastavit timeout &amp;lt;code&amp;gt;max_retention_duration&amp;lt;/code&amp;gt;, samozřejmě pak ovšem může dojít ke kolizi update-delete. Bez detekce této kolize může dojít k tiché nekonzistenci obsahu napříč různými zdroji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Ostatní&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; podporuje formát &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt; (pouze export).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT JSON&lt;br /&gt;
{&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT (FORMAT JSON, FORCE_ARRAY)&lt;br /&gt;
[&lt;br /&gt;
 {&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nyní také tento příkaz podporuje volbu &amp;lt;code&amp;gt;ON_ERROR SET_NULL&amp;lt;/code&amp;gt;, která způsobí ignorování hodnot, na kterých selže typová konverze. To je možné díky tomu, že se již dříve zavedla podpora tzv měkkých chyb (soft errors). Tyto chyby lze ošetřit s řádově menší režií než běžné chyby (nejsou potřeba subtransakce). Podpora soft errors se v Postgresu objevila s podporou klauzule &amp;lt;code&amp;gt;ON ERROR&amp;lt;/code&amp;gt; SQL/JSON funkcí. V plánu je podpora error safe přetypování (&amp;lt;code&amp;gt;CAST expr AS type xxx DEFAULT expr ON CONVERSION ERROR&amp;lt;/code&amp;gt;). Prvním nezbytným krokem je požadavek, aby konverzní funkce používaly měkké chyby. To teď v upstreamu je, a díky tomu, bylo i relativně jednoduché implementovat &amp;lt;code&amp;gt;COPY ON_ERROR SET_NULL&amp;lt;/code&amp;gt; (error safe casts by měly být v pg20).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, b int);&lt;br /&gt;
&lt;br /&gt;
COPY foo FROM stdin (FORMAT csv, ON_ERROR SET_NULL);&lt;br /&gt;
Enter data to be copied followed by a newline.&lt;br /&gt;
End with a backslash and a period on a line by itself, or an EOF signal.&lt;br /&gt;
&amp;gt;&amp;gt; 10,20&lt;br /&gt;
&amp;gt;&amp;gt; 30,40&lt;br /&gt;
&amp;gt;&amp;gt; ahoj,20&lt;br /&gt;
&amp;gt;&amp;gt; \.&lt;br /&gt;
COPY 3&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM foo;&lt;br /&gt;
┌────┬────┐&lt;br /&gt;
│ a  │ b  │&lt;br /&gt;
╞════╪════╡&lt;br /&gt;
│ 10 │ 20 │&lt;br /&gt;
│ 30 │ 40 │&lt;br /&gt;
│  ∅ │ 20 │&lt;br /&gt;
└────┴────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově také příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; umožňuje číst přímo partišny (partitions). V předchozích verzích bylo nutné použít syntax s vloženým selectem, což má nějakou režii.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce pro zakódování a dekódování textu (&amp;lt;code&amp;gt;encode&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;decode&amp;lt;/code&amp;gt;) nově podporují kódování &amp;lt;code&amp;gt;base64url&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;base32hex&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 41686f6a3c3e2f2b │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base64url&#039;);&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│   encode    │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ QWhvajw-Lys │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base32hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 85K6UQHS7ONIM=== │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dokončit implementaci standardu SQL/JSON, konkrétně implementaci funkce &amp;lt;code&amp;gt;JSON_TABLE&amp;lt;/code&amp;gt; se opět nestihlo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;psql&amp;lt;/code&amp;gt; bude možnost si nastavit zobrazení logických hodnot &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Datový typ &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; akceptuje literály &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Na výstupu se zobrazuje pouze &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
\pset display_true true&lt;br /&gt;
Boolean true display is &amp;quot;true&amp;quot;.&lt;br /&gt;
\pset display_false false&lt;br /&gt;
Boolean false display is &amp;quot;false&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ true     │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT 1 &amp;lt;&amp;gt; 1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ false    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Může se hodit možnost si zobrazit &amp;lt;code&amp;gt;search_path&amp;lt;/code&amp;gt; v promptu. V promptu je také možnost použít symbol &amp;lt;code&amp;gt;%i&amp;lt;/code&amp;gt;, který se nahradí replikačním statusem (&amp;lt;code&amp;gt;primary&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;standby&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;PL/pgSQL&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;PL/pgSQL je relativě stabilizované prostředí, kde je každoročně jen minimum změn. Letos je to jedna malá (a pro většinu uživatelů zanedbatelná změna), a jedna &amp;quot;velká&amp;quot;, která ale interně žádnou změnou není.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou změnou je interní optimalizace exekuce embedded SQL ve tvaru  &amp;lt;code&amp;gt;SELECT výraz INTO proměnná&amp;lt;/code&amp;gt;. Mám pocit, že tento zápis se používal v Sybase a na Sybase navazujících databázích pro inicializaci proměnných. Já jsem se s tímto zápisem setkával v literatuře někdy kolem roku 2000, a už tehdy platilo doporučení tento zápis nepoužívat (v plpgsql se nikdy moc nepoužíval). V posledních letech přišlo víc uživatelů z MSSQL (začalo se migrovat víc aplikací z tohoto serveru), tento zápis používali a zjistili, že tento zápis je cca 20x pomalejší než &amp;quot;nativní&amp;quot; přiřazení &amp;lt;code&amp;gt;proměnna := výraz&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Interně jsou v PL/pgSQL dvě metody jak vyhodnotit výraz. Tzv simple metoda, kde se přeskočí SQL exekutor a přímo zavolá exekutor výrazů, je výrazně rychlejší. Druhou metodou je běžná exekuce skrze SQL exekutor (a SPI API). Až doposud, cokoliv co v zdrojovém kódu funkce bylo SQL příkazem (zde příkazem &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;) se vykonalo běžnou cestou. Nově se detekuje výše zmíněný zápis a vykoná se simple metodou. Pro dlouholeté uživatele Postgresu to nic neznamená, ale lidem, kteří migrují z MSSQL, to může zpříjemnit život.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Druhou, a naopak, velkou změnou je možnost inliningu funkce, která je napsaná v PL/pgSQL (ve speciálních případech). Inlining v kontextu Postgresu je trochu něco jiného než si uživatele představí pod termínem inlining. V Postgresu mohou být funkce volané z nějakého SQL příkazu - typicky příkazu &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;. Pokud nějaká funkce podporuje inlining, tak to znamená, že v AST stromu dotazu se volání funkce nahradí jejím tělem. Teprve pak nastupuje optimalizace, a díky inliningu vlastně optimalizátor vidí dovnitř funkce (jinak je funkce pro optimalizátor black box).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;K tomu, aby PL/pgSQL (nejen v PL/pgSQL) funkce mohla být inlinovaná, potřebujete vlastní kód v Cčkové extenzi. A je to vlastně trik (v tomto případě dost nestydatý podfuk :-)). Už dříve bylo možné napsat extenze, které dodávaly optimalizátoru znalost o vybraných funkcích (jinak, opět, pro optimalizátor, jsou funkce black box). Přímo v jádru je například podpora optimalizátoru pro funkci &amp;lt;code&amp;gt;generate_series&amp;lt;/code&amp;gt; (staré verze pg by v rows měly 1000).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT * FROM generate_series(1,3);&lt;br /&gt;
┌────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                             QUERY PLAN                             │&lt;br /&gt;
╞════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Function Scan on generate_series  (cost=0.00..0.03 rows=3 width=4) │&lt;br /&gt;
└────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Inlining byl dřive podporován pro funkce v jazyku SQL, kdy si planner vytáhl zdrojový kód funkce. V devatenáctce planner může zavolat extenzi, a může si říct nejen o detailnější parametry ohledně exekuce, ale může si říct o substituční SQL. Když ho dostane, tak funkci dále neřeší, a pracuje se substitučním SQL příkazem. Je to docela magie, nicméně efektivní. Kód extenze se volá až v momentu, kdy známe konstantní parametry funkce, a extenze se může rozhodnout - zavolej volanou funkci, nebo zavolej nějaké SQL, zavolej jinou funkci, případně vrať rovnou nějakou speciální hodnotu &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, 0, ... Je to i způsob, jak opravdu efektivně pracovat s dynamickým SQL. Musíte si ovšem napsat kód v Cčkové extenzi. Požadavek na tuto funkcionalitu přišel od vývojářů PostGISu. Cílem jsou optimalizace v PostGISu, dá se to ale použít i jinde. Časem si dovedu představit i nějakou contrib extenzi, která by tuto možnost zpřístupnila i bez nutnosti psát si vlastní extenzi. Škoda, že nemám autoritu vývojářů PostGISu. Dovedl bych si představit podobný trik v analyzátoru. Dost by mi to pomohlo s Orafce. V té pozici samozřejmě nejsem.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Vývoj&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Každoročně dochází k čištění kódu. Občas se zruší podpora některé platformy. Výjimečně se přidá podpora nové platformy nebo jako v případě pg19 se vrátí podpora dříve odstraněné platformy (AIX - operační systém AIX přestal být podporovaný v pg17 díky nezájmu IBM. Pak se ale v IBM chytli za nos, dodali počítač do testovací farmy, a do AIXu přidali aktualizovaný software potřebný k buildu Postgresu). Další čistky v kódu lze provést přechodem na novější verzi programovacího jazyka - přechodem z C99 na C11 (bohužel to může znamenat, že starých platformách se nové verze Postgresu nepřeloží). Interní datový typ &amp;lt;code&amp;gt;Datum&amp;lt;/code&amp;gt; až do předchozí verze byl 4bajtový na 32bitových platformách a 8bajtový na 64bitových platformách. Nově je 8bajtový na všech podporovaných platformách. Určitě nezanedbatelná část kódu se generuje z definičních souborů. Nově se z definic generuje kód definující konfigurační proměnné. Údržba, verzování, zajištění konzistence definičních souborů je násobně jednodušší než údržba adekvátního kódu v Cčku. Dynamická alokace paměti bude jednodušší díky funkcím &amp;lt;code&amp;gt;GetNamedDSA&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;GetNamedDSMSegment&amp;lt;/code&amp;gt;. Dynamicky sdílenou paměť lze sledovat skrze pohled &amp;lt;code&amp;gt;pg_dsm_registry_allocations&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Mám pocit, že vývoj Postgresu ještě víc zrychlil - je vidět mnohem víc patchů od lidí z Asie (dříve to bylo spíš jenom Japonsko), a o to víc se naráží na kapacitu committerů. Je to paradox, který nejde jednoduše řešit. Postgres je populární díky funkcionalitě a stabilitě. Stabilita je díky pečlivé práci commitetterů (důkladně se řeší každý řádek kódu). Díky popularitě je více programátorů, kteří píší více kódu, více patchů, ale committeři nestíhají, a tak patche zůstávají relativně dlouho ve frontě. Což frustruje programátory. Patch napíšete během měsíce, během měsíce se dá udělat finalizace a pár iterací s committerem, ale mezitím několik měsíců (v horším případě let (3 roky i v případě bezproblémového malého patche)), čekáte, až si na vás některý z committerů udělá čas. Celou dobu musíte udržovat patch v aplikovatelném stavu, musíte reagovat na případné diskuze, musíte sledovat vývoj a případně aktualizovat patch. Je to problém o kterém se ví, diskutuje se o něm, ale není úplně jasné, co by mělo být řešení. Minimálně se zlepšila evidence patchů, která pokrývá i automatické testování na několika různých platformách. Tady je velká klika, že Postgres má extenze. Neskutečně velký objem kódu (funkcionality) je dnes možné řešit skrz extenze mimo komunitu - což výrazně snižuje tlak na committery. V extenzích toho jde udělat hodně, bohužel, ne všechno. Na druhou stranu, extenze také nejsou bez rizika. Určitým způsobem zvyšují fragmentaci ekosystému Postgresu, který pak ztrácí přehlednost (plus ne všechny extenze jsou dostupné v cloudu). Zase, díky tomu je jádro Postgresu stále ještě rozumně velké. O Oracle se kolují zvěsti, že jádro má 14 miliónů řádek, Postgres pod 2 milióny. Náklady na údržbu Postgresu jsou výrazně menší. Kompilace zdrojáků je do 5 minut, regresní testy v největším rozsahu běží 15 minut. S tím ještě lze nějak rozumně pracovat. O Oracle jsem slyšel, že regresní testy běží den.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Popularita Postgresu jde aktuálně až do absurdna. Z Linkedinu mám pocit, že začíná být přepostgresováno (samozřejmě z mé perspektivy a v mé bublině). Hromada příspěvků vygenerovaných AI jsou banality na úrovni žáka prvního stupně (Postgres má VACUUM, indexy jsou super, dotazy mohou být pomalé, atd atd). Doporučení typu - proč ne Redis, proč ne Elastic, na všechno použijte Postgres. Viděl jsem hromadu clickbaitových článků typu - multigenerační architektura Postgresu je tragická, ale s naší AI nebo s naším supportem nebudete mít problém, atd atd. Postgresu dnes rozumí každý, kdo dokáže do AI napsat Postgres. Měl jsem tu možnost vidět naprosto neadekvátní doporučení ohledně konfigurace (dnes nevíte jestli důvodem je neznalost autora nebo naopak jeho vychytralost a snaha o co nejvíc komentářů případně o troling). Historicky popularita Postgresu rostla ve stínu MySQL, Monga a dalších databází a roky byl Postgres ušetřený mediálního balastu. To bohužel už není pravda. Pořád platí, že Postgres je dobrá databáze, stabilní, relativně rychlá, která se ale rozhodně nehodí na vše. Má svoje limity, které je dobré znát, a rozhodně nemůže ve všech ohledech (ve větším rozsahu) nahradit Redis, MySQL nebo Mongo případně Kafku. To je nesmysl, a není to ani cílem komunity. Základem jakékoliv práce je znát limity, chování, a správně v souladu s celkem, používat správné nástroje.&amp;lt;/p&amp;gt;&lt;br /&gt;
----------&lt;br /&gt;
&amp;lt;DPL&amp;gt;category=Verze PostgreSQL&amp;lt;/DPL&amp;gt;&lt;br /&gt;
[[Category:Články]]&lt;br /&gt;
[[Category:Verze PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1583</id>
		<title>PostgreSQL 19 (2026)</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1583"/>
		<updated>2026-05-10T03:12:35Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;i&amp;gt;Autor: Pavel Stěhule&amp;lt;/i&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;O předchozích verzích jsem napsal, že změny byly primárně interní. Z pohledu uživatele, který chce vidět novou SQL syntax, se toho v posledních verzích moc nestalo. Devatenáctka je jiná. Tam je viditelných změn opravdu hodně. Jako každý rok - nová verze je pelmel nových funkcí a různých vylepšení menších nebo větších.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Administrace&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Bloating tabulek může být problém. Skoro všude jsem se setkal se situací, kdy &amp;quot;mazací&amp;quot; skript přestal fungovat (z různých důvodů), přičemž se tato chyba detekovala příliš pozdě, kdy dotčené tabulky měly místo jednotek GB například desítky GB. To už musí zaúřadovat &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, což často znamená vynucenou plánovanou odstávku (kvůli držení exkluzivního zámku). Je to letitý problém, který zkušenější uživatelé řešili buďto pečlivějším monitoringem, v některých případech partišningem (partitioning), případně extenzemi &amp;lt;code&amp;gt;pg_repack&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt;. Autor posledně jmenované extenze Tonda (Antonín Houska) spolu s Alvarem (Alvaro Herrera) poslední dva roky pracovali na integraci &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt; do jádra Postgresu. Paradoxně příkaz, který bude provádět zdrcnutí tabulek, se bude jmenovat &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt;. Základem je logická replikace - zadaná tabulka se lokálně zreplikuje (vytvoří se její nová kopie, a tím se zbaví vnitřního neobsazeného místa). Co je zásadní, je možnost použít volbu &amp;lt;code&amp;gt;CONCURRENTLY&amp;lt;/code&amp;gt;. S touto volbou příkaz nepoužije exkluzivní zámek. Tudíž je možné jej použít za provozu. Nutnou podmínkou je existence primárního klíče (a unikátního indexu).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
REPACK (CONCURRENTLY, VERBOSE) obce;&lt;br /&gt;
INFO:  repacking &amp;quot;public.obce&amp;quot; in physical order&lt;br /&gt;
INFO:  &amp;quot;public.obce&amp;quot;: found 0 removable, 6250 nonremovable row versions in 59 pages&lt;br /&gt;
DETAIL:  0 dead row versions cannot be removed yet.&lt;br /&gt;
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.&lt;br /&gt;
REPACK&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kromě toho, že příkaz &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt; nahrazuje příkaz &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, tak tento příkaz ještě nahrazuje příkaz &amp;lt;code&amp;gt;CLUSTER&amp;lt;/code&amp;gt;, kterým se tabulka fyzicky (jednorázově) přeuspořádá podle zadaného indexu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Možná jste si všimli, že dotaz běžící pod příkazem &amp;lt;code&amp;gt;EXPLAIN ANALYZE&amp;lt;/code&amp;gt; je výrazně pomalejší. Důvodem je měření času - executor, v tomto režimu, neustále poptává aktuální čas, a to má brutální režii. U větších dotazů se vyplatí použít volbu &amp;lt;code&amp;gt;TIMING OFF&amp;lt;/code&amp;gt;. V 19 na x86 se místo systémového času použíjí takty CPU. Je to výrazně rychlejší - zatímco na osmnáctce mi jednoduchý testovací dotaz běžel 2.5x pomalejší v explainu, na devatenáctce pouze 1.5x pomaleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou velkou změnou je vypnutí JIT ve výchozí konfiguraci. JIT se objevil v Postgresu 11, a v Postgresu 12 byl zapnutý ve výchozí konfiguraci. Bohužel se zjistilo, že většině uživatelů, kteří Postgres používají pro OLTP, dělá víc škody než užitku. Došlo to až do stavu, kdy se uživatelům doporučovalo, neoficiálně, po instalaci JIT vypnout. Je tam víc problémů. &amp;lt;code&amp;gt;clang&amp;lt;/code&amp;gt;, na kterém je to postavené, v novějších verzích kompiluje lépe, ale pomaleji. Existují alternativní implementace JIT, ale všechny jsou více než méně experimentální. Druhým problémem je model, na jehož základě se JIT aktivuje. Tento model jednak nedokáže dobře odhadnout náročnost &amp;quot;jitifikace - inliningu, a navíc je citlivý na přestřelení odhadu počtu řádek. Ohledně modelu a citlivosti na odhady pochybuji, že se dá něco dělat. Alternativní implementace JIT mají výrazně nižší režii. Přijde mi to ale jako slepá cesta. Budoucnost vidím v integraci vektorového executoru a vektorových funkcí (tak jak to používá [https://duckdb.org/ DuckDB]). Může to znamenat, že Postgres bude mít duální implementace funkcí (pro skalární parametr, a pro vektor parametrů).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze vytvořit replikační slot pro logickou replikaci, bez nutnosti mít konfiguraci &amp;lt;code&amp;gt;wal_level=logical&amp;lt;/code&amp;gt;. Postačuje nastavení &amp;lt;code&amp;gt;replica&amp;lt;/code&amp;gt;, což je výchozí nastavení. Jakmile je logický replikační slot aktivní, interně se úroveň zápisu do transakčního logu nastaví na &amp;lt;code&amp;gt;logical&amp;lt;/code&amp;gt;. Jaký je aktuální stav zjistíte v konfigurační proměnné &amp;lt;code&amp;gt;effective_wal_level&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Další bombou je možnost zapínat nebo vypínat kontrolní součty (na úrovni datových stránek) za běhu. Kontrolní součty jsou v Postgresu už relativně dlouho, a ačkoliv na dnešním hardware je jejich režie zanedbatelná, tak určitě bude dost databází, kde nebudou zapnuté. Zapnutí kontrolních součtů vyžadovalo odstávku úměrnou velikosti databáze. Navíc se silně doporučuje po zapnutí součtů znovu zreplikovat všechny fyzické repliky. Výhodou je diagnostika, možnost identifikovat poškozené stránky (a přeskočit je), možnost vyrobit replikovaný server ze starého primárního příkazem &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt;. Naplánovat a provést delší odstávku někde nemusí být jednoduché (nebo to může být skoro nemožné). U jednoho mého klienta zapnutí kontrolních součtů na cca 2TB databázi trvalo cca 2 hodiny (na vlastním hardware z roku 2025). Zapnutí se provede voláním funkce &amp;lt;code&amp;gt;pg_enable_data_checksums&amp;lt;/code&amp;gt;. Nastavením volitelných parametrů lze běh funkce zpomalit, tak aby nepřetěžovala IO. Vypnutí provede funkce &amp;lt;code&amp;gt;pg_disable_data_checksums&amp;lt;/code&amp;gt;. Stav procesu můžeme vidět v pohledu &amp;lt;code&amp;gt;pg_stat_progress_data_checksums&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Snad se už konečně vyřešil problém s upgradem databází obsahující extrémně velký počet LO (large objects). Nově binární upgrade (&amp;lt;code&amp;gt;pg_upgrade&amp;lt;/code&amp;gt;) použije pro export metadat LO příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; místo původní sekvence příkazů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- původní sekvence&lt;br /&gt;
SELECT pg_catalog.lo_create(&#039;5432&#039;);&lt;br /&gt;
ALTER LARGE OBJECT 5432 OWNER TO alice;&lt;br /&gt;
GRANT SELECT ON LARGE OBJECT 5432 TO bob;&lt;br /&gt;
&lt;br /&gt;
-- nově&lt;br /&gt;
COPY pg_catalog.pg_largeobject_metadata (oid, lomowner, lomacl) FROM stdin;&lt;br /&gt;
5432 16384 {alice=rw/alice,bob=r/alice}&lt;br /&gt;
\.&lt;br /&gt;
&lt;br /&gt;
COPY pg_catalog.pg_shdepend (dbid, classid, objid, objsubid, refclassid, refobjid, deptype) FROM stdin;&lt;br /&gt;
5 2613 5432 0 1260 16384 o&lt;br /&gt;
5 2613 5432 0 1260 16385 a&lt;br /&gt;
\.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nová implementace by měla být řádově rychlejší.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konečně se dotáhlo do konce začlenění podpory více formátů v příkazu &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Postgres má dva základní příkazy pro export (backup) - &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Historicky tyto příkazy podporovaly pouze &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; formát. Postupem času &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; získal možnost exportu do &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;dictionary&amp;lt;/code&amp;gt; formátu plus import příkazem &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umožňoval paralelní import více tabulek. &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; byl díky podpoře pouze SQL formátu dost omezený. To se nyní změnilo, a v &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; jsou podporovány všechny formáty, které podporuje &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt;. Vypadá to trochu jako workaround. V případě, že se použije jiný než &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; (SQL) formát, tak se vyrobí adresář, který do podadresářů uloží výstup z &amp;lt;code&amp;gt;pg_dumpu&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umí s touto adresářovou strukturou pracovat. Tato možnost se dostala už do 18tky, ale byla na poslední chvíli stažena.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt; zredukovalo kopírování WAL logů z nového primárního serveru na budovanou repliku a to tak, že se budou kopírovat pouze WAL logy vzniklé po rozpadu replikace. V mnoha scénářích se tím výrazně urychlí běh tohoto příkazu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Doposud autovacuum vybíralo tabulky k vakuování na základě porovnání vypočítaných koeficientů a prahových hodnot. Pořadí vybraných tabulek záleželo na fyzickém pořadí v systémové tabulce &amp;lt;code&amp;gt;pg_class&amp;lt;/code&amp;gt;. Nově se vakuum bude prioritizovat podle míry vzdálenosti od prahu. Dalším kritériem je stáří tabulky (počet transakcí od freeze). Stará implementace byla férová v tom, že garantovala, že každá tabulka bude zvakuovaná a že žádná tabulka nebude &amp;quot;předbíhat&amp;quot; ve frontě. Na druhou stranu se mohlo stát, že tabulka s intenzivnějším provozem čekala příliš dlouho a došlo k zbytečnému bloatingu. Nová implementace se snaží být chytřejší. Uvidíme, jak to bude fungovat. Moje zkušenost je taková, že a) není dobré dávat do Postgresu příliš dynamická data, b) je dobré si nastavit počet aktivních autovacuum workerů tak, aby byla určitá rezerva, c) není dobré vytěžovat IO na maximum (je dobré mít dostatečně nadimenzované IO a mít nějakou rezervu). Skóre tabulek můžeme sledovat v pohledu &amp;lt;code&amp;gt;pg_stat_autovacuum_score&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_autovacuum_scores WHERE score &amp;gt; 0.05;&lt;br /&gt;
┌─[ RECORD 1 ]────────┬──────────────────────┐&lt;br /&gt;
│ relid               │ 1262                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_database          │&lt;br /&gt;
│ score               │ 0.15936254737880529  │&lt;br /&gt;
│ xid_score           │ 1e-07                │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0.0793650769622719   │&lt;br /&gt;
│ vacuum_insert_score │ 0.003998400542165933 │&lt;br /&gt;
│ analyze_score       │ 0.15936254737880529  │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
╞═[ RECORD 2 ]════════╪══════════════════════╡&lt;br /&gt;
│ relid               │ 1214                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_shdepend          │&lt;br /&gt;
│ score               │ 0.12                 │&lt;br /&gt;
│ xid_score           │ 1.15e-07             │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0                    │&lt;br /&gt;
│ vacuum_insert_score │ 0.006                │&lt;br /&gt;
│ analyze_score       │ 0.12                 │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
└─────────────────────┴──────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově autovacuum může použít &amp;lt;code&amp;gt;VACUUM&amp;lt;/code&amp;gt; s podporou paralelismu.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přehled o aktuálním stavu recovery je k dispozici v pohledu &amp;lt;code&amp;gt;pg_stat_recovery&amp;lt;/code&amp;gt;. V pohledu &amp;lt;code&amp;gt;pg_stat_statements&amp;lt;/code&amp;gt; jsou dva nové sloupce &amp;lt;code&amp;gt;generic_plan_calls&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;custom_plan_calls&amp;lt;/code&amp;gt; zobrazující kolikrát předpřipravený příkaz (prepared statement) použil generický nebo zákaznický plán. Nový sloupec &amp;lt;code&amp;gt;wal_fpi_bytes&amp;lt;/code&amp;gt; zobrazuje velikost zápisu tzv. plných stránek do transakčního logu. Vysoká hodnota může signalizovat nepříjemně velkou četnost vynucených checkpointů (je nutné zvednout &amp;lt;code&amp;gt;max_wal_size&amp;lt;/code&amp;gt; případně &amp;lt;code&amp;gt;checkpoint_timeout&amp;lt;/code&amp;gt;). V novém pohledu &amp;lt;code&amp;gt;pg_stat_lock&amp;lt;/code&amp;gt; uvidíme počet a celkový čas čekání na různé typy zámků. Zaznamenány jsou pouze ty situace, kdy se čeká na zámek déle než jednu sekundu (stejně jako např. &amp;lt;code&amp;gt;log_lock_waits&amp;lt;/code&amp;gt;, které je v nyní ve výchozí konfiguraci zapnuté). Bohužel zámky, které trvají cca 100ms, mající nepříjemný dopad na dotazy kolem 10ms, zde neuvidíme:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_lock ;&lt;br /&gt;
┌──────────────────┬───────┬───────────┬───────────────────┬───────────────────────────────┐&lt;br /&gt;
│     locktype     │ waits │ wait_time │ fastpath_exceeded │          stats_reset          │&lt;br /&gt;
╞══════════════════╪═══════╪═══════════╪═══════════════════╪═══════════════════════════════╡&lt;br /&gt;
│ relation         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ extend           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ frozenid         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ page             │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ tuple            │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ transactionid    │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ virtualxid       │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ spectoken        │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ object           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ userlock         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ advisory         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ applytransaction │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
└──────────────────┴───────┴───────────┴───────────────────┴───────────────────────────────┘&lt;br /&gt;
(12 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze Postgres podporuje asynchronní IO. Čtení je realizováno dedikovanými procesy (workers). Počáteční implementace pracovala s konfigurovatelným počtem těchto procesů (výchozí nastavení mělo hodnotu 3). Nově je správa workerů dynamičtější - v případě potřeby si je Postgres nastartuje nebo naopak zavře. Místo fixního počtu nyní nastavujeme minimální a maximální počet workerů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io_min_workers=2&lt;br /&gt;
io_max_workers=8 (up to 32)&lt;br /&gt;
io_worker_idle_timeout=60s&lt;br /&gt;
io_worker_launch_interval=100ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Poměrně razantně se změnila konfigurace &amp;lt;code&amp;gt;log_min_messages&amp;lt;/code&amp;gt;, která udává, na které úrovni se mají chyby zapsat do systémového logu (&amp;lt;code&amp;gt;DEBUG5&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;PANIC&amp;lt;/code&amp;gt;). Nově lze tuto úroveň nastavit pro každý typ procesu (&amp;lt;code&amp;gt;archiver&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;autovacuum&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bgworker&amp;lt;/code&amp;gt;, ...) např. &amp;lt;code&amp;gt;error, walsender:debug1, autovacuum:debug1&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Správa partišen (partitions) byla v Postgresu základní. Díky možnosti sloučit nebo rozdělit partišny (partitions) se dostává trochu dál. Je to spíš první krok se spoustou omezení - používá se pouze jedno CPU a po celou dobu je exkluzivně zamknutá rodičovská tabulka. Ale i tak to může dost uživatelům ušetřit práci (a jejich vlastní řešení by pravděpodobně mělo stejná omezení):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_east, sales_central)  INTO sales_all;&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE measurement SPLIT PARTITION measurement_y2006q1 INTO&lt;br /&gt;
   (PARTITION measurement_y2006m01 FOR VALUES FROM (&#039;2006-01-01&#039;) TO (&#039;2006-02-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m02 FOR VALUES FROM (&#039;2006-02-01&#039;) TO (&#039;2006-03-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m03 FOR VALUES FROM (&#039;2006-03-01&#039;) TO (&#039;2006-04-01&#039;));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Oproti předchozím verzím lze zapínat a vypínat všechny typy omezení (nejen cizí klíče):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, CONSTRAINT cc CHECK(a &amp;gt; 0) NOT ENFORCED); &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
INSERT INTO foo VALUES(1);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ERROR:  check constraint &amp;quot;cc&amp;quot; of relation &amp;quot;foo&amp;quot; is violated by some row&lt;br /&gt;
DELETE FROM foo WHERE a = 0;&lt;br /&gt;
DELETE 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
ERROR:  new row for relation &amp;quot;foo&amp;quot; violates check constraint &amp;quot;cc&amp;quot;&lt;br /&gt;
DETAIL:  Failing row contains (0).&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc NOT ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;pg_plan_advice&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Až doposud uživatelé Postgresu neměli moc možností, jak ovlivnit generování prováděcích plánů. Hinty ve stylu Oracle byly a jsou z historických důvodů tabu (jsou implementovány extenzí [https://github.com/ossc-db/pg_hint_plan pg_hint_plan]). Uživatel měl pouze možnost penalizace metod executoru - např. &amp;lt;code&amp;gt;enable_nestloop&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;enable_indexscan&amp;lt;/code&amp;gt; nastavením na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Tato penalizace je ale dost hrubá, a neumožňuje jemné ovlivnění plánovače. Přesto se používala a používá. Rober Haas napsal dvě extenze [https://www.postgresql.org/docs/devel/pgplanadvice.html &amp;lt;code&amp;gt;pg_plan_advice&amp;lt;/code&amp;gt;] a [https://www.postgresql.org/docs/devel/pgstashadvice.html code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;]. Prvně zmíněná extenze umožňuje definovat jakási doporučení, která by měl planner respektovat. Pro každý plán lze zpětně dogenerovat tato doporučení:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce&lt;br /&gt;
  ORDER BY pocet_muzu + pocet_zen DESC&lt;br /&gt;
  LIMIT 10;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Limit  (cost=272.19..272.21 rows=10 width=45)                        │&lt;br /&gt;
│   -&amp;gt;  Sort  (cost=272.19..287.81 rows=6250 width=45)                 │&lt;br /&gt;
│         Sort Key: ((pocet_muzu + pocet_zen)) DESC                    │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on obce  (cost=0.00..137.12 rows=6250 width=45) │&lt;br /&gt;
│ Generated Plan Advice:                                               │&lt;br /&gt;
│   SEQ_SCAN(obce)                                                     │&lt;br /&gt;
│   NO_GATHER(obce)                                                    │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                      QUERY PLAN                                      │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Nested Loop  (cost=0.28..12.56 rows=81 width=58)                                     │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17)                          │&lt;br /&gt;
│         Filter: (nazev = &#039;Beroun&#039;::text)                                             │&lt;br /&gt;
│   -&amp;gt;  Index Scan using obce_okres_id_idx on obce  (cost=0.28..9.79 rows=81 width=41) │&lt;br /&gt;
│         Index Cond: ((okres_id)::text = okresy.id)                                   │&lt;br /&gt;
│ Generated Plan Advice:                                                               │&lt;br /&gt;
│   JOIN_ORDER(okresy obce)                                                            │&lt;br /&gt;
│   NESTED_LOOP_PLAIN(obce)                                                            │&lt;br /&gt;
│   SEQ_SCAN(okresy)                                                                   │&lt;br /&gt;
│   INDEX_SCAN(obce public.obce_okres_id_idx)                                          │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                                             │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(11 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Prostřednictvím konfigurační proměnné &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; můžeme ovlivnit chování planneru vlastními doporučeními:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET pg_plan_advice.advice to &#039;JOIN_ORDER(obce okresy)&#039;;&lt;br /&gt;
SET&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌───────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                            QUERY PLAN                             │&lt;br /&gt;
╞═══════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Join  (cost=1.97..140.78 rows=81 width=58)                   │&lt;br /&gt;
│   Hash Cond: ((obce.okres_id)::text = okresy.id)                  │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on obce  (cost=0.00..121.50 rows=6250 width=41)    │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=1.96..1.96 rows=1 width=17)                     │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17) │&lt;br /&gt;
│               Filter: (nazev = &#039;Beroun&#039;::text)                    │&lt;br /&gt;
│ Supplied Plan Advice:                                             │&lt;br /&gt;
│   JOIN_ORDER(obce okresy) /* matched */                           │&lt;br /&gt;
│ Generated Plan Advice:                                            │&lt;br /&gt;
│   JOIN_ORDER(obce okresy)                                         │&lt;br /&gt;
│   HASH_JOIN(okresy)                                               │&lt;br /&gt;
│   SEQ_SCAN(obce okresy)                                           │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                          │&lt;br /&gt;
└───────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(13 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konfigurace planneru prostřednictvím &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; nestačí, pokud potřebujeme ovlivnit plán dotazu z aplikace, u které nemůžeme nebo nechceme měnit zdrojový kód. A proto je tu druhá zmíněná extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;, která umožňuje naše &amp;quot;doporučení&amp;quot; uložit a pak automaticky aplikovat na základě tzv &amp;lt;code&amp;gt;queryid&amp;lt;/code&amp;gt;. Doporučení jsou uložena v pojmenovaných skladech (stashes). Skrze konfigurační proměnnou &amp;lt;code&amp;gt;pg_stash_advice.stash_name&amp;lt;/code&amp;gt; volíme aktivní sklad. Každý uživatel, každá databáze může mít svůj vlastní. Pokud proměnná není nastavená, tak je extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt; neaktivní. Uložené nápovědy jsou perzistentní - při vypnutí serveru se uloží, po startu znovu načtou do paměti.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;SQL&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; je syntaxe, kterou postres přejímá z analytických databází (zde to snad byla [https://duckdb.org/2022/05/04/friendlier-sql#group-by-all DuckDB]). Pokud se použije tento zápis, tak se automaticky agreguje podle všech sloupců, které nejsou v agregační funkci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT sum(pocet_zen + pocet_muzu), okresy.id, okresy.nazev &lt;br /&gt;
  FROM obce join okresy ON obce.okres_id = okresy.id&lt;br /&gt;
 GROUP BY ALL;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tento zápis může ušetřit dost psaní, může to být také &amp;quot;tichý&amp;quot; zabiják výkonu. Čím více atributů je v klauzuli &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;, tím je agregace pomalejší. Zápis &amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; ještě není ve standardu, ale je standardizační komisí akceptován, a měl by být v některé další verzi ANSI/SQL.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Počínaje Postgresem 19 už nebude možnost používat backlash jako escape symbol v řetězcích. Před 15 roky se přešlo na standardní chování (předtím se řetězce v Postgresu chovali stejně jako v Cčku), nicméně nestandardní chování bylo možné vynutit nastavením &amp;lt;code&amp;gt;standard_conforming_strings&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Mezi top vývojáři Postgresu je hodně velká averze k tzv kompatibility flagům (zmíněný flag nebyl výjimkou) (pozn. u komerčních databází jsou naopak kompatibility flagu standardem, a nejen u nich - např. MySQL). Nyní je tato možnost zrušena, a Cčkové stringy dostaneme pouze jen zápisem (jako tzv extended strings):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;ahoj\nsvete&#039;;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│  ?column?   │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ ahoj\nsvete │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT e&#039;Ahoj\nSvete&#039;;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ Ahoj    ↵│&lt;br /&gt;
│ Svete    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze v u window funkcí &amp;lt;code&amp;gt;lead&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lag&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;first_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last_value&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;nth_value&amp;lt;/code&amp;gt; použít klauzuli &amp;lt;code&amp;gt;IGNORE NULLS&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;. Výchozí chování, které bylo implementováno již dříve odpovídá klauzuli &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;SQL/PGQ&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;V tomto případě PG není častým prefixem symbolizujícím Postgres (a Q jako queue), ale Property Graph Queries. Počínaje podporou neatomických datových typů v SQL:2000, přes podporu XML v SQL:2003 se standard rozšířil nad rámec čistě relačních databází (stejně ale už dříve existovala kritika SQL z pohledu čistoty od relačních dogmatiků). Standard SQL:2023 (ISO/IEC 9075-16:2023) SQL rozšiřuje o podporu grafových databází, které mají svůj vlastní datový model odlišný od relačního modelu. Přijde mi to jako dost odvážný krok (a ještě teď tomu nemohu úplně uvěřit). Zatím existovala zřetelná jednota mezi SQL a relačním modelem. Od nové části standardu se očekává, že pomůže s přehlednějším zápisem určitých dotazů, které se až doposud řešily pomocí rekurze. Přiznám se, že zápis dotazu v PGQ (využívajícího ascii art) mi přijde hodně cizí (možná zažívám pocity programátora v Cobolu, když se poprvé podíval na SQL. Osobně mi to nesedí - reprezentaci znalostí ve formátu grafu jsem nikdy nemusel (vím, že je to jen jiná reprezentace téhož)). Row pattern recognition z roku SQL:2016 toho také nemá s relačními databázemi moc společného, takže to takové překvapení není. Práce na této části standardu začaly v roce 2017 (a integrovaly se prvky jazyka [https://neo4j.com/docs/cypher-manual/current/introduction/cypher-overview/ Cypher] (Neo4j) a [https://docs.oracle.com/en/database/oracle/property-graph/20.4/spgdg/property-graph-query-language-pgql.html#GUID-301FF092-1A07-43D2-91E5-0C5AFF3467CC PGQL] (Oracle)).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Základem grafových databází je graf skládající se z uzlů a hran. Ka každému uzlu i hraně mohou být přiřazeny atributy (properties). Hrany mohou být orientované i neorientované. Standard pro takové grafy používá termín Property Graphs. Graf se definuje příkazem &amp;lt;code&amp;gt;CREATE PROPERTY GRAPH&amp;lt;/code&amp;gt; a je to určitá forma pohledu. Přesto, že jsem zkoušel poměrně triviální příklad, nebylo pro mne intuitivní napsat SQL/PGQ dotaz. Pro uživatele bez zkušenosti s Neo4j nebo jinou grafovou databází budou začátky s SQL/PGQ dost bolestivé. V tuto chvíli (duben 2026) ještě není hotová dokumentace. Je možné, že se díky integraci SQL/PGQ do Postgresu setkám s grafovými databázemi častěji (SQL/PGQ je podporováno v DuckDB a v Oracle):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE public.uzivatele (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  jmeno character varying&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE public.zpravy (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  odesilatel integer,&lt;br /&gt;
  prijemce integer,&lt;br /&gt;
  tema text&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- uzivatel - odeslal -&amp;gt; uzivatel&lt;br /&gt;
CREATE PROPERTY GRAPH public.pg1&lt;br /&gt;
  VERTEX TABLES (&lt;br /&gt;
    public.uzivatele AS uzivatel KEY (id) PROPERTIES (id, jmeno)&lt;br /&gt;
  )&lt;br /&gt;
  EDGE TABLES (&lt;br /&gt;
    public.zpravy AS odeslal KEY (id)&lt;br /&gt;
    SOURCE KEY (odesilatel) REFERENCES uzivatel (id)&lt;br /&gt;
    DESTINATION KEY (prijemce) REFERENCES uzivatel (id)&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (1, &#039;Pavel&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (2, &#039;Zdenek&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (3, &#039;Tomas&#039;);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.zpravy VALUES (1, 1, 2, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (2, 2, 1, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (3, 1, 3, &#039;dotaz ohledne dopravy&#039;);&lt;br /&gt;
&lt;br /&gt;
-- od koho uzivatel Pavel dostal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) &amp;lt;-[IS odeslal]- (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
└────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- komu uzivatel Pavel poslal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) -[IS odeslal]-&amp;gt; (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
│ Tomas  │&lt;br /&gt;
└────────┘&lt;br /&gt;
(2 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Osobně si nedovedu představit, že bych psal dotazy v SQL/PGQ (myslím, že podobně na tom bude většina uživatelů podobně). Je otázkou, jestli se SQL/PGQ neuplatní ve spolupráci s AI. V tomto případě se běžný dotaz rozpadá do dvou kroků. Navíc i joinovací podmínka získává label, takže je to v určitém smyslu více popisné, než běžné SQL, a je tak možné, že tento zápis bude AI více sedět.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pomalu se pokračuje na implementaci tzv temporálních tabulek. Letos je to podpora klauzule &amp;lt;code&amp;gt;FOR PORTION OF valid_at FROM TO&amp;lt;/code&amp;gt;. Zjednodušeně, pokud máme temporální databáze nebo temporální tabulky, tak se můžeme podívat na stav dat v nějakém čase. Pokud se použije klauzule &amp;lt;code&amp;gt;FOR PORTION OF FROM TO&amp;lt;/code&amp;gt;, tak se jedná o tzv temporální &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- je nutne mit nainstalovanou extenzi btree_gist&lt;br /&gt;
CREATE TABLE ceny(&lt;br /&gt;
  id int,&lt;br /&gt;
  valid_at daterange,&lt;br /&gt;
  nazev text,&lt;br /&gt;
  cena int,&lt;br /&gt;
  PRIMARY KEY (id, valid_at WITHOUT OVERLAPS)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
-- jednotna cena mezi 2020-01-01 a 2025-12-31&lt;br /&gt;
INSERT INTO ceny VALUES(1, &#039;[2020-01-01,2026-01-01)&#039;, &#039;pecivo&#039;, 20);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- uprava ceny mezi 2021-01-01 a 2021-02-28&lt;br /&gt;
UPDATE ceny&lt;br /&gt;
   FOR PORTION OF valid_at FROM &#039;2021-01-01&#039; TO &#039;2021-03-01&#039;&lt;br /&gt;
   SET cena = 30&lt;br /&gt;
 WHERE id = 1;&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny ORDER BY valid_at;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2021-01-01) │ pecivo │   20 │&lt;br /&gt;
│  1 │ [2021-01-01,2021-03-01) │ pecivo │   30 │&lt;br /&gt;
│  1 │ [2021-03-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Nové datové typy a funkce&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;V Postgresu se můžete setkat s datovými typy s prefixem &amp;lt;code&amp;gt;reg&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;regrole&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regproc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regclass&amp;lt;/code&amp;gt;. Tyto datové typy jsou vždy spojeny s jednou konkrétní systémovou tabulkou a hodnoty těchto typů vždy nesou unikátní číselný identifikátor databázového objektu. Tyto typy podporují přetypování z textu, což se používá pro zkrácený zápis vyhledávání nějakého databázového objektu v katalogu. Nově můžeme používat typ &amp;lt;code&amp;gt;regdatabase&amp;lt;/code&amp;gt; a tento typ se odkazuje, jak je patrné z názvu, na tabulku &amp;lt;code&amp;gt;pg_database&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ regdatabase │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ template1   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase::oid;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT oid&lt;br /&gt;
 FROM pg_database &lt;br /&gt;
 WHERE datname = &#039;template1&#039;;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Díky těmto typům jsou dotazy nad systémovým katalogem kratší a čitelnější. Navíc autor dotazů nemusí brát v potaz některé detaily (jako například case sensitivitu), kde se chování SQL identifikátorů liší od SQL stringů. To je ošetřeno interně při přetypování.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce &amp;lt;code&amp;gt;error_on_null&amp;lt;/code&amp;gt; vyhodí výjimku, pokud je parametr NULL. Jinak vrátí hodnotu parametru. Implementace je extrémně jednoduchá - sleduje flag &amp;lt;code&amp;gt;isnull&amp;lt;/code&amp;gt;. Každý parametr každé SQL funkce má tento flag. Stejné chování má flag funkce &amp;lt;code&amp;gt;STRICT&amp;lt;/code&amp;gt;. Je tu drobná zrada. V případě kompozitních typů to není kompatibilní s operátorem &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;. Kompozitní hodnota obsahující pouze &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;y je interně ne nullová, ale operátor &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt; pro takovou kompozitní hodnotu vrátí &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT ROW(NULL, NULL) IS NULL;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT error_on_null(NULL::integer);&lt;br /&gt;
ERROR:  null value not allowed&lt;br /&gt;
SELECT error_on_null(ROW(NULL, NULL));&lt;br /&gt;
┌───────────────┐&lt;br /&gt;
│ error_on_null │&lt;br /&gt;
╞═══════════════╡&lt;br /&gt;
│ (,)           │&lt;br /&gt;
└───────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Roky se v Postgresu mluví o tom, že by měl existovat snadný způsob, jak zpětně z databázového objektu vygenerovat DDL příkaz. Osobně jsem nikdy tuhle potřebu neměl, ale do jisté míry této potřebě rozumím. Skoro v každém admin nástroji můžete iterovat přes databázové objekty a k nim si nechat zobrazit DDL. A skoro každý admin tool, pak tuto funkcionalitu duplicitně implementuje - s chybami nebo bez chyb. Je to kód, který vyžaduje neustálou údržbu a aktualizace. Po letech diskuzí se je v upstreamu první část funkcí &amp;lt;code&amp;gt;pg_get_...ddl&amp;lt;/code&amp;gt; (aktuálně &amp;lt;code&amp;gt;pg_get_database_ddl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pg_get_role_ddl&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_get_tablespace_ddl&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT pg_get_role_ddl(&#039;pavel&#039;);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                       pg_get_role_ddl                                        │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ CREATE ROLE pavel SUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS; │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze je v postgresu funkce generující náhodné číslo v zadaném rozsahu. K nim nyní přibyly funkce pro rozsah typů &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;timestamptz&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SELECT random(current_date - 6, current_date);&lt;br /&gt;
┌────────────┐&lt;br /&gt;
│   random   │&lt;br /&gt;
╞════════════╡&lt;br /&gt;
│ 2026-04-13 │&lt;br /&gt;
└────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT random(current_timestamp - interval &#039;1 week&#039;, current_timestamp);&lt;br /&gt;
┌───────────────────────────────┐&lt;br /&gt;
│            random             │&lt;br /&gt;
╞═══════════════════════════════╡&lt;br /&gt;
│ 2026-04-09 02:30:30.665819+02 │&lt;br /&gt;
└───────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Optimalizace&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Jako nejdůležitější optimalizaci v nové verzi vidím optimalizaci implementace kontroly referenční integrity. RI je v postgresu realizována v systémových řádkových triggerech, které, až doposud, provedly (pro každý řádek) jeden kontrolní SQL příkaz (s použitím SPI API - stejné API, které se používá např. v PL/pgSQL). Nově se hledá přímo v indexech - přeskakuje se celý aparát SQL. To je první výrazná optimalizace. Druhou výraznou optimalizací je hledání nikoliv jedné hodnoty, ale pole hodnot (n = 64). Podle autora patche je nyní kontrola referenční integrity cca 3x rychlejší. Pořád to bude znát. Výrazně se ale posune hranice, od kdy se vyplatí při masivních importech kontrolu referenční integrity vypínat.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE tab_a(id int PRIMARY KEY);&lt;br /&gt;
INSERT INTO tab_a SELECT generate_series(1,1000);&lt;br /&gt;
VACUUM ANALYZE tab_a;&lt;br /&gt;
&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b_no_ri(id int, a_id int);&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b(id int, a_id int references tab_a(id));&lt;br /&gt;
\timing&lt;br /&gt;
-- postgres 18&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 12844,206 ms (00:12,844)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 659,462 ms&lt;br /&gt;
&lt;br /&gt;
-- postgres 19&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 2728,073 ms (00:02,728)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 673,444 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ukázkový test je best case - zrychlení je cca čtyřnásobné. Stále je import s RI cca 4x pomalejší než bez RI (a to cílová tabulka obsahuje pouze jeden cizí klíč). V praxi to bude jiné - kromě RI je náročná i aktualizace indexů a samozřejmě všechny diskové operace.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Určitě každý, kdo pracuje s Postgresem trochu déle, se setkal s doporučením &amp;quot;nepoužívej &amp;lt;code&amp;gt;NOT IN (SELECT ...&amp;lt;/code&amp;gt;&amp;quot;. Důvodem byla (v některých případech) &amp;quot;špatná&amp;quot; optimalizace. Optimalizátor neměl garanci, že subselect nevrátí &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;. Poté, co se ve verzi 18 přepsal systém pro ukládání omezujících pravidel (constraints), už bylo možné do tuto informaci v optimalizátoru použít. Nyní se by se měl subselect &amp;lt;code&amp;gt;NOT IN&amp;lt;/code&amp;gt; transformovat na tzv anti-join (v těch případech, kdy je garantováno, že žádná proměnná v predikátu nebude &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;). Jinými slovy, pokud optimalizátor bude mít garance, že se v predikátu subselectu nevyskytne &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, tak vygeneruje stejný plán, jako kdybyste použili zápis s &amp;lt;code&amp;gt;NOT EXISTS&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE osoby(id int PRIMARY KEY, jmeno varchar);&lt;br /&gt;
CREATE TABLE faktury(id int primary key,&lt;br /&gt;
                     vlozeno timestamp,&lt;br /&gt;
                     podal int REFERENCES osoby(id) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT *&lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE id NOT IN (SELECT podal&lt;br /&gt;
                            FROM faktury);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT * &lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE NOT EXISTS(SELECT podal &lt;br /&gt;
                            FROM faktury&lt;br /&gt;
                           WHERE podal = osoby.id);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
-- ve starších verzích dostanete různé plány&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ve starších verzích spojení relací vždy předcházelo agregaci. To v některých případech může být neefektivní (pokud agregace výrazně redukuje počet řádek). Pokud jsem chtěl změnit pořadí operací, musel jsem si to vynutit zápisem (poddotazem). V devatenáctce optimalizátor podporuje tzv předběžnou agregaci (eager aggregation), která předbíhá před join:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT sum(pocet_zen + pocet_muzu), okresy.nazev &lt;br /&gt;
                  FROM okresy JOIN obce ON okresy.id = obce.okres_id&lt;br /&gt;
                 GROUP BY okresy.nazev;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                                QUERY PLAN                                                │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Finalize HashAggregate  (cost=157.38..158.15 rows=77 width=18)                                           │&lt;br /&gt;
│   Group Key: okresy.nazev                                                                                │&lt;br /&gt;
│   -&amp;gt;  Hash Join  (cost=3.02..157.00 rows=77 width=18)                                                    │&lt;br /&gt;
│         Hash Cond: ((obce.okres_id)::text = okresy.id)                                                   │&lt;br /&gt;
│         -&amp;gt;  Partial GroupAggregate  (cost=0.28..154.05 rows=77 width=15)                                 │&lt;br /&gt;
│               Group Key: obce.okres_id                                                                   │&lt;br /&gt;
│               -&amp;gt;  Index Only Scan using obce_okres_id_idx on obce  (cost=0.28..122.03 rows=6250 width=7) │&lt;br /&gt;
│         -&amp;gt;  Hash  (cost=1.77..1.77 rows=77 width=17)                                                     │&lt;br /&gt;
│               -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.77 rows=77 width=17)                                 │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(9 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Na datech pro ČR je výše uvedený dotaz cca 3x rychlejší (v pg19 vůči pg18).&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud je jeden řádek zamčený vícero transakcemi, tak se do jeho systémového atributu &amp;lt;code&amp;gt;xmax&amp;lt;/code&amp;gt; uloží tzv &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; (MultiXact je &amp;quot;aparát&amp;quot;, kterým se v Postgresu implementují řádkové zámky). To je unikátní identifikátor skupiny transakcí, které drží zámek. Každá skupina transakcí se skládá z tzv členských záznamů &amp;lt;code&amp;gt;MultiXactMember&amp;lt;/code&amp;gt;, ve kterých se drží identifikátor transakce, typ zámku a stav transakce. Také tyto záznamy mají své unikátní id &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Doposud &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; byla 32bitová hodnota. Nově je tato hodnota 64bitová, a nehrozí její přetečení. &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; i id transakcí jsou stále 32bitové hodnoty (existuje několik rozpracovaných řešení, které zvyšují jejich rozsah), takže stále hrozí přetečení těchto id, a nastartování vynuceného freezování (což u více zatížených systémů může způsobit problémy s produkcí). Eliminovala se ale možnost přetečení &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Je tp důležité, protože &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; rostl ze všech zmíněných id nejrychleji (pokud &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; je počet transakcí se sdílenými zámky, pak růst &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; je &amp;lt;code&amp;gt;nxn&amp;lt;/code&amp;gt;). Informace o MultiXact (skupinách transakcí) lze získat novou funkcí &amp;lt;code&amp;gt;pg_get_multixact_stats()&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přepracoval se kód, který implementuje příkazy &amp;lt;code&amp;gt;LISTEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NOTIFY&amp;lt;/code&amp;gt;. Předchozí verze probouzely každý proces, který čekal na notifikaci (bez ohledu na to jestli čekal nebo nečekal na kanálu, který dostal notifikaci). Stará implementace fungovala dobře, pokud počet použitých kanálů byl malý, a tudíž byla i malá šance, že se probudí proces, který čeká na jiném kanálu než je aktuální notifikace. Uživatelé ale začali notifikace používat i jinak, a reportovali výrazné zpomalení pokud větší množství klientů poslouchalo na větším množství různých kanálů. Ve zprávě ke patchi je uvedeno zpomalení (pro 1 klienta 9100 TPS, pro 1000 klientů 200 TPS). Nová implementace ve sdílené paměti ke každému kanálu drží seznam čekajících klientů. V případě zprávy do některého kanálu se probudí pouze procesy, které na tomto kanálu poslouchají (i zde je vidět pokles TPS, ale výrazně menší - pro 1000 klientů 9000 TPS).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Výchozí komprimace TOASTu bude &amp;lt;code&amp;gt;lz4&amp;lt;/code&amp;gt; (namísto &amp;lt;code&amp;gt;pglz&amp;lt;/code&amp;gt;). LZ4 je jako volba už cca 5 let, a měla by být efektivnější (jak v komprimaci, tak ve využití CPU) než původní LZ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Postupně víc funkcí je akcelerováno pomocí SIMD. Nově to jsou funkce &amp;lt;code&amp;gt;hex_encode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hex_decode&amp;lt;/code&amp;gt; a parsování csv, tsv formátů příkazu &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; (hledání speciálních znaků).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Některé extenze, jako např. &amp;lt;code&amp;gt;pgstattuple&amp;lt;/code&amp;gt;, nově používají direct API pro čtení dat (implementované v pg18). Na systémech s rychlým IO by měly běžet rychleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Na základě reportů uživatelů se upravila implementace hashjoinu, tak aby nedocházelo k extrémnímu nárůstu alokace paměti v případech, kdy atribut použitý pro spojení relací obsahuje velké množství &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; hodnot.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V těch případech, kdy je garantováno, že porovnávané hodnoty jsou ne nullové, tak se operátor &amp;lt;code&amp;gt;IS DISTICT FROM&amp;lt;/code&amp;gt; nahradí operátorem &amp;lt;code&amp;gt;&amp;lt;&amp;gt;&amp;lt;/code&amp;gt;, případně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM&amp;lt;/code&amp;gt; operátorem &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;. Tady je otázkou, jaký bude reálný dopad. Jako programátor používám &amp;lt;code&amp;gt;IS [ NOT ] DISTINCT FROM&amp;lt;/code&amp;gt; jedině v těch případech, které komplikují potenciální NULLy. Je ale pravdou, že drtivou většinu SQL, dnes generují ORM frameworky, ktere nemusí mít vždy dostatečnou chytrost. Výraz &amp;lt;code&amp;gt;IS DISTINCT FROM NULL&amp;lt;/code&amp;gt; se nyní transformuje na &amp;lt;code&amp;gt;IS NOT NULL&amp;lt;/code&amp;gt;, obdobně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM NULL&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Replikace&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dlouhodobým cílem implementace logické replikace je podpora multimaster řešení. Zatím je k tomu ještě dlouhá cesta. Chybí podpora replikace DDL příkazů, plná podpora sekvencí, plná podpora řešení replikačních kolizí. Postupuje se v malých krocích. Letos je to podpora jednorázového refrešnutí sekvencí &amp;lt;code&amp;gt;ALTER SUBSCRIPTION ... REFRESH SEQUENCES&amp;lt;/code&amp;gt;. S multimasterem to úplně nepomůže, ale může to zjednodušit upgrade skrze logickou replikaci.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Novým příkazem je příkaz &amp;lt;code&amp;gt;WAIT FOR&amp;lt;/code&amp;gt;, který je možné použít na replikách, a který zajistí čekání na zreplikování zadané transakce. Lze nastavit timeout. Parametrem &amp;lt;code&amp;gt;NO_THROW&amp;lt;/code&amp;gt; zajistí tiché (bez výjimky) ukončení příkazu po timeoutu (změní se pouze vrácená hodnota):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# WAIT FOR LSN &#039;0/306EE20&#039; WITH (TIMEOUT &#039;100ms&#039;, NO_THROW);&lt;br /&gt;
 status&lt;br /&gt;
--------&lt;br /&gt;
 timeout&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V příkazu &amp;lt;code&amp;gt;CREATE PUBLICATION ... FOR ALL TABLES&amp;lt;/code&amp;gt; je nyní možné použít klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE (t1, ...)&amp;lt;/code&amp;gt;. Klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE&amp;lt;/code&amp;gt; lze použít i v příkazu &amp;lt;code&amp;gt;ALTER PUBLICATION&amp;lt;/code&amp;gt;. Pro registraci odběru (&amp;lt;code&amp;gt;CREATE SUBSCRIPTION&amp;lt;/code&amp;gt;) lze místo explicitního connection stringu použít odkaz na dříve definovaný FDW server.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V pohledu &amp;lt;code&amp;gt;pg_replication_slots&amp;lt;/code&amp;gt; je nový sloupec &amp;lt;code&amp;gt;slotsync_skip_reason&amp;lt;/code&amp;gt; popisující důvod, proč nebylo možné synchronizovat repliku. V tom případě bude obsahovat jednu z následujících hodnot: &amp;lt;code&amp;gt;wal_or_rows_removed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wal_not flushed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;no_consistent_snapshot&amp;lt;/code&amp;gt; nebo 	&amp;lt;code&amp;gt;slot_invalidated&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud při registraci odběru nastavíme parametr &amp;lt;code&amp;gt;retain_dead_tuples&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; (výchozí nastavení je &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;), budou se detekovat kolize update-delete, kdy nedojde k update z důvodu smazaného řádku. Pozor, tato volba dočasně blokuje vakuování zrušených řádků (zvlášť pokud je replika nedostupná a nedochází k synchronizaci). Lze nastavit timeout &amp;lt;code&amp;gt;max_retention_duration&amp;lt;/code&amp;gt;, samozřejmě pak ovšem může dojít ke kolizi update-delete. Bez detekce této kolize může dojít k tiché nekonzistenci obsahu napříč různými zdroji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Ostatní&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; podporuje formát &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt; (pouze export).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT JSON&lt;br /&gt;
{&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT (FORMAT JSON, FORCE_ARRAY)&lt;br /&gt;
[&lt;br /&gt;
 {&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nyní také tento příkaz podporuje volbu &amp;lt;code&amp;gt;ON_ERROR SET_NULL&amp;lt;/code&amp;gt;, která způsobí ignorování hodnot, na kterých selže typová konverze. To je možné díky tomu, že se již dříve zavedla podpora tzv měkkých chyb (soft errors). Tyto chyby lze ošetřit s řádově menší režií než běžné chyby (nejsou potřeba subtransakce). Podpora soft errors se v Postgresu objevila s podporou klauzule &amp;lt;code&amp;gt;ON ERROR&amp;lt;/code&amp;gt; SQL/JSON funkcí. V plánu je podpora error safe přetypování (&amp;lt;code&amp;gt;CAST expr AS type xxx DEFAULT expr ON CONVERSION ERROR&amp;lt;/code&amp;gt;). Prvním nezbytným krokem je požadavek, aby konverzní funkce používaly měkké chyby. To teď v upstreamu je, a díky tomu, bylo i relativně jednoduché implementovat &amp;lt;code&amp;gt;COPY ON_ERROR SET_NULL&amp;lt;/code&amp;gt; (error safe casts by měly být v pg20).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, b int);&lt;br /&gt;
&lt;br /&gt;
COPY foo FROM stdin (FORMAT csv, ON_ERROR SET_NULL);&lt;br /&gt;
Enter data to be copied followed by a newline.&lt;br /&gt;
End with a backslash and a period on a line by itself, or an EOF signal.&lt;br /&gt;
&amp;gt;&amp;gt; 10,20&lt;br /&gt;
&amp;gt;&amp;gt; 30,40&lt;br /&gt;
&amp;gt;&amp;gt; ahoj,20&lt;br /&gt;
&amp;gt;&amp;gt; \.&lt;br /&gt;
COPY 3&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM foo;&lt;br /&gt;
┌────┬────┐&lt;br /&gt;
│ a  │ b  │&lt;br /&gt;
╞════╪════╡&lt;br /&gt;
│ 10 │ 20 │&lt;br /&gt;
│ 30 │ 40 │&lt;br /&gt;
│  ∅ │ 20 │&lt;br /&gt;
└────┴────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově také příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; umožňuje číst přímo partišny (partitions). V předchozích verzích bylo nutné použít syntax s vloženým selectem, což má nějakou režii.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce pro zakódování a dekódování textu (&amp;lt;code&amp;gt;encode&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;decode&amp;lt;/code&amp;gt;) nově podporují kódování &amp;lt;code&amp;gt;base64url&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;base32hex&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 41686f6a3c3e2f2b │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base64url&#039;);&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│   encode    │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ QWhvajw-Lys │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base32hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 85K6UQHS7ONIM=== │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dokončit implementaci standardu SQL/JSON, konkrétně implementaci funkce &amp;lt;code&amp;gt;JSON_TABLE&amp;lt;/code&amp;gt; se opět nestihlo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;psql&amp;lt;/code&amp;gt; bude možnost si nastavit zobrazení logických hodnot &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Datový typ &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; akceptuje literály &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Na výstupu se zobrazuje pouze &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
\pset display_true true&lt;br /&gt;
Boolean true display is &amp;quot;true&amp;quot;.&lt;br /&gt;
\pset display_false false&lt;br /&gt;
Boolean false display is &amp;quot;false&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ true     │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT 1 &amp;lt;&amp;gt; 1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ false    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Může se hodit možnost si zobrazit &amp;lt;code&amp;gt;search_path&amp;lt;/code&amp;gt; v promptu. V promptu je také možnost použít symbol &amp;lt;code&amp;gt;%i&amp;lt;/code&amp;gt;, který se nahradí replikačním statusem (&amp;lt;code&amp;gt;primary&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;standby&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;PL/pgSQL&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;PL/pgSQL je relativě stabilizované prostředí, kde je každoročně jen minimum změn. Letos je to jedna malá (a pro většinu uživatelů zanedbatelná změna), a jedna &amp;quot;velká&amp;quot;, která ale interně žádnou změnou není.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou změnou je interní optimalizace exekuce embedded SQL ve tvaru  &amp;lt;code&amp;gt;SELECT výraz INTO proměnná&amp;lt;/code&amp;gt;. Mám pocit, že tento zápis se používal v Sybase a na Sybase navazujících databázích pro inicializaci proměnných. Já jsem se s tímto zápisem setkával v literatuře někdy kolem roku 2000, a už tehdy platilo doporučení tento zápis nepoužívat (v plpgsql se nikdy moc nepoužíval). V posledních letech přišlo víc uživatelů z MSSQL (začalo se migrovat víc aplikací z tohoto serveru), tento zápis používali a zjistili, že tento zápis je cca 20x pomalejší než &amp;quot;nativní&amp;quot; přiřazení &amp;lt;code&amp;gt;proměnna := výraz&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Interně jsou v PL/pgSQL dvě metody jak vyhodnotit výraz. Tzv simple metoda, kde se přeskočí SQL exekutor a přímo zavolá exekutor výrazů, je výrazně rychlejší. Druhou metodou je běžná exekuce skrze SQL exekutor (a SPI API). Až doposud, cokoliv co v zdrojovém kódu funkce bylo SQL příkazem (zde příkazem &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;) se vykonalo běžnou cestou. Nově se detekuje výše zmíněný zápis a vykoná se simple metodou. Pro dlouholeté uživatele Postgresu to nic neznamená, ale lidem, kteří migrují z MSSQL, to může zpříjemnit život.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Druhou, a naopak, velkou změnou je možnost inliningu funkce, která je napsaná v PL/pgSQL (ve speciálních případech). Inlining v kontextu Postgresu je trochu něco jiného než si uživatele představí pod termínem inlining. V Postgresu mohou být funkce volané z nějakého SQL příkazu - typicky příkazu &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;. Pokud nějaká funkce podporuje inlining, tak to znamená, že v AST stromu dotazu se volání funkce nahradí jejím tělem. Teprve pak nastupuje optimalizace, a díky inliningu vlastně optimalizátor vidí dovnitř funkce (jinak je funkce pro optimalizátor black box).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;K tomu, aby PL/pgSQL (nejen v PL/pgSQL) funkce mohla být inlinovaná, potřebujete vlastní kód v Cčkové extenzi. A je to vlastně trik (v tomto případě dost nestydatý podfuk :-)). Už dříve bylo možné napsat extenze, které dodávaly optimalizátoru znalost o vybraných funkcích (jinak, opět, pro optimalizátor, jsou funkce black box). Přímo v jádru je například podpora optimalizátoru pro funkci &amp;lt;code&amp;gt;generate_series&amp;lt;/code&amp;gt; (staré verze pg by v rows měly 1000).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT * FROM generate_series(1,3);&lt;br /&gt;
┌────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                             QUERY PLAN                             │&lt;br /&gt;
╞════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Function Scan on generate_series  (cost=0.00..0.03 rows=3 width=4) │&lt;br /&gt;
└────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Inlining byl dřive podporován pro funkce v jazyku SQL, kdy si planner vytáhl zdrojový kód funkce. V devatenáctce planner může zavolat extenzi, a může si říct nejen o detailnější parametry ohledně exekuce, ale může si říct o substituční SQL. Když ho dostane, tak funkci dále neřeší, a pracuje se substitučním SQL příkazem. Je to docela magie, nicméně efektivní. Kód extenze se volá až v momentu, kdy známe konstantní parametry funkce, a extenze se může rozhodnout - zavolej volanou funkci, nebo zavolej nějaké SQL, zavolej jinou funkci, případně vrať rovnou nějakou speciální hodnotu &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, 0, ... Je to i způsob, jak opravdu efektivně pracovat s dynamickým SQL. Musíte si ovšem napsat kód v Cčkové extenzi. Požadavek na tuto funkcionalitu přišel od vývojářů PostGISu. Cílem jsou optimalizace v PostGISu, dá se to ale použít i jinde. Časem si dovedu představit i nějakou contrib extenzi, která by tuto možnost zpřístupnila i bez nutnosti psát si vlastní extenzi. Škoda, že nemám autoritu vývojářů PostGISu. Dovedl bych si představit podobný trik v analyzátoru. Dost by mi to pomohlo s Orafce. V té pozici samozřejmě nejsem.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Vývoj&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Každoročně dochází k čištění kódu. Občas se zruší podpora některé platformy. Výjimečně se přidá podpora nové platformy nebo jako v případě pg19 se vrátí podpora dříve odstraněné platformy (AIX - operační systém AIX přestal být podporovaný v pg17 díky nezájmu IBM. Pak se ale v IBM chytli za nos, dodali počítač do testovací farmy, a do AIXu přidali aktualizovaný software potřebný k buildu Postgresu). Další čistky v kódu lze provést přechodem na novější verzi programovacího jazyka - přechodem z C99 na C11 (bohužel to může znamenat, že starých platformách se nové verze Postgresu nepřeloží). Interní datový typ &amp;lt;code&amp;gt;Datum&amp;lt;/code&amp;gt; až do předchozí verze byl 4bajtový na 32bitových platformách a 8bajtový na 64bitových platformách. Nově je 8bajtový na všech podporovaných platformách. Určitě nezanedbatelná část kódu se generuje z definičních souborů. Nově se z definic generuje kód definující konfigurační proměnné. Údržba, verzování, zajištění konzistence definičních souborů je násobně jednodušší než údržba adekvátního kódu v Cčku. Dynamická alokace paměti bude jednodušší díky funkcím &amp;lt;code&amp;gt;GetNamedDSA&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;GetNamedDSMSegment&amp;lt;/code&amp;gt;. Dynamicky sdílenou paměť lze sledovat skrze pohled &amp;lt;code&amp;gt;pg_dsm_registry_allocations&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Mám pocit, že vývoj Postgresu ještě víc zrychlil - je vidět mnohem víc patchů od lidí z Asie (dříve to bylo spíš jenom Japonsko), a o to víc se naráží na kapacitu committerů. Je to paradox, který nejde jednoduše řešit. Postgres je populární díky funkcionalitě a stabilitě. Stabilita je díky pečlivé práci commitetterů (důkladně se řeší každý řádek kódu). Díky popularitě je více programátorů, kteří píší více kódu, více patchů, ale committeři nestíhají, a tak patche zůstávají relativně dlouho ve frontě. Což frustruje programátory. Patch napíšete během měsíce, během měsíce se dá udělat finalizace a pár iterací s committerem, ale mezitím několik měsíců (v horším případě let (3 roky i v případě bezproblémového malého patche)), čekáte, až si na vás některý z committerů udělá čas. Celou dobu musíte udržovat patch v aplikovatelném stavu, musíte reagovat na případné diskuze, musíte sledovat vývoj a případně aktualizovat patch. Je to problém o kterém se ví, diskutuje se o něm, ale není úplně jasné, co by mělo být řešení. Minimálně se zlepšila evidence patchů, která pokrývá i automatické testování na několika různých platformách. Tady je velká klika, že Postgres má extenze. Neskutečně velký objem kódu (funkcionality) je dnes možné řešit skrz extenze mimo komunitu - což výrazně snižuje tlak na committery. V extenzích toho jde udělat hodně, bohužel, ne všechno. Na druhou stranu, extenze také nejsou bez rizika. Určitým způsobem zvyšují fragmentaci ekosystému Postgresu, který pak ztrácí přehlednost (plus ne všechny extenze jsou dostupné v cloudu). Zase, díky tomu je jádro Postgresu stále ještě rozumně velké. O Oracle se kolují zvěsti, že jádro má 14 miliónů řádek, Postgres pod 2 milióny. Náklady na údržbu Postgresu jsou výrazně menší. Kompilace zdrojáků je do 5 minut, regresní testy v největším rozsahu běží 15 minut. S tím ještě lze nějak rozumně pracovat. O Oracle jsem slyšel, že regresní testy běží den.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Popularita Postgresu jde aktuálně až do absurdna. Z Linkedinu mám pocit, že začíná být přepostgresováno (samozřejmě z mé perspektivy a v mé bublině). Hromada příspěvků vygenerovaných AI jsou banality na úrovni žáka prvního stupně (Postgres má VACUUM, indexy jsou super, dotazy mohou být pomalé, atd atd). Doporučení typu - proč ne Redis, proč ne Elastic, na všechno použijte Postgres. Viděl jsem hromadu clickbaitových článků typu - multigenerační architektura Postgresu je tragická, ale s naší AI nebo s naším supportem nebudete mít problém, atd atd. Postgresu dnes rozumí každý, kdo dokáže do AI napsat Postgres. Měl jsem tu možnost vidět naprosto neadekvátní doporučení ohledně konfigurace (dnes nevíte jestli důvodem je neznalost autora nebo naopak jeho vychytralost a snaha o co nejvíc komentářů případně o troling). Historicky popularita Postgresu rostla ve stínu MySQL, Monga a dalších databází a roky byl Postgres ušetřený mediálního balastu. To bohužel už není pravda. Pořád platí, že Postgres je dobrá databáze, stabilní, relativně rychlá, která se ale rozhodně nehodí na vše. Má svoje limity, které je dobré znát, a rozhodně nemůže ve všech ohledech (ve větším rozsahu) nahradit Redis, MySQL nebo Mongo případně Kafku. To je nesmysl, a není to ani cílem komunity. Základem jakékoliv práce je znát limity, chování, a správně v souladu s celkem, používat správné nástroje.&amp;lt;/p&amp;gt;&lt;br /&gt;
----------&lt;br /&gt;
&amp;lt;DPL&amp;gt;category=Verze PostgreSQL&amp;lt;/DPL&amp;gt;&lt;br /&gt;
[[Category:Články]]&lt;br /&gt;
[[Category:Verze PostgreSQL]]&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1582</id>
		<title>PostgreSQL 19 (2026)</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=PostgreSQL_19_(2026)&amp;diff=1582"/>
		<updated>2026-05-10T03:08:40Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: založena nová stránka s textem „Autor: Pavel Stěhule  &amp;lt;h2&amp;gt;PostgreSQL 19 (2026)&amp;lt;/h2&amp;gt;   &amp;lt;p&amp;gt;O předchozích verzích jsem napsal, že změny byly primárně interní. Z pohledu uživatele, který chce vidět novou SQL syntax, se toho v posledních verzích moc nestalo. Devatenáctka je jiná. Tam je viditelných změn opravdu hodně. Jako každý rok - nová verze je pelmel nových funkcí a různých vylepšení menších nebo větších.&amp;lt;/p&amp;gt;  &amp;lt;h3&amp;gt;Administrace&amp;lt;/h3&amp;gt; &amp;lt;p&amp;gt;Bloating tabule…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Autor: Pavel Stěhule&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h2&amp;gt;PostgreSQL 19 (2026)&amp;lt;/h2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;O předchozích verzích jsem napsal, že změny byly primárně interní. Z pohledu uživatele, který chce vidět novou SQL syntax, se toho v posledních verzích moc nestalo. Devatenáctka je jiná. Tam je viditelných změn opravdu hodně. Jako každý rok - nová verze je pelmel nových funkcí a různých vylepšení menších nebo větších.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Administrace&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Bloating tabulek může být problém. Skoro všude jsem se setkal se situací, kdy &amp;quot;mazací&amp;quot; skript přestal fungovat (z různých důvodů), přičemž se tato chyba detekovala příliš pozdě, kdy dotčené tabulky měly místo jednotek GB například desítky GB. To už musí zaúřadovat &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, což často znamená vynucenou plánovanou odstávku (kvůli držení exkluzivního zámku). Je to letitý problém, který zkušenější uživatelé řešili buďto pečlivějším monitoringem, v některých případech partišningem (partitioning), případně extenzemi &amp;lt;code&amp;gt;pg_repack&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt;. Autor posledně jmenované extenze Tonda (Antonín Houska) spolu s Alvarem (Alvaro Herrera) poslední dva roky pracovali na integraci &amp;lt;code&amp;gt;pg_squeeze&amp;lt;/code&amp;gt; do jádra Postgresu. Paradoxně příkaz, který bude provádět zdrcnutí tabulek, se bude jmenovat &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt;. Základem je logická replikace - zadaná tabulka se lokálně zreplikuje (vytvoří se její nová kopie, a tím se zbaví vnitřního neobsazeného místa). Co je zásadní, je možnost použít volbu &amp;lt;code&amp;gt;CONCURRENTLY&amp;lt;/code&amp;gt;. S touto volbou příkaz nepoužije exkluzivní zámek. Tudíž je možné jej použít za provozu. Nutnou podmínkou je existence primárního klíče (a unikátního indexu).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
REPACK (CONCURRENTLY, VERBOSE) obce;&lt;br /&gt;
INFO:  repacking &amp;quot;public.obce&amp;quot; in physical order&lt;br /&gt;
INFO:  &amp;quot;public.obce&amp;quot;: found 0 removable, 6250 nonremovable row versions in 59 pages&lt;br /&gt;
DETAIL:  0 dead row versions cannot be removed yet.&lt;br /&gt;
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.&lt;br /&gt;
REPACK&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Kromě toho, že příkaz &amp;lt;code&amp;gt;REPACK&amp;lt;/code&amp;gt; nahrazuje příkaz &amp;lt;code&amp;gt;VACUUM FULL&amp;lt;/code&amp;gt;, tak tento příkaz ještě nahrazuje příkaz &amp;lt;code&amp;gt;CLUSTER&amp;lt;/code&amp;gt;, kterým se tabulka fyzicky (jednorázově) přeuspořádá podle zadaného indexu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Možná jste si všimli, že dotaz běžící pod příkazem &amp;lt;code&amp;gt;EXPLAIN ANALYZE&amp;lt;/code&amp;gt; je výrazně pomalejší. Důvodem je měření času - executor, v tomto režimu, neustále poptává aktuální čas, a to má brutální režii. U větších dotazů se vyplatí použít volbu &amp;lt;code&amp;gt;TIMING OFF&amp;lt;/code&amp;gt;. V 19 na x86 se místo systémového času použíjí takty CPU. Je to výrazně rychlejší - zatímco na osmnáctce mi jednoduchý testovací dotaz běžel 2.5x pomalejší v explainu, na devatenáctce pouze 1.5x pomaleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou velkou změnou je vypnutí JIT ve výchozí konfiguraci. JIT se objevil v Postgresu 11, a v Postgresu 12 byl zapnutý ve výchozí konfiguraci. Bohužel se zjistilo, že většině uživatelů, kteří Postgres používají pro OLTP, dělá víc škody než užitku. Došlo to až do stavu, kdy se uživatelům doporučovalo, neoficiálně, po instalaci JIT vypnout. Je tam víc problémů. &amp;lt;code&amp;gt;clang&amp;lt;/code&amp;gt;, na kterém je to postavené, v novějších verzích kompiluje lépe, ale pomaleji. Existují alternativní implementace JIT, ale všechny jsou více než méně experimentální. Druhým problémem je model, na jehož základě se JIT aktivuje. Tento model jednak nedokáže dobře odhadnout náročnost &amp;quot;jitifikace - inliningu, a navíc je citlivý na přestřelení odhadu počtu řádek. Ohledně modelu a citlivosti na odhady pochybuji, že se dá něco dělat. Alternativní implementace JIT mají výrazně nižší režii. Přijde mi to ale jako slepá cesta. Budoucnost vidím v integraci vektorového executoru a vektorových funkcí (tak jak to používá &amp;lt;a href=&amp;quot;https://duckdb.org/&amp;quot;&amp;gt;DuckDB&amp;lt;/a&amp;gt;). Může to znamenat, že Postgres bude mít duální implementace funkcí (pro skalární parametr, a pro vektor parametrů).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze vytvořit replikační slot pro logickou replikaci, bez nutnosti mít konfiguraci &amp;lt;code&amp;gt;wal_level=logical&amp;lt;/code&amp;gt;. Postačuje nastavení &amp;lt;code&amp;gt;replica&amp;lt;/code&amp;gt;, což je výchozí nastavení. Jakmile je logický replikační slot aktivní, interně se úroveň zápisu do transakčního logu nastaví na &amp;lt;code&amp;gt;logical&amp;lt;/code&amp;gt;. Jaký je aktuální stav zjistíte v konfigurační proměnné &amp;lt;code&amp;gt;effective_wal_level&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Další bombou je možnost zapínat nebo vypínat kontrolní součty (na úrovni datových stránek) za běhu. Kontrolní součty jsou v Postgresu už relativně dlouho, a ačkoliv na dnešním hardware je jejich režie zanedbatelná, tak určitě bude dost databází, kde nebudou zapnuté. Zapnutí kontrolních součtů vyžadovalo odstávku úměrnou velikosti databáze. Navíc se silně doporučuje po zapnutí součtů znovu zreplikovat všechny fyzické repliky. Výhodou je diagnostika, možnost identifikovat poškozené stránky (a přeskočit je), možnost vyrobit replikovaný server ze starého primárního příkazem &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt;. Naplánovat a provést delší odstávku někde nemusí být jednoduché (nebo to může být skoro nemožné). U jednoho mého klienta zapnutí kontrolních součtů na cca 2TB databázi trvalo cca 2 hodiny (na vlastním hardware z roku 2025). Zapnutí se provede voláním funkce &amp;lt;code&amp;gt;pg_enable_data_checksums&amp;lt;/code&amp;gt;. Nastavením volitelných parametrů lze běh funkce zpomalit, tak aby nepřetěžovala IO. Vypnutí provede funkce &amp;lt;code&amp;gt;pg_disable_data_checksums&amp;lt;/code&amp;gt;. Stav procesu můžeme vidět v pohledu &amp;lt;code&amp;gt;pg_stat_progress_data_checksums&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Snad se už konečně vyřešil problém s upgradem databází obsahující extrémně velký počet LO (large objects). Nově binární upgrade (&amp;lt;code&amp;gt;pg_upgrade&amp;lt;/code&amp;gt;) použije pro export metadat LO příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; místo původní sekvence příkazů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- původní sekvence&lt;br /&gt;
SELECT pg_catalog.lo_create(&#039;5432&#039;);&lt;br /&gt;
ALTER LARGE OBJECT 5432 OWNER TO alice;&lt;br /&gt;
GRANT SELECT ON LARGE OBJECT 5432 TO bob;&lt;br /&gt;
&lt;br /&gt;
-- nově&lt;br /&gt;
COPY pg_catalog.pg_largeobject_metadata (oid, lomowner, lomacl) FROM stdin;&lt;br /&gt;
5432 16384 {alice=rw/alice,bob=r/alice}&lt;br /&gt;
\.&lt;br /&gt;
&lt;br /&gt;
COPY pg_catalog.pg_shdepend (dbid, classid, objid, objsubid, refclassid, refobjid, deptype) FROM stdin;&lt;br /&gt;
5 2613 5432 0 1260 16384 o&lt;br /&gt;
5 2613 5432 0 1260 16385 a&lt;br /&gt;
\.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Nová implementace by měla být řádově rychlejší.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konečně se dotáhlo do konce začlenění podpory více formátů v příkazu &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Postgres má dva základní příkazy pro export (backup) - &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt;. Historicky tyto příkazy podporovaly pouze &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; formát. Postupem času &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt; získal možnost exportu do &amp;lt;code&amp;gt;custom&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;dictionary&amp;lt;/code&amp;gt; formátu plus import příkazem &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umožňoval paralelní import více tabulek. &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; byl díky podpoře pouze SQL formátu dost omezený. To se nyní změnilo, a v &amp;lt;code&amp;gt;pg_dumpall&amp;lt;/code&amp;gt; jsou podporovány všechny formáty, které podporuje &amp;lt;code&amp;gt;pg_dump&amp;lt;/code&amp;gt;. Vypadá to trochu jako workaround. V případě, že se použije jiný než &amp;lt;code&amp;gt;plain text&amp;lt;/code&amp;gt; (SQL) formát, tak se vyrobí adresář, který do podadresářů uloží výstup z &amp;lt;code&amp;gt;pg_dumpu&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;pg_restore&amp;lt;/code&amp;gt; umí s touto adresářovou strukturou pracovat. Tato možnost se dostala už do 18tky, ale byla na poslední chvíli stažena.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;pg_rewind&amp;lt;/code&amp;gt; zredukovalo kopírování WAL logů z nového primárního serveru na budovanou repliku a to tak, že se budou kopírovat pouze WAL logy vzniklé po rozpadu replikace. V mnoha scénářích se tím výrazně urychlí běh tohoto příkazu.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Doposud autovacuum vybíralo tabulky k vakuování na základě porovnání vypočítaných koeficientů a prahových hodnot. Pořadí vybraných tabulek záleželo na fyzickém pořadí v systémové tabulce &amp;lt;code&amp;gt;pg_class&amp;lt;/code&amp;gt;. Nově se vakuum bude prioritizovat podle míry vzdálenosti od prahu. Dalším kritériem je stáří tabulky (počet transakcí od freeze). Stará implementace byla férová v tom, že garantovala, že každá tabulka bude zvakuovaná a že žádná tabulka nebude &amp;quot;předbíhat&amp;quot; ve frontě. Na druhou stranu se mohlo stát, že tabulka s intenzivnějším provozem čekala příliš dlouho a došlo k zbytečnému bloatingu. Nová implementace se snaží být chytřejší. Uvidíme, jak to bude fungovat. Moje zkušenost je taková, že a) není dobré dávat do Postgresu příliš dynamická data, b) je dobré si nastavit počet aktivních autovacuum workerů tak, aby byla určitá rezerva, c) není dobré vytěžovat IO na maximum (je dobré mít dostatečně nadimenzované IO a mít nějakou rezervu). Skóre tabulek můžeme sledovat v pohledu &amp;lt;code&amp;gt;pg_stat_autovacuum_score&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_autovacuum_scores WHERE score &amp;gt; 0.05;&lt;br /&gt;
┌─[ RECORD 1 ]────────┬──────────────────────┐&lt;br /&gt;
│ relid               │ 1262                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_database          │&lt;br /&gt;
│ score               │ 0.15936254737880529  │&lt;br /&gt;
│ xid_score           │ 1e-07                │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0.0793650769622719   │&lt;br /&gt;
│ vacuum_insert_score │ 0.003998400542165933 │&lt;br /&gt;
│ analyze_score       │ 0.15936254737880529  │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
╞═[ RECORD 2 ]════════╪══════════════════════╡&lt;br /&gt;
│ relid               │ 1214                 │&lt;br /&gt;
│ schemaname          │ pg_catalog           │&lt;br /&gt;
│ relname             │ pg_shdepend          │&lt;br /&gt;
│ score               │ 0.12                 │&lt;br /&gt;
│ xid_score           │ 1.15e-07             │&lt;br /&gt;
│ mxid_score          │ 0                    │&lt;br /&gt;
│ vacuum_score        │ 0                    │&lt;br /&gt;
│ vacuum_insert_score │ 0.006                │&lt;br /&gt;
│ analyze_score       │ 0.12                 │&lt;br /&gt;
│ do_vacuum           │ f                    │&lt;br /&gt;
│ do_analyze          │ f                    │&lt;br /&gt;
│ for_wraparound      │ f                    │&lt;br /&gt;
└─────────────────────┴──────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově autovacuum může použít &amp;lt;code&amp;gt;VACUUM&amp;lt;/code&amp;gt; s podporou paralelismu.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přehled o aktuálním stavu recovery je k dispozici v pohledu &amp;lt;code&amp;gt;pg_stat_recovery&amp;lt;/code&amp;gt;. V pohledu &amp;lt;code&amp;gt;pg_stat_statements&amp;lt;/code&amp;gt; jsou dva nové sloupce &amp;lt;code&amp;gt;generic_plan_calls&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;custom_plan_calls&amp;lt;/code&amp;gt; zobrazující kolikrát předpřipravený příkaz (prepared statement) použil generický nebo zákaznický plán. Nový sloupec &amp;lt;code&amp;gt;wal_fpi_bytes&amp;lt;/code&amp;gt; zobrazuje velikost zápisu tzv. plných stránek do transakčního logu. Vysoká hodnota může signalizovat nepříjemně velkou četnost vynucených checkpointů (je nutné zvednout &amp;lt;code&amp;gt;max_wal_size&amp;lt;/code&amp;gt; případně &amp;lt;code&amp;gt;checkpoint_timeout&amp;lt;/code&amp;gt;). V novém pohledu &amp;lt;code&amp;gt;pg_stat_lock&amp;lt;/code&amp;gt; uvidíme počet a celkový čas čekání na různé typy zámků. Zaznamenány jsou pouze ty situace, kdy se čeká na zámek déle než jednu sekundu (stejně jako např. &amp;lt;code&amp;gt;log_lock_waits&amp;lt;/code&amp;gt;, které je v nyní ve výchozí konfiguraci zapnuté). Bohužel zámky, které trvají cca 100ms, mající nepříjemný dopad na dotazy kolem 10ms, zde neuvidíme:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT * FROM pg_stat_lock ;&lt;br /&gt;
┌──────────────────┬───────┬───────────┬───────────────────┬───────────────────────────────┐&lt;br /&gt;
│     locktype     │ waits │ wait_time │ fastpath_exceeded │          stats_reset          │&lt;br /&gt;
╞══════════════════╪═══════╪═══════════╪═══════════════════╪═══════════════════════════════╡&lt;br /&gt;
│ relation         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ extend           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ frozenid         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ page             │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ tuple            │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ transactionid    │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ virtualxid       │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ spectoken        │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ object           │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ userlock         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ advisory         │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
│ applytransaction │     0 │         0 │                 0 │ 2026-04-17 07:43:12.415431+02 │&lt;br /&gt;
└──────────────────┴───────┴───────────┴───────────────────┴───────────────────────────────┘&lt;br /&gt;
(12 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze Postgres podporuje asynchronní IO. Čtení je realizováno dedikovanými procesy (workers). Počáteční implementace pracovala s konfigurovatelným počtem těchto procesů (výchozí nastavení mělo hodnotu 3). Nově je správa workerů dynamičtější - v případě potřeby si je Postgres nastartuje nebo naopak zavře. Místo fixního počtu nyní nastavujeme minimální a maximální počet workerů:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io_min_workers=2&lt;br /&gt;
io_max_workers=8 (up to 32)&lt;br /&gt;
io_worker_idle_timeout=60s&lt;br /&gt;
io_worker_launch_interval=100ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Poměrně razantně se změnila konfigurace &amp;lt;code&amp;gt;log_min_messages&amp;lt;/code&amp;gt;, která udává, na které úrovni se mají chyby zapsat do systémového logu (&amp;lt;code&amp;gt;DEBUG5&amp;lt;/code&amp;gt;..&amp;lt;code&amp;gt;PANIC&amp;lt;/code&amp;gt;). Nově lze tuto úroveň nastavit pro každý typ procesu (&amp;lt;code&amp;gt;archiver&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;autovacuum&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;backend&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;bgworker&amp;lt;/code&amp;gt;, ...) např. &amp;lt;code&amp;gt;error, walsender:debug1, autovacuum:debug1&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Správa partišen (partitions) byla v Postgresu základní. Díky možnosti sloučit nebo rozdělit partišny (partitions) se dostává trochu dál. Je to spíš první krok se spoustou omezení - používá se pouze jedno CPU a po celou dobu je exkluzivně zamknutá rodičovská tabulka. Ale i tak to může dost uživatelům ušetřit práci (a jejich vlastní řešení by pravděpodobně mělo stejná omezení):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER TABLE sales_list MERGE PARTITIONS (sales_west, sales_east, sales_central)  INTO sales_all;&lt;br /&gt;
&lt;br /&gt;
ALTER TABLE measurement SPLIT PARTITION measurement_y2006q1 INTO&lt;br /&gt;
   (PARTITION measurement_y2006m01 FOR VALUES FROM (&#039;2006-01-01&#039;) TO (&#039;2006-02-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m02 FOR VALUES FROM (&#039;2006-02-01&#039;) TO (&#039;2006-03-01&#039;),&lt;br /&gt;
    PARTITION measurement_y2006m03 FOR VALUES FROM (&#039;2006-03-01&#039;) TO (&#039;2006-04-01&#039;));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Oproti předchozím verzím lze zapínat a vypínat všechny typy omezení (nejen cizí klíče):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, CONSTRAINT cc CHECK(a &amp;gt; 0) NOT ENFORCED); &lt;br /&gt;
CREATE TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
INSERT INTO foo VALUES(1);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ERROR:  check constraint &amp;quot;cc&amp;quot; of relation &amp;quot;foo&amp;quot; is violated by some row&lt;br /&gt;
DELETE FROM foo WHERE a = 0;&lt;br /&gt;
DELETE 1&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
ERROR:  new row for relation &amp;quot;foo&amp;quot; violates check constraint &amp;quot;cc&amp;quot;&lt;br /&gt;
DETAIL:  Failing row contains (0).&lt;br /&gt;
ALTER TABLE foo ALTER CONSTRAINT cc NOT ENFORCED;&lt;br /&gt;
ALTER TABLE&lt;br /&gt;
INSERT INTO foo VALUES(0);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;pg_plan_advice&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Až doposud uživatelé Postgresu neměli moc možností, jak ovlivnit generování prováděcích plánů. Hinty ve stylu Oracle byly a jsou z historických důvodů tabu (jsou implementovány extenzí &amp;lt;a href=&amp;quot;https://github.com/ossc-db/pg_hint_plan&amp;quot;&amp;gt;pg_hint_plan&amp;lt;/a&amp;gt;). Uživatel měl pouze možnost penalizace metod executoru - např. &amp;lt;code&amp;gt;enable_nestloop&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;enable_indexscan&amp;lt;/code&amp;gt; nastavením na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Tato penalizace je ale dost hrubá, a neumožňuje jemné ovlivnění plánovače. Přesto se používala a používá. Rober Haas napsal dvě extenze &amp;lt;a href=&amp;quot;https://www.postgresql.org/docs/devel/pgplanadvice.html&amp;quot;&amp;gt;&amp;lt;code&amp;gt;pg_plan_advice&amp;lt;/code&amp;gt;&amp;lt;/a&amp;gt; a &amp;lt;a href=&amp;quot;https://www.postgresql.org/docs/devel/pgstashadvice.html&amp;quot;&amp;gt;&amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;&amp;lt;/a&amp;gt;. Prvně zmíněná extenze umožňuje definovat jakási doporučení, která by měl planner respektovat. Pro každý plán lze zpětně dogenerovat tato doporučení:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce&lt;br /&gt;
  ORDER BY pocet_muzu + pocet_zen DESC&lt;br /&gt;
  LIMIT 10;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Limit  (cost=272.19..272.21 rows=10 width=45)                        │&lt;br /&gt;
│   -&amp;gt;  Sort  (cost=272.19..287.81 rows=6250 width=45)                 │&lt;br /&gt;
│         Sort Key: ((pocet_muzu + pocet_zen)) DESC                    │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on obce  (cost=0.00..137.12 rows=6250 width=45) │&lt;br /&gt;
│ Generated Plan Advice:                                               │&lt;br /&gt;
│   SEQ_SCAN(obce)                                                     │&lt;br /&gt;
│   NO_GATHER(obce)                                                    │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(7 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                      QUERY PLAN                                      │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Nested Loop  (cost=0.28..12.56 rows=81 width=58)                                     │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17)                          │&lt;br /&gt;
│         Filter: (nazev = &#039;Beroun&#039;::text)                                             │&lt;br /&gt;
│   -&amp;gt;  Index Scan using obce_okres_id_idx on obce  (cost=0.28..9.79 rows=81 width=41) │&lt;br /&gt;
│         Index Cond: ((okres_id)::text = okresy.id)                                   │&lt;br /&gt;
│ Generated Plan Advice:                                                               │&lt;br /&gt;
│   JOIN_ORDER(okresy obce)                                                            │&lt;br /&gt;
│   NESTED_LOOP_PLAIN(obce)                                                            │&lt;br /&gt;
│   SEQ_SCAN(okresy)                                                                   │&lt;br /&gt;
│   INDEX_SCAN(obce public.obce_okres_id_idx)                                          │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                                             │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(11 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Prostřednictvím konfigurační proměnné &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; můžeme ovlivnit chování planneru vlastními doporučeními:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SET pg_plan_advice.advice to &#039;JOIN_ORDER(obce okresy)&#039;;&lt;br /&gt;
SET&lt;br /&gt;
EXPLAIN (PLAN_ADVICE)&lt;br /&gt;
 SELECT *&lt;br /&gt;
   FROM obce JOIN okresy ON obce.okres_id = okresy.id&lt;br /&gt;
  WHERE okresy.nazev = &#039;Beroun&#039;;&lt;br /&gt;
┌───────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                            QUERY PLAN                             │&lt;br /&gt;
╞═══════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Join  (cost=1.97..140.78 rows=81 width=58)                   │&lt;br /&gt;
│   Hash Cond: ((obce.okres_id)::text = okresy.id)                  │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on obce  (cost=0.00..121.50 rows=6250 width=41)    │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=1.96..1.96 rows=1 width=17)                     │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.96 rows=1 width=17) │&lt;br /&gt;
│               Filter: (nazev = &#039;Beroun&#039;::text)                    │&lt;br /&gt;
│ Supplied Plan Advice:                                             │&lt;br /&gt;
│   JOIN_ORDER(obce okresy) /* matched */                           │&lt;br /&gt;
│ Generated Plan Advice:                                            │&lt;br /&gt;
│   JOIN_ORDER(obce okresy)                                         │&lt;br /&gt;
│   HASH_JOIN(okresy)                                               │&lt;br /&gt;
│   SEQ_SCAN(obce okresy)                                           │&lt;br /&gt;
│   NO_GATHER(obce okresy)                                          │&lt;br /&gt;
└───────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(13 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Konfigurace planneru prostřednictvím &amp;lt;code&amp;gt;pg_plan_advice.advice&amp;lt;/code&amp;gt; nestačí, pokud potřebujeme ovlivnit plán dotazu z aplikace, u které nemůžeme nebo nechceme měnit zdrojový kód. A proto je tu druhá zmíněná extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt;, která umožňuje naše &amp;quot;doporučení&amp;quot; uložit a pak automaticky aplikovat na základě tzv &amp;lt;code&amp;gt;queryid&amp;lt;/code&amp;gt;. Doporučení jsou uložena v pojmenovaných skladech (stashes). Skrze konfigurační proměnnou &amp;lt;code&amp;gt;pg_stash_advice.stash_name&amp;lt;/code&amp;gt; volíme aktivní sklad. Každý uživatel, každá databáze může mít svůj vlastní. Pokud proměnná není nastavená, tak je extenze &amp;lt;code&amp;gt;pg_stash_advice&amp;lt;/code&amp;gt; neaktivní. Uložené nápovědy jsou perzistentní - při vypnutí serveru se uloží, po startu znovu načtou do paměti.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;SQL&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; je syntaxe, kterou postres přejímá z analytických databází (zde to snad byla &amp;lt;a href=&amp;quot;https://duckdb.org/2022/05/04/friendlier-sql#group-by-all&amp;quot;&amp;gt;DuckDB&amp;lt;/a&amp;gt;). Pokud se použije tento zápis, tak se automaticky agreguje podle všech sloupců, které nejsou v agregační funkci:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT sum(pocet_zen + pocet_muzu), okresy.id, okresy.nazev &lt;br /&gt;
  FROM obce join okresy ON obce.okres_id = okresy.id&lt;br /&gt;
 GROUP BY ALL;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Tento zápis může ušetřit dost psaní, může to být také &amp;quot;tichý&amp;quot; zabiják výkonu. Čím více atributů je v klauzuli &amp;lt;code&amp;gt;GROUP BY&amp;lt;/code&amp;gt;, tím je agregace pomalejší. Zápis &amp;lt;code&amp;gt;GROUP BY ALL&amp;lt;/code&amp;gt; ještě není ve standardu, ale je standardizační komisí akceptován, a měl by být v některé další verzi ANSI/SQL.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Počínaje Postgresem 19 už nebude možnost používat backlash jako escape symbol v řetězcích. Před 15 roky se přešlo na standardní chování (předtím se řetězce v Postgresu chovali stejně jako v Cčku), nicméně nestandardní chování bylo možné vynutit nastavením &amp;lt;code&amp;gt;standard_conforming_strings&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Mezi top vývojáři Postgresu je hodně velká averze k tzv kompatibility flagům (zmíněný flag nebyl výjimkou) (pozn. u komerčních databází jsou naopak kompatibility flagu standardem, a nejen u nich - např. MySQL). Nyní je tato možnost zrušena, a Cčkové stringy dostaneme pouze jen zápisem (jako tzv extended strings):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;ahoj\nsvete&#039;;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│  ?column?   │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ ahoj\nsvete │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT e&#039;Ahoj\nSvete&#039;;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ Ahoj    ↵│&lt;br /&gt;
│ Svete    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově lze v u window funkcí &amp;lt;code&amp;gt;lead&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;lag&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;first_value&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last_value&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;nth_value&amp;lt;/code&amp;gt; použít klauzuli &amp;lt;code&amp;gt;IGNORE NULLS&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;. Výchozí chování, které bylo implementováno již dříve odpovídá klauzuli &amp;lt;code&amp;gt;RESPECT NULLS&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;SQL/PGQ&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;V tomto případě PG není častým prefixem symbolizujícím Postgres (a Q jako queue), ale Property Graph Queries. Počínaje podporou neatomických datových typů v SQL:2000, přes podporu XML v SQL:2003 se standard rozšířil nad rámec čistě relačních databází (stejně ale už dříve existovala kritika SQL z pohledu čistoty od relačních dogmatiků). Standard SQL:2023 (ISO/IEC 9075-16:2023) SQL rozšiřuje o podporu grafových databází, které mají svůj vlastní datový model odlišný od relačního modelu. Přijde mi to jako dost odvážný krok (a ještě teď tomu nemohu úplně uvěřit). Zatím existovala zřetelná jednota mezi SQL a relačním modelem. Od nové části standardu se očekává, že pomůže s přehlednějším zápisem určitých dotazů, které se až doposud řešily pomocí rekurze. Přiznám se, že zápis dotazu v PGQ (využívajícího ascii art) mi přijde hodně cizí (možná zažívám pocity programátora v Cobolu, když se poprvé podíval na SQL. Osobně mi to nesedí - reprezentaci znalostí ve formátu grafu jsem nikdy nemusel (vím, že je to jen jiná reprezentace téhož)). Row pattern recognition z roku SQL:2016 toho také nemá s relačními databázemi moc společného, takže to takové překvapení není. Práce na této části standardu začaly v roce 2017 (a integrovaly se prvky jazyka &amp;lt;a href=&amp;quot;https://neo4j.com/docs/cypher-manual/current/introduction/cypher-overview/&amp;quot;&amp;gt;Cypher&amp;lt;/a&amp;gt; (Neo4j) a &amp;lt;a href=&amp;quot;https://docs.oracle.com/en/database/oracle/property-graph/20.4/spgdg/property-graph-query-language-pgql.html#GUID-301FF092-1A07-43D2-91E5-0C5AFF3467CC&amp;quot;&amp;gt;PGQL&amp;lt;/a&amp;gt; (Oracle)).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Základem grafových databází je graf skládající se z uzlů a hran. Ka každému uzlu i hraně mohou být přiřazeny atributy (properties). Hrany mohou být orientované i neorientované. Standard pro takové grafy používá termín Property Graphs. Graf se definuje příkazem &amp;lt;code&amp;gt;CREATE PROPERTY GRAPH&amp;lt;/code&amp;gt; a je to určitá forma pohledu. Přesto, že jsem zkoušel poměrně triviální příklad, nebylo pro mne intuitivní napsat SQL/PGQ dotaz. Pro uživatele bez zkušenosti s Neo4j nebo jinou grafovou databází budou začátky s SQL/PGQ dost bolestivé. V tuto chvíli (duben 2026) ještě není hotová dokumentace. Je možné, že se díky integraci SQL/PGQ do Postgresu setkám s grafovými databázemi častěji (SQL/PGQ je podporováno v DuckDB a v Oracle):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE public.uzivatele (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  jmeno character varying&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE public.zpravy (&lt;br /&gt;
  id integer NOT NULL,&lt;br /&gt;
  odesilatel integer,&lt;br /&gt;
  prijemce integer,&lt;br /&gt;
  tema text&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- uzivatel - odeslal -&amp;gt; uzivatel&lt;br /&gt;
CREATE PROPERTY GRAPH public.pg1&lt;br /&gt;
  VERTEX TABLES (&lt;br /&gt;
    public.uzivatele AS uzivatel KEY (id) PROPERTIES (id, jmeno)&lt;br /&gt;
  )&lt;br /&gt;
  EDGE TABLES (&lt;br /&gt;
    public.zpravy AS odeslal KEY (id)&lt;br /&gt;
    SOURCE KEY (odesilatel) REFERENCES uzivatel (id)&lt;br /&gt;
    DESTINATION KEY (prijemce) REFERENCES uzivatel (id)&lt;br /&gt;
  )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (1, &#039;Pavel&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (2, &#039;Zdenek&#039;);&lt;br /&gt;
INSERT INTO public.uzivatele VALUES (3, &#039;Tomas&#039;);&lt;br /&gt;
&lt;br /&gt;
INSERT INTO public.zpravy VALUES (1, 1, 2, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (2, 2, 1, &#039;plan dovolene&#039;);&lt;br /&gt;
INSERT INTO public.zpravy VALUES (3, 1, 3, &#039;dotaz ohledne dopravy&#039;);&lt;br /&gt;
&lt;br /&gt;
-- od koho uzivatel Pavel dostal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) &amp;lt;-[IS odeslal]- (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
└────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- komu uzivatel Pavel poslal zpravu&lt;br /&gt;
SELECT *&lt;br /&gt;
  FROM GRAPH_TABLE(pg1&lt;br /&gt;
       MATCH (a IS uzivatel WHERE a.jmeno = &#039;Pavel&#039;) -[IS odeslal]-&amp;gt; (b IS uzivatel) &lt;br /&gt;
       COLUMNS (b.jmeno));&lt;br /&gt;
┌────────┐&lt;br /&gt;
│ jmeno  │&lt;br /&gt;
╞════════╡&lt;br /&gt;
│ Zdenek │&lt;br /&gt;
│ Tomas  │&lt;br /&gt;
└────────┘&lt;br /&gt;
(2 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Osobně si nedovedu představit, že bych psal dotazy v SQL/PGQ (myslím, že podobně na tom bude většina uživatelů podobně). Je otázkou, jestli se SQL/PGQ neuplatní ve spolupráci s AI. V tomto případě se běžný dotaz rozpadá do dvou kroků. Navíc i joinovací podmínka získává label, takže je to v určitém smyslu více popisné, než běžné SQL, a je tak možné, že tento zápis bude AI více sedět.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pomalu se pokračuje na implementaci tzv temporálních tabulek. Letos je to podpora klauzule &amp;lt;code&amp;gt;FOR PORTION OF valid_at FROM TO&amp;lt;/code&amp;gt;. Zjednodušeně, pokud máme temporální databáze nebo temporální tabulky, tak se můžeme podívat na stav dat v nějakém čase. Pokud se použije klauzule &amp;lt;code&amp;gt;FOR PORTION OF FROM TO&amp;lt;/code&amp;gt;, tak se jedná o tzv temporální &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-- je nutne mit nainstalovanou extenzi btree_gist&lt;br /&gt;
CREATE TABLE ceny(&lt;br /&gt;
  id int,&lt;br /&gt;
  valid_at daterange,&lt;br /&gt;
  nazev text,&lt;br /&gt;
  cena int,&lt;br /&gt;
  PRIMARY KEY (id, valid_at WITHOUT OVERLAPS)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE&lt;br /&gt;
&lt;br /&gt;
-- jednotna cena mezi 2020-01-01 a 2025-12-31&lt;br /&gt;
INSERT INTO ceny VALUES(1, &#039;[2020-01-01,2026-01-01)&#039;, &#039;pecivo&#039;, 20);&lt;br /&gt;
INSERT 0 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
-- uprava ceny mezi 2021-01-01 a 2021-02-28&lt;br /&gt;
UPDATE ceny&lt;br /&gt;
   FOR PORTION OF valid_at FROM &#039;2021-01-01&#039; TO &#039;2021-03-01&#039;&lt;br /&gt;
   SET cena = 30&lt;br /&gt;
 WHERE id = 1;&lt;br /&gt;
UPDATE 1&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM ceny ORDER BY valid_at;&lt;br /&gt;
┌────┬─────────────────────────┬────────┬──────┐&lt;br /&gt;
│ id │        valid_at         │ nazev  │ cena │&lt;br /&gt;
╞════╪═════════════════════════╪════════╪══════╡&lt;br /&gt;
│  1 │ [2020-01-01,2021-01-01) │ pecivo │   20 │&lt;br /&gt;
│  1 │ [2021-01-01,2021-03-01) │ pecivo │   30 │&lt;br /&gt;
│  1 │ [2021-03-01,2026-01-01) │ pecivo │   20 │&lt;br /&gt;
└────┴─────────────────────────┴────────┴──────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Nové datové typy a funkce&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;V Postgresu se můžete setkat s datovými typy s prefixem &amp;lt;code&amp;gt;reg&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;regrole&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regproc&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;regclass&amp;lt;/code&amp;gt;. Tyto datové typy jsou vždy spojeny s jednou konkrétní systémovou tabulkou a hodnoty těchto typů vždy nesou unikátní číselný identifikátor databázového objektu. Tyto typy podporují přetypování z textu, což se používá pro zkrácený zápis vyhledávání nějakého databázového objektu v katalogu. Nově můžeme používat typ &amp;lt;code&amp;gt;regdatabase&amp;lt;/code&amp;gt; a tento typ se odkazuje, jak je patrné z názvu, na tabulku &amp;lt;code&amp;gt;pg_database&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase;&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│ regdatabase │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ template1   │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT &#039;template1&#039;::regdatabase::oid;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT oid&lt;br /&gt;
 FROM pg_database &lt;br /&gt;
 WHERE datname = &#039;template1&#039;;&lt;br /&gt;
┌─────┐&lt;br /&gt;
│ oid │&lt;br /&gt;
╞═════╡&lt;br /&gt;
│   1 │&lt;br /&gt;
└─────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Díky těmto typům jsou dotazy nad systémovým katalogem kratší a čitelnější. Navíc autor dotazů nemusí brát v potaz některé detaily (jako například case sensitivitu), kde se chování SQL identifikátorů liší od SQL stringů. To je ošetřeno interně při přetypování.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce &amp;lt;code&amp;gt;error_on_null&amp;lt;/code&amp;gt; vyhodí výjimku, pokud je parametr NULL. Jinak vrátí hodnotu parametru. Implementace je extrémně jednoduchá - sleduje flag &amp;lt;code&amp;gt;isnull&amp;lt;/code&amp;gt;. Každý parametr každé SQL funkce má tento flag. Stejné chování má flag funkce &amp;lt;code&amp;gt;STRICT&amp;lt;/code&amp;gt;. Je tu drobná zrada. V případě kompozitních typů to není kompatibilní s operátorem &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;. Kompozitní hodnota obsahující pouze &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;y je interně ne nullová, ale operátor &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt; pro takovou kompozitní hodnotu vrátí &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT ROW(NULL, NULL) IS NULL;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT error_on_null(NULL::integer);&lt;br /&gt;
ERROR:  null value not allowed&lt;br /&gt;
SELECT error_on_null(ROW(NULL, NULL));&lt;br /&gt;
┌───────────────┐&lt;br /&gt;
│ error_on_null │&lt;br /&gt;
╞═══════════════╡&lt;br /&gt;
│ (,)           │&lt;br /&gt;
└───────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Roky se v Postgresu mluví o tom, že by měl existovat snadný způsob, jak zpětně z databázového objektu vygenerovat DDL příkaz. Osobně jsem nikdy tuhle potřebu neměl, ale do jisté míry této potřebě rozumím. Skoro v každém admin nástroji můžete iterovat přes databázové objekty a k nim si nechat zobrazit DDL. A skoro každý admin tool, pak tuto funkcionalitu duplicitně implementuje - s chybami nebo bez chyb. Je to kód, který vyžaduje neustálou údržbu a aktualizace. Po letech diskuzí se je v upstreamu první část funkcí &amp;lt;code&amp;gt;pg_get_...ddl&amp;lt;/code&amp;gt; (aktuálně &amp;lt;code&amp;gt;pg_get_database_ddl&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;pg_get_role_ddl&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;pg_get_tablespace_ddl&amp;lt;/code&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT pg_get_role_ddl(&#039;pavel&#039;);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                       pg_get_role_ddl                                        │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ CREATE ROLE pavel SUPERUSER INHERIT NOCREATEROLE NOCREATEDB LOGIN NOREPLICATION NOBYPASSRLS; │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Od minulé verze je v postgresu funkce generující náhodné číslo v zadaném rozsahu. K nim nyní přibyly funkce pro rozsah typů &amp;lt;code&amp;gt;date&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;timestamp&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;timestamptz&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SELECT random(current_date - 6, current_date);&lt;br /&gt;
┌────────────┐&lt;br /&gt;
│   random   │&lt;br /&gt;
╞════════════╡&lt;br /&gt;
│ 2026-04-13 │&lt;br /&gt;
└────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
postgres=# SELECT random(current_timestamp - interval &#039;1 week&#039;, current_timestamp);&lt;br /&gt;
┌───────────────────────────────┐&lt;br /&gt;
│            random             │&lt;br /&gt;
╞═══════════════════════════════╡&lt;br /&gt;
│ 2026-04-09 02:30:30.665819+02 │&lt;br /&gt;
└───────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Optimalizace&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Jako nejdůležitější optimalizaci v nové verzi vidím optimalizaci implementace kontroly referenční integrity. RI je v postgresu realizována v systémových řádkových triggerech, které, až doposud, provedly (pro každý řádek) jeden kontrolní SQL příkaz (s použitím SPI API - stejné API, které se používá např. v PL/pgSQL). Nově se hledá přímo v indexech - přeskakuje se celý aparát SQL. To je první výrazná optimalizace. Druhou výraznou optimalizací je hledání nikoliv jedné hodnoty, ale pole hodnot (n = 64). Podle autora patche je nyní kontrola referenční integrity cca 3x rychlejší. Pořád to bude znát. Výrazně se ale posune hranice, od kdy se vyplatí při masivních importech kontrolu referenční integrity vypínat.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE tab_a(id int PRIMARY KEY);&lt;br /&gt;
INSERT INTO tab_a SELECT generate_series(1,1000);&lt;br /&gt;
VACUUM ANALYZE tab_a;&lt;br /&gt;
&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b_no_ri(id int, a_id int);&lt;br /&gt;
CREATE UNLOGGED TABLE tab_b(id int, a_id int references tab_a(id));&lt;br /&gt;
\timing&lt;br /&gt;
-- postgres 18&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 12844,206 ms (00:12,844)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 659,462 ms&lt;br /&gt;
&lt;br /&gt;
-- postgres 19&lt;br /&gt;
INSERT INTO tab_b select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 2728,073 ms (00:02,728)&lt;br /&gt;
INSERT INTO tab_b_no_ri select i, random()*999 + 1&lt;br /&gt;
  FROM generate_series(1,1000000) g(i);&lt;br /&gt;
INSERT 0 1000000&lt;br /&gt;
Time: 673,444 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ukázkový test je best case - zrychlení je cca čtyřnásobné. Stále je import s RI cca 4x pomalejší než bez RI (a to cílová tabulka obsahuje pouze jeden cizí klíč). V praxi to bude jiné - kromě RI je náročná i aktualizace indexů a samozřejmě všechny diskové operace.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Určitě každý, kdo pracuje s Postgresem trochu déle, se setkal s doporučením &amp;quot;nepoužívej &amp;lt;code&amp;gt;NOT IN (SELECT ...&amp;lt;/code&amp;gt;&amp;quot;. Důvodem byla (v některých případech) &amp;quot;špatná&amp;quot; optimalizace. Optimalizátor neměl garanci, že subselect nevrátí &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;. Poté, co se ve verzi 18 přepsal systém pro ukládání omezujících pravidel (constraints), už bylo možné do tuto informaci v optimalizátoru použít. Nyní se by se měl subselect &amp;lt;code&amp;gt;NOT IN&amp;lt;/code&amp;gt; transformovat na tzv anti-join (v těch případech, kdy je garantováno, že žádná proměnná v predikátu nebude &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;). Jinými slovy, pokud optimalizátor bude mít garance, že se v predikátu subselectu nevyskytne &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, tak vygeneruje stejný plán, jako kdybyste použili zápis s &amp;lt;code&amp;gt;NOT EXISTS&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE osoby(id int PRIMARY KEY, jmeno varchar);&lt;br /&gt;
CREATE TABLE faktury(id int primary key,&lt;br /&gt;
                     vlozeno timestamp,&lt;br /&gt;
                     podal int REFERENCES osoby(id) NOT NULL);&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT *&lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE id NOT IN (SELECT podal&lt;br /&gt;
                            FROM faktury);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
&lt;br /&gt;
EXPLAIN SELECT * &lt;br /&gt;
          FROM osoby&lt;br /&gt;
         WHERE NOT EXISTS(SELECT podal &lt;br /&gt;
                            FROM faktury&lt;br /&gt;
                           WHERE podal = osoby.id);&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                              QUERY PLAN                              │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Hash Right Anti Join  (cost=38.58..82.22 rows=635 width=36)          │&lt;br /&gt;
│   Hash Cond: (faktury.podal = osoby.id)                              │&lt;br /&gt;
│   -&amp;gt;  Seq Scan on faktury  (cost=0.00..28.50 rows=1850 width=4)      │&lt;br /&gt;
│   -&amp;gt;  Hash  (cost=22.70..22.70 rows=1270 width=36)                   │&lt;br /&gt;
│         -&amp;gt;  Seq Scan on osoby  (cost=0.00..22.70 rows=1270 width=36) │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(5 rows)&lt;br /&gt;
-- ve starších verzích dostanete různé plány&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Ve starších verzích spojení relací vždy předcházelo agregaci. To v některých případech může být neefektivní (pokud agregace výrazně redukuje počet řádek). Pokud jsem chtěl změnit pořadí operací, musel jsem si to vynutit zápisem (poddotazem). V devatenáctce optimalizátor podporuje tzv předběžnou agregaci (eager aggregation), která předbíhá před join:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT sum(pocet_zen + pocet_muzu), okresy.nazev &lt;br /&gt;
                  FROM okresy JOIN obce ON okresy.id = obce.okres_id&lt;br /&gt;
                 GROUP BY okresy.nazev;&lt;br /&gt;
┌──────────────────────────────────────────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                                                QUERY PLAN                                                │&lt;br /&gt;
╞══════════════════════════════════════════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Finalize HashAggregate  (cost=157.38..158.15 rows=77 width=18)                                           │&lt;br /&gt;
│   Group Key: okresy.nazev                                                                                │&lt;br /&gt;
│   -&amp;gt;  Hash Join  (cost=3.02..157.00 rows=77 width=18)                                                    │&lt;br /&gt;
│         Hash Cond: ((obce.okres_id)::text = okresy.id)                                                   │&lt;br /&gt;
│         -&amp;gt;  Partial GroupAggregate  (cost=0.28..154.05 rows=77 width=15)                                 │&lt;br /&gt;
│               Group Key: obce.okres_id                                                                   │&lt;br /&gt;
│               -&amp;gt;  Index Only Scan using obce_okres_id_idx on obce  (cost=0.28..122.03 rows=6250 width=7) │&lt;br /&gt;
│         -&amp;gt;  Hash  (cost=1.77..1.77 rows=77 width=17)                                                     │&lt;br /&gt;
│               -&amp;gt;  Seq Scan on okresy  (cost=0.00..1.77 rows=77 width=17)                                 │&lt;br /&gt;
└──────────────────────────────────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(9 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Na datech pro ČR je výše uvedený dotaz cca 3x rychlejší (v pg19 vůči pg18).&amp;lt;/p&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud je jeden řádek zamčený vícero transakcemi, tak se do jeho systémového atributu &amp;lt;code&amp;gt;xmax&amp;lt;/code&amp;gt; uloží tzv &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; (MultiXact je &amp;quot;aparát&amp;quot;, kterým se v Postgresu implementují řádkové zámky). To je unikátní identifikátor skupiny transakcí, které drží zámek. Každá skupina transakcí se skládá z tzv členských záznamů &amp;lt;code&amp;gt;MultiXactMember&amp;lt;/code&amp;gt;, ve kterých se drží identifikátor transakce, typ zámku a stav transakce. Také tyto záznamy mají své unikátní id &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Doposud &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; byla 32bitová hodnota. Nově je tato hodnota 64bitová, a nehrozí její přetečení. &amp;lt;code&amp;gt;MultiXact ID&amp;lt;/code&amp;gt; i id transakcí jsou stále 32bitové hodnoty (existuje několik rozpracovaných řešení, které zvyšují jejich rozsah), takže stále hrozí přetečení těchto id, a nastartování vynuceného freezování (což u více zatížených systémů může způsobit problémy s produkcí). Eliminovala se ale možnost přetečení &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt;. Je tp důležité, protože &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; rostl ze všech zmíněných id nejrychleji (pokud &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; je počet transakcí se sdílenými zámky, pak růst &amp;lt;code&amp;gt;MultiXactOffset&amp;lt;/code&amp;gt; je &amp;lt;code&amp;gt;nxn&amp;lt;/code&amp;gt;). Informace o MultiXact (skupinách transakcí) lze získat novou funkcí &amp;lt;code&amp;gt;pg_get_multixact_stats()&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Přepracoval se kód, který implementuje příkazy &amp;lt;code&amp;gt;LISTEN&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;NOTIFY&amp;lt;/code&amp;gt;. Předchozí verze probouzely každý proces, který čekal na notifikaci (bez ohledu na to jestli čekal nebo nečekal na kanálu, který dostal notifikaci). Stará implementace fungovala dobře, pokud počet použitých kanálů byl malý, a tudíž byla i malá šance, že se probudí proces, který čeká na jiném kanálu než je aktuální notifikace. Uživatelé ale začali notifikace používat i jinak, a reportovali výrazné zpomalení pokud větší množství klientů poslouchalo na větším množství různých kanálů. Ve zprávě ke patchi je uvedeno zpomalení (pro 1 klienta 9100 TPS, pro 1000 klientů 200 TPS). Nová implementace ve sdílené paměti ke každému kanálu drží seznam čekajících klientů. V případě zprávy do některého kanálu se probudí pouze procesy, které na tomto kanálu poslouchají (i zde je vidět pokles TPS, ale výrazně menší - pro 1000 klientů 9000 TPS).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Výchozí komprimace TOASTu bude &amp;lt;code&amp;gt;lz4&amp;lt;/code&amp;gt; (namísto &amp;lt;code&amp;gt;pglz&amp;lt;/code&amp;gt;). LZ4 je jako volba už cca 5 let, a měla by být efektivnější (jak v komprimaci, tak ve využití CPU) než původní LZ.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Postupně víc funkcí je akcelerováno pomocí SIMD. Nově to jsou funkce &amp;lt;code&amp;gt;hex_encode&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;hex_decode&amp;lt;/code&amp;gt; a parsování csv, tsv formátů příkazu &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; (hledání speciálních znaků).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Některé extenze, jako např. &amp;lt;code&amp;gt;pgstattuple&amp;lt;/code&amp;gt;, nově používají direct API pro čtení dat (implementované v pg18). Na systémech s rychlým IO by měly běžet rychleji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Na základě reportů uživatelů se upravila implementace hashjoinu, tak aby nedocházelo k extrémnímu nárůstu alokace paměti v případech, kdy atribut použitý pro spojení relací obsahuje velké množství &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt; hodnot.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V těch případech, kdy je garantováno, že porovnávané hodnoty jsou ne nullové, tak se operátor &amp;lt;code&amp;gt;IS DISTICT FROM&amp;lt;/code&amp;gt; nahradí operátorem &amp;lt;code&amp;gt;&amp;lt;&amp;gt;&amp;lt;/code&amp;gt;, případně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM&amp;lt;/code&amp;gt; operátorem &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt;. Tady je otázkou, jaký bude reálný dopad. Jako programátor používám &amp;lt;code&amp;gt;IS [ NOT ] DISTINCT FROM&amp;lt;/code&amp;gt; jedině v těch případech, které komplikují potenciální NULLy. Je ale pravdou, že drtivou většinu SQL, dnes generují ORM frameworky, ktere nemusí mít vždy dostatečnou chytrost. Výraz &amp;lt;code&amp;gt;IS DISTINCT FROM NULL&amp;lt;/code&amp;gt; se nyní transformuje na &amp;lt;code&amp;gt;IS NOT NULL&amp;lt;/code&amp;gt;, obdobně &amp;lt;code&amp;gt;IS NOT DISTINCT FROM NULL&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;IS NULL&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Replikace&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dlouhodobým cílem implementace logické replikace je podpora multimaster řešení. Zatím je k tomu ještě dlouhá cesta. Chybí podpora replikace DDL příkazů, plná podpora sekvencí, plná podpora řešení replikačních kolizí. Postupuje se v malých krocích. Letos je to podpora jednorázového refrešnutí sekvencí &amp;lt;code&amp;gt;ALTER SUBSCRIPTION ... REFRESH SEQUENCES&amp;lt;/code&amp;gt;. S multimasterem to úplně nepomůže, ale může to zjednodušit upgrade skrze logickou replikaci.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Novým příkazem je příkaz &amp;lt;code&amp;gt;WAIT FOR&amp;lt;/code&amp;gt;, který je možné použít na replikách, a který zajistí čekání na zreplikování zadané transakce. Lze nastavit timeout. Parametrem &amp;lt;code&amp;gt;NO_THROW&amp;lt;/code&amp;gt; zajistí tiché (bez výjimky) ukončení příkazu po timeoutu (změní se pouze vrácená hodnota):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
postgres=# WAIT FOR LSN &#039;0/306EE20&#039; WITH (TIMEOUT &#039;100ms&#039;, NO_THROW);&lt;br /&gt;
 status&lt;br /&gt;
--------&lt;br /&gt;
 timeout&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V příkazu &amp;lt;code&amp;gt;CREATE PUBLICATION ... FOR ALL TABLES&amp;lt;/code&amp;gt; je nyní možné použít klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE (t1, ...)&amp;lt;/code&amp;gt;. Klauzuli &amp;lt;code&amp;gt;EXCEPT TABLE&amp;lt;/code&amp;gt; lze použít i v příkazu &amp;lt;code&amp;gt;ALTER PUBLICATION&amp;lt;/code&amp;gt;. Pro registraci odběru (&amp;lt;code&amp;gt;CREATE SUBSCRIPTION&amp;lt;/code&amp;gt;) lze místo explicitního connection stringu použít odkaz na dříve definovaný FDW server.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V pohledu &amp;lt;code&amp;gt;pg_replication_slots&amp;lt;/code&amp;gt; je nový sloupec &amp;lt;code&amp;gt;slotsync_skip_reason&amp;lt;/code&amp;gt; popisující důvod, proč nebylo možné synchronizovat repliku. V tom případě bude obsahovat jednu z následujících hodnot: &amp;lt;code&amp;gt;wal_or_rows_removed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;wal_not flushed&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;no_consistent_snapshot&amp;lt;/code&amp;gt; nebo 	&amp;lt;code&amp;gt;slot_invalidated&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Pokud při registraci odběru nastavíme parametr &amp;lt;code&amp;gt;retain_dead_tuples&amp;lt;/code&amp;gt; na &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt; (výchozí nastavení je &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;), budou se detekovat kolize update-delete, kdy nedojde k update z důvodu smazaného řádku. Pozor, tato volba dočasně blokuje vakuování zrušených řádků (zvlášť pokud je replika nedostupná a nedochází k synchronizaci). Lze nastavit timeout &amp;lt;code&amp;gt;max_retention_duration&amp;lt;/code&amp;gt;, samozřejmě pak ovšem může dojít ke kolizi update-delete. Bez detekce této kolize může dojít k tiché nekonzistenci obsahu napříč různými zdroji.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Ostatní&amp;lt;/h3&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; podporuje formát &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt; (pouze export).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT JSON&lt;br /&gt;
{&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
&lt;br /&gt;
\copy (SELECT * FROM obce LIMIT 10) TO STDOUT (FORMAT JSON, FORCE_ARRAY)&lt;br /&gt;
[&lt;br /&gt;
 {&amp;quot;id&amp;quot;:1,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0100&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Praha&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:608316,&amp;quot;pocet_zen&amp;quot;:640710,&amp;quot;vek_muzu&amp;quot;:39.8,&amp;quot;vek_zen&amp;quot;:43.2}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:2,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Benešov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:7875,&amp;quot;pocet_zen&amp;quot;:8507,&amp;quot;vek_muzu&amp;quot;:39.2,&amp;quot;vek_zen&amp;quot;:41.9}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:3,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bernartice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:108,&amp;quot;pocet_zen&amp;quot;:115,&amp;quot;vek_muzu&amp;quot;:45.9,&amp;quot;vek_zen&amp;quot;:43.3}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:4,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bílkovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:93,&amp;quot;pocet_zen&amp;quot;:89,&amp;quot;vek_muzu&amp;quot;:41.4,&amp;quot;vek_zen&amp;quot;:46.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:5,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Blažejovice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:52,&amp;quot;pocet_zen&amp;quot;:48,&amp;quot;vek_muzu&amp;quot;:44.6,&amp;quot;vek_zen&amp;quot;:50.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:6,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Borovnice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:39,&amp;quot;pocet_zen&amp;quot;:37,&amp;quot;vek_muzu&amp;quot;:45.6,&amp;quot;vek_zen&amp;quot;:49.5}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:7,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bukovany&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:364,&amp;quot;pocet_zen&amp;quot;:372,&amp;quot;vek_muzu&amp;quot;:38.1,&amp;quot;vek_zen&amp;quot;:38.8}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:8,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Bystřice&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:2124,&amp;quot;pocet_zen&amp;quot;:2096,&amp;quot;vek_muzu&amp;quot;:38.5,&amp;quot;vek_zen&amp;quot;:41.1}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:9,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Ctiboř&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:55,&amp;quot;pocet_zen&amp;quot;:50,&amp;quot;vek_muzu&amp;quot;:38.6,&amp;quot;vek_zen&amp;quot;:42.0}&lt;br /&gt;
,{&amp;quot;id&amp;quot;:10,&amp;quot;okres_id&amp;quot;:&amp;quot;CZ0201&amp;quot;,&amp;quot;nazev&amp;quot;:&amp;quot;Čakov&amp;quot;,&amp;quot;pocet_muzu&amp;quot;:65,&amp;quot;pocet_zen&amp;quot;:60,&amp;quot;vek_muzu&amp;quot;:36.4,&amp;quot;vek_zen&amp;quot;:40.6}&lt;br /&gt;
]&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nyní také tento příkaz podporuje volbu &amp;lt;code&amp;gt;ON_ERROR SET_NULL&amp;lt;/code&amp;gt;, která způsobí ignorování hodnot, na kterých selže typová konverze. To je možné díky tomu, že se již dříve zavedla podpora tzv měkkých chyb (soft errors). Tyto chyby lze ošetřit s řádově menší režií než běžné chyby (nejsou potřeba subtransakce). Podpora soft errors se v Postgresu objevila s podporou klauzule &amp;lt;code&amp;gt;ON ERROR&amp;lt;/code&amp;gt; SQL/JSON funkcí. V plánu je podpora error safe přetypování (&amp;lt;code&amp;gt;CAST expr AS type xxx DEFAULT expr ON CONVERSION ERROR&amp;lt;/code&amp;gt;). Prvním nezbytným krokem je požadavek, aby konverzní funkce používaly měkké chyby. To teď v upstreamu je, a díky tomu, bylo i relativně jednoduché implementovat &amp;lt;code&amp;gt;COPY ON_ERROR SET_NULL&amp;lt;/code&amp;gt; (error safe casts by měly být v pg20).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CREATE TABLE foo(a int, b int);&lt;br /&gt;
&lt;br /&gt;
COPY foo FROM stdin (FORMAT csv, ON_ERROR SET_NULL);&lt;br /&gt;
Enter data to be copied followed by a newline.&lt;br /&gt;
End with a backslash and a period on a line by itself, or an EOF signal.&lt;br /&gt;
&amp;gt;&amp;gt; 10,20&lt;br /&gt;
&amp;gt;&amp;gt; 30,40&lt;br /&gt;
&amp;gt;&amp;gt; ahoj,20&lt;br /&gt;
&amp;gt;&amp;gt; \.&lt;br /&gt;
COPY 3&lt;br /&gt;
&lt;br /&gt;
SELECT * FROM foo;&lt;br /&gt;
┌────┬────┐&lt;br /&gt;
│ a  │ b  │&lt;br /&gt;
╞════╪════╡&lt;br /&gt;
│ 10 │ 20 │&lt;br /&gt;
│ 30 │ 40 │&lt;br /&gt;
│  ∅ │ 20 │&lt;br /&gt;
└────┴────┘&lt;br /&gt;
(3 rows)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Nově také příkaz &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; umožňuje číst přímo partišny (partitions). V předchozích verzích bylo nutné použít syntax s vloženým selectem, což má nějakou režii.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Funkce pro zakódování a dekódování textu (&amp;lt;code&amp;gt;encode&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;decode&amp;lt;/code&amp;gt;) nově podporují kódování &amp;lt;code&amp;gt;base64url&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;base32hex&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 41686f6a3c3e2f2b │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base64url&#039;);&lt;br /&gt;
┌─────────────┐&lt;br /&gt;
│   encode    │&lt;br /&gt;
╞═════════════╡&lt;br /&gt;
│ QWhvajw-Lys │&lt;br /&gt;
└─────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT encode(&#039;Ahoj&amp;lt;&amp;gt;/+&#039;, &#039;base32hex&#039;);&lt;br /&gt;
┌──────────────────┐&lt;br /&gt;
│      encode      │&lt;br /&gt;
╞══════════════════╡&lt;br /&gt;
│ 85K6UQHS7ONIM=== │&lt;br /&gt;
└──────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Dokončit implementaci standardu SQL/JSON, konkrétně implementaci funkce &amp;lt;code&amp;gt;JSON_TABLE&amp;lt;/code&amp;gt; se opět nestihlo.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;V &amp;lt;code&amp;gt;psql&amp;lt;/code&amp;gt; bude možnost si nastavit zobrazení logických hodnot &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;. Datový typ &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; akceptuje literály &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;on&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;off&amp;lt;/code&amp;gt;. Na výstupu se zobrazuje pouze &amp;lt;code&amp;gt;t&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;f&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ t        │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
\pset display_true true&lt;br /&gt;
Boolean true display is &amp;quot;true&amp;quot;.&lt;br /&gt;
\pset display_false false&lt;br /&gt;
Boolean false display is &amp;quot;false&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
SELECT 1=1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ true     │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&lt;br /&gt;
SELECT 1 &amp;lt;&amp;gt; 1;&lt;br /&gt;
┌──────────┐&lt;br /&gt;
│ ?column? │&lt;br /&gt;
╞══════════╡&lt;br /&gt;
│ false    │&lt;br /&gt;
└──────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Může se hodit možnost si zobrazit &amp;lt;code&amp;gt;search_path&amp;lt;/code&amp;gt; v promptu. V promptu je také možnost použít symbol &amp;lt;code&amp;gt;%i&amp;lt;/code&amp;gt;, který se nahradí replikačním statusem (&amp;lt;code&amp;gt;primary&amp;lt;/code&amp;gt; nebo &amp;lt;code&amp;gt;standby&amp;lt;/code&amp;gt;).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;PL/pgSQL&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;PL/pgSQL je relativě stabilizované prostředí, kde je každoročně jen minimum změn. Letos je to jedna malá (a pro většinu uživatelů zanedbatelná změna), a jedna &amp;quot;velká&amp;quot;, která ale interně žádnou změnou není.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Malou změnou je interní optimalizace exekuce embedded SQL ve tvaru  &amp;lt;code&amp;gt;SELECT výraz INTO proměnná&amp;lt;/code&amp;gt;. Mám pocit, že tento zápis se používal v Sybase a na Sybase navazujících databázích pro inicializaci proměnných. Já jsem se s tímto zápisem setkával v literatuře někdy kolem roku 2000, a už tehdy platilo doporučení tento zápis nepoužívat (v plpgsql se nikdy moc nepoužíval). V posledních letech přišlo víc uživatelů z MSSQL (začalo se migrovat víc aplikací z tohoto serveru), tento zápis používali a zjistili, že tento zápis je cca 20x pomalejší než &amp;quot;nativní&amp;quot; přiřazení &amp;lt;code&amp;gt;proměnna := výraz&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Interně jsou v PL/pgSQL dvě metody jak vyhodnotit výraz. Tzv simple metoda, kde se přeskočí SQL exekutor a přímo zavolá exekutor výrazů, je výrazně rychlejší. Druhou metodou je běžná exekuce skrze SQL exekutor (a SPI API). Až doposud, cokoliv co v zdrojovém kódu funkce bylo SQL příkazem (zde příkazem &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;) se vykonalo běžnou cestou. Nově se detekuje výše zmíněný zápis a vykoná se simple metodou. Pro dlouholeté uživatele Postgresu to nic neznamená, ale lidem, kteří migrují z MSSQL, to může zpříjemnit život.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Druhou, a naopak, velkou změnou je možnost inliningu funkce, která je napsaná v PL/pgSQL (ve speciálních případech). Inlining v kontextu Postgresu je trochu něco jiného než si uživatele představí pod termínem inlining. V Postgresu mohou být funkce volané z nějakého SQL příkazu - typicky příkazu &amp;lt;code&amp;gt;SELECT&amp;lt;/code&amp;gt;. Pokud nějaká funkce podporuje inlining, tak to znamená, že v AST stromu dotazu se volání funkce nahradí jejím tělem. Teprve pak nastupuje optimalizace, a díky inliningu vlastně optimalizátor vidí dovnitř funkce (jinak je funkce pro optimalizátor black box).&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;K tomu, aby PL/pgSQL (nejen v PL/pgSQL) funkce mohla být inlinovaná, potřebujete vlastní kód v Cčkové extenzi. A je to vlastně trik (v tomto případě dost nestydatý podfuk :-)). Už dříve bylo možné napsat extenze, které dodávaly optimalizátoru znalost o vybraných funkcích (jinak, opět, pro optimalizátor, jsou funkce black box). Přímo v jádru je například podpora optimalizátoru pro funkci &amp;lt;code&amp;gt;generate_series&amp;lt;/code&amp;gt; (staré verze pg by v rows měly 1000).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
EXPLAIN SELECT * FROM generate_series(1,3);&lt;br /&gt;
┌────────────────────────────────────────────────────────────────────┐&lt;br /&gt;
│                             QUERY PLAN                             │&lt;br /&gt;
╞════════════════════════════════════════════════════════════════════╡&lt;br /&gt;
│ Function Scan on generate_series  (cost=0.00..0.03 rows=3 width=4) │&lt;br /&gt;
└────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
(1 row)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Inlining byl dřive podporován pro funkce v jazyku SQL, kdy si planner vytáhl zdrojový kód funkce. V devatenáctce planner může zavolat extenzi, a může si říct nejen o detailnější parametry ohledně exekuce, ale může si říct o substituční SQL. Když ho dostane, tak funkci dále neřeší, a pracuje se substitučním SQL příkazem. Je to docela magie, nicméně efektivní. Kód extenze se volá až v momentu, kdy známe konstantní parametry funkce, a extenze se může rozhodnout - zavolej volanou funkci, nebo zavolej nějaké SQL, zavolej jinou funkci, případně vrať rovnou nějakou speciální hodnotu &amp;lt;code&amp;gt;NULL&amp;lt;/code&amp;gt;, 0, ... Je to i způsob, jak opravdu efektivně pracovat s dynamickým SQL. Musíte si ovšem napsat kód v Cčkové extenzi. Požadavek na tuto funkcionalitu přišel od vývojářů PostGISu. Cílem jsou optimalizace v PostGISu, dá se to ale použít i jinde. Časem si dovedu představit i nějakou contrib extenzi, která by tuto možnost zpřístupnila i bez nutnosti psát si vlastní extenzi. Škoda, že nemám autoritu vývojářů PostGISu. Dovedl bych si představit podobný trik v analyzátoru. Dost by mi to pomohlo s Orafce. V té pozici samozřejmě nejsem.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3&amp;gt;Vývoj&amp;lt;/h3&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;Každoročně dochází k čištění kódu. Občas se zruší podpora některé platformy. Výjimečně se přidá podpora nové platformy nebo jako v případě pg19 se vrátí podpora dříve odstraněné platformy (AIX - operační systém AIX přestal být podporovaný v pg17 díky nezájmu IBM. Pak se ale v IBM chytli za nos, dodali počítač do testovací farmy, a do AIXu přidali aktualizovaný software potřebný k buildu Postgresu). Další čistky v kódu lze provést přechodem na novější verzi programovacího jazyka - přechodem z C99 na C11 (bohužel to může znamenat, že starých platformách se nové verze Postgresu nepřeloží). Interní datový typ &amp;lt;code&amp;gt;Datum&amp;lt;/code&amp;gt; až do předchozí verze byl 4bajtový na 32bitových platformách a 8bajtový na 64bitových platformách. Nově je 8bajtový na všech podporovaných platformách. Určitě nezanedbatelná část kódu se generuje z definičních souborů. Nově se z definic generuje kód definující konfigurační proměnné. Údržba, verzování, zajištění konzistence definičních souborů je násobně jednodušší než údržba adekvátního kódu v Cčku. Dynamická alokace paměti bude jednodušší díky funkcím &amp;lt;code&amp;gt;GetNamedDSA&amp;lt;/code&amp;gt; a &amp;lt;code&amp;gt;GetNamedDSMSegment&amp;lt;/code&amp;gt;. Dynamicky sdílenou paměť lze sledovat skrze pohled &amp;lt;code&amp;gt;pg_dsm_registry_allocations&amp;lt;/code&amp;gt;.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Mám pocit, že vývoj Postgresu ještě víc zrychlil - je vidět mnohem víc patchů od lidí z Asie (dříve to bylo spíš jenom Japonsko), a o to víc se naráží na kapacitu committerů. Je to paradox, který nejde jednoduše řešit. Postgres je populární díky funkcionalitě a stabilitě. Stabilita je díky pečlivé práci commitetterů (důkladně se řeší každý řádek kódu). Díky popularitě je více programátorů, kteří píší více kódu, více patchů, ale committeři nestíhají, a tak patche zůstávají relativně dlouho ve frontě. Což frustruje programátory. Patch napíšete během měsíce, během měsíce se dá udělat finalizace a pár iterací s committerem, ale mezitím několik měsíců (v horším případě let (3 roky i v případě bezproblémového malého patche)), čekáte, až si na vás některý z committerů udělá čas. Celou dobu musíte udržovat patch v aplikovatelném stavu, musíte reagovat na případné diskuze, musíte sledovat vývoj a případně aktualizovat patch. Je to problém o kterém se ví, diskutuje se o něm, ale není úplně jasné, co by mělo být řešení. Minimálně se zlepšila evidence patchů, která pokrývá i automatické testování na několika různých platformách. Tady je velká klika, že Postgres má extenze. Neskutečně velký objem kódu (funkcionality) je dnes možné řešit skrz extenze mimo komunitu - což výrazně snižuje tlak na committery. V extenzích toho jde udělat hodně, bohužel, ne všechno. Na druhou stranu, extenze také nejsou bez rizika. Určitým způsobem zvyšují fragmentaci ekosystému Postgresu, který pak ztrácí přehlednost (plus ne všechny extenze jsou dostupné v cloudu). Zase, díky tomu je jádro Postgresu stále ještě rozumně velké. O Oracle se kolují zvěsti, že jádro má 14 miliónů řádek, Postgres pod 2 milióny. Náklady na údržbu Postgresu jsou výrazně menší. Kompilace zdrojáků je do 5 minut, regresní testy v největším rozsahu běží 15 minut. S tím ještě lze nějak rozumně pracovat. O Oracle jsem slyšel, že regresní testy běží den.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;Popularita Postgresu jde aktuálně až do absurdna. Z Linkedinu mám pocit, že začíná být přepostgresováno (samozřejmě z mé perspektivy a v mé bublině). Hromada příspěvků vygenerovaných AI jsou banality na úrovni žáka prvního stupně (Postgres má VACUUM, indexy jsou super, dotazy mohou být pomalé, atd atd). Doporučení typu - proč ne Redis, proč ne Elastic, na všechno použijte Postgres. Viděl jsem hromadu clickbaitových článků typu - multigenerační architektura Postgresu je tragická, ale s naší AI nebo s naším supportem nebudete mít problém, atd atd. Postgresu dnes rozumí každý, kdo dokáže do AI napsat Postgres. Měl jsem tu možnost vidět naprosto neadekvátní doporučení ohledně konfigurace (dnes nevíte jestli důvodem je neznalost autora nebo naopak jeho vychytralost a snaha o co nejvíc komentářů případně o troling). Historicky popularita Postgresu rostla ve stínu MySQL, Monga a dalších databází a roky byl Postgres ušetřený mediálního balastu. To bohužel už není pravda. Pořád platí, že Postgres je dobrá databáze, stabilní, relativně rychlá, která se ale rozhodně nehodí na vše. Má svoje limity, které je dobré znát, a rozhodně nemůže ve všech ohledech (ve větším rozsahu) nahradit Redis, MySQL nebo Mongo případně Kafku. To je nesmysl, a není to ani cílem komunity. Základem jakékoliv práce je znát limity, chování, a správně v souladu s celkem, používat správné nástroje.&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Slu%C5%BEby&amp;diff=1581</id>
		<title>Služby</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Slu%C5%BEby&amp;diff=1581"/>
		<updated>2026-04-23T05:13:21Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Provádíme komerční podporu PostgreSQL. Naše služby obsahují:&lt;br /&gt;
* instalaci,&lt;br /&gt;
* poinstalační konfiguraci,&lt;br /&gt;
* migrace a upgrade databáze,&lt;br /&gt;
* servis,&lt;br /&gt;
* výkonnostní audit a optimalizaci (tunning),&lt;br /&gt;
* vzdálený dohled a monitoring databází PostgreSQL,&lt;br /&gt;
* konzultace, [[školení]],&lt;br /&gt;
* návrh a realizaci rozšiřujících modulů,&lt;br /&gt;
* portace databází z Oracle a MS SQL,&lt;br /&gt;
* konzultace a dohled ohledně přechodu na PostgreSQL z Oracle a MS SQL,&lt;br /&gt;
* prodej modifikované verze PostgreSQL umožňující obfuscaci kódu uložených procedur (obfuscace - zatemnění kódu) pro RDBMS [http://www.postgresql.org PostgreSQL].&lt;br /&gt;
&lt;br /&gt;
V případě zájmu, prosím, kontaktujte [[Pavel Stěhule|Pavla Stěhuleho]].&lt;br /&gt;
&lt;br /&gt;
Reference:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: left; width: 25%&amp;quot;&amp;gt;&lt;br /&gt;
* Active24.cz (http://www.tyden.cz)&lt;br /&gt;
* centrum.cz (http://www.fotoalbum.cz)&lt;br /&gt;
* Creative.cz (http://www.metalshop.cz)&lt;br /&gt;
* enDetail (http://www.mojedomacnost.cz)&lt;br /&gt;
* LMC (http://www.jobs.cz/)&lt;br /&gt;
* nic.cz (http://www.nic.cz/)&lt;br /&gt;
* aurius / new media studio (http://www.aurius.sk/)&lt;br /&gt;
* aliacom.cz (http://aliacom.cz/)&lt;br /&gt;
* Premium SMS s.r.o.(http://premium.sms.cz/)&lt;br /&gt;
* Jyxo.cz&lt;br /&gt;
* 8BC s.r.o (http://www.8bc.com/)&lt;br /&gt;
* TPCA, Kolín&lt;br /&gt;
* Home Credit International a.s.&lt;br /&gt;
* LEVEL SYSTEMS (http://www.levelna.com/)&lt;br /&gt;
* T-Mobile&lt;br /&gt;
* Aukro (http://aukro.cz/)&lt;br /&gt;
* AUTOCONT, a.s.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;div style=&amp;quot;float: left; width: 25%&amp;quot;&amp;gt;&lt;br /&gt;
* I3 CZ s.r.o (http://www.i3.cz/)&lt;br /&gt;
* SPEL, a.s. (http://www.spel.cz/)&lt;br /&gt;
* Evona Electronics (http://www.evona.sk)&lt;br /&gt;
* Kyberie s.r.o (http://kyberie.cz/)&lt;br /&gt;
* Aquasoft s.r.o (http://www.aquasoft.eu/)&lt;br /&gt;
* Z&amp;amp;Z-Soft spol. s r. o. ( http://zzsoft.cz/)&lt;br /&gt;
* Allrisk&lt;br /&gt;
* AVAST&lt;br /&gt;
* Masarykova univerzita, Institut biostatistiky a analýz&lt;br /&gt;
* MAFRA, a.s.&lt;br /&gt;
* Photon Energy Operations CZ s.r.o.&lt;br /&gt;
* MoroSystems, s.r.o. (http://www.morosystems.cz/)&lt;br /&gt;
* netdevelo s.r.o‎ (http://www.netdevelo.com/)&lt;br /&gt;
* IDC CEMA (http://www.idc.com/)&lt;br /&gt;
* T-MAPY&lt;br /&gt;
* ABRA Software (https://www.abra.eu/)&lt;br /&gt;
* DataSpring s.r.o.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;div style=&amp;quot;float: left; width: 25%&amp;quot;&amp;gt;&lt;br /&gt;
* E.ON Business Services Czech Republic s.r.o.&lt;br /&gt;
* SolarWinds Czech, s.r.o (http://www.solarwinds.com)&lt;br /&gt;
* HPC, ŠKODA AUTO, a.s.&lt;br /&gt;
* FORTUNA GAME a.s.&lt;br /&gt;
* ELTODO a.s.&lt;br /&gt;
* SCG Czech Design Center, s.r.o.&lt;br /&gt;
* Eago systems spol. s.r.o.&lt;br /&gt;
* OZ ICT služby, Česká pošta s.p.&lt;br /&gt;
* Artin, spol s.r.o.&lt;br /&gt;
* QCM, s.r.o.&lt;br /&gt;
* DPD Slovensko&lt;br /&gt;
* IBS automotive s.r.o. &lt;br /&gt;
* Siemens, s.r.o.&lt;br /&gt;
* IBA CZ, s.r.o.&lt;br /&gt;
* Zásilkovna (https://www.packeta.com/)&lt;br /&gt;
* a další ..&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=%C5%A0kolen%C3%AD&amp;diff=1580</id>
		<title>Školení</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=%C5%A0kolen%C3%AD&amp;diff=1580"/>
		<updated>2026-04-23T05:12:23Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: /* Školení pod záštitou www.root.cz (Akademie root.cz) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==In-house (případně online) školení PostgreSQL==&lt;br /&gt;
Vyberte si z naší nabídky jednodenní školení pro začátečníky i pokročilé. Z těchto jednodenních školení je možné (na základě poptávky) kombinovat vícedenní školení. Tato školení vede a organizuje [[Pavel Stěhule]], který se také podílí na vývoji PostgreSQL a je dlouholetým uživatelem a propagátorem této databáze. Již pro tři Vaše zaměstnance jsou tato školení levnější (bez ohledu na úsporu času) než školení organizovaná počítačovými školami. Pokud byste měli zájem o in-house školení nebo se chcete informovat o nejbližším termínu, obratťe se, prosím, přímo na Pavla Stěhuleho ([[Pavel Stěhule|kontakt]]).&lt;br /&gt;
&lt;br /&gt;
Cena za jeden den in-house (online) školení je 16 tis. Kč (bez DPH) pro 4 osob plus příplatek 2000 Kč za každého dalšího účastníka (32 tis za max 12 osob) . (veřejná školení se vypisují na základě poptávky více než. 8 účastníků, cena je 4500 Kč za osobu). Pro bližší informace ohledně nejbližších termínů kontaktujte [[Pavel Stěhule|Pavla Stěhuleho]] pavel.stehule@gmail.com, mob: 724 191 000. &amp;lt;s&amp;gt;V případě školení mimo Prahu jsou účtovány cestovní výdaje&amp;lt;/s&amp;gt;. Školení mimo Prahu jsou pouze online. V ceně jsou vytištěné školící materiály. Cena platí pro ČR.&lt;br /&gt;
&lt;br /&gt;
{|cellpadding=10 style=&amp;quot;border:1px&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Všeobecné základy ==&lt;br /&gt;
Školení je určeno začátečníkům a středně pokročilým uživatelům, kteří se během osmi hodinového kurzu dozvědí vše potřebné k efektivnímu používání tohoto databázového systému. K dispozici jsou [http://www.pgsql.cz/skoleni/skoleni_postgres_web.pdf školící materiály]. Školení předpokládá obecné znalosti SQL a IT problematiky u posluchačů (např. není vysvětlován pojem databáze, relace, SQL DML DDL příkazy atd). Účastníci školení by měli získat přehled o možnostech PostgreSQL a měli by být následně schopni efektivně používat PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
* Podpora PostgreSQL na internetu&lt;br /&gt;
* Instalace ve zkratce&lt;br /&gt;
* Porovnání o.s. SQL RDBMS Firebird, PostgreSQL, MySQL a SQLite&lt;br /&gt;
* Minimální požadavky na databázi, ACID kritéria&lt;br /&gt;
* Charakteristické prvky PostgreSQL MGA, TOAST&lt;br /&gt;
* Datové typy bez limitů - TOAST&lt;br /&gt;
* Spolehlivost a výkon - WAL&lt;br /&gt;
* Nutné zlo, příkaz VACUUM&lt;br /&gt;
* Rozšiřitelnost&lt;br /&gt;
* Základní příkazy pro správu PostgreSQL&lt;br /&gt;
* Export, import dat &lt;br /&gt;
* Efektivní SQL, indexy, optimalizace dotazů&lt;br /&gt;
* Funkce generate_series&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
&lt;br /&gt;
== Administrace ==&lt;br /&gt;
Z názvu je patrné, že toto školení je určené jak začínajícím tak i pokročilým administrátorům, které připravuje na každodenní správu PostgreSQL databází. Po absolvování kurzu by mělo být absolventům jasné, proč se provádí určité činnosti (pravidelné nebo nahodilé), a na co, při správě PostgreSQL, klást důraz. Školení je šesti hodinové. K dispozici jsou [http://www.pgsql.cz/skoleni/skoleni_administrace_web.pdf podklady] pro toto školení.&lt;br /&gt;
&lt;br /&gt;
* Omezení přístupu k databázi&lt;br /&gt;
* Údržba databáze&lt;br /&gt;
* Správa uživatelů&lt;br /&gt;
* Export, import dat&lt;br /&gt;
* Zálohování, obnova databáze&lt;br /&gt;
* Konfigurace databáze&lt;br /&gt;
* Monitorování databáze&lt;br /&gt;
* Instalace doplňků&lt;br /&gt;
* Postup při přechodu na novou verzi&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
== Základy SQL ==&lt;br /&gt;
Toto školení je určeno především začátečníkům (z ne IT oborů), kteří chtějí využít SQL pro tvorbu vlastních reportů. Během kurzu jsou vysvětleny základní pojmy z teorie a praxe relačních databází. Dvě třetiny času osmihodinového školení je věnováno procvičování dotazů (od nejjednodušším ke středně složitým), tak aby po absolovent školení dokázal samostatně (pro svou praxi) získávat zajímavá data z SQL databází. K dispozici jsou [http://www.pgsql.cz/skoleni/skoleni_sql.zip školící materiály]. &lt;br /&gt;
&lt;br /&gt;
* Příkaz SELECT - spojování tabulek, filtrování, projekce, řazení&lt;br /&gt;
* Ostatní databázové objekty - sekvence, pohledy, indexy&lt;br /&gt;
* Zajištění referenční a doménové integrity - primární a cizí klíče, domény, triggery&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
== Programování v PL/pgSQL ==&lt;br /&gt;
Tento kurz je určen především vývojářům, kteří chtějí zvládnout efektivní vývoj nad PostgreSQL, který není bez uložených procedur myslitelný. PostgreSQL podporuje jak SQL procedury tak tzv. externí procedury. K dispozici je několik jazyků od SQL až po PL/Perl. Každý jazyk nabízí jiné možnosti a po absolvování kurzu by se vývojář měl dokázat rozhodnout pro jeden konkrétní jazyk, který pro dané zadání nabízí největší možnosti. Školení je osmi hodinové - důraz je kladen na procvičení vyložené látky. K dispozici jsou [http://www.pgsql.cz/skoleni/skoleni_plpgsql_web.pdf podklady] pro toto školení.&lt;br /&gt;
&lt;br /&gt;
* Uložené procedury, co a proč&lt;br /&gt;
* Inline procedury v SQL&lt;br /&gt;
* Úvod do PL/pgSQL&lt;br /&gt;
* Syntaxe příkazu CREATE FUNCTION&lt;br /&gt;
* Blokový diagram PL/pgSQL&lt;br /&gt;
* Příkazy PL/pgSQL&lt;br /&gt;
* Dynamické SQL&lt;br /&gt;
* Použití dočasných tabulek v PL/pgSQL&lt;br /&gt;
* Triggery v PL/pgSQL&lt;br /&gt;
* Tipy pro vývoj PL/pgSQL&lt;br /&gt;
* Příloha, Transakce&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
== High performance ==&lt;br /&gt;
Tento kurz je určen pokročilejším uživatelům a vývojářům, kteří používají PostgreSQL. Zabývá se obecněji otázkou výkonu datově orientovaných aplikací postavených nad relační databází. K dispozici jsou [http://www.pgsql.cz/skoleni/skoleni_high_performance.pdf podklady] pro toto školení.&lt;br /&gt;
&lt;br /&gt;
* Základní faktory ovlivňující výkon databáze&lt;br /&gt;
* Aplikační vrstvy&lt;br /&gt;
* CPU, RAM, IO, NET&lt;br /&gt;
* Konfigurace PostgreSQL&lt;br /&gt;
* Identifikace hrdel&lt;br /&gt;
* Použití cache a materializovaných pohledů&lt;br /&gt;
* Použití indexů a psaní index friendly aplikací&lt;br /&gt;
* Cost based optimizer, projevy chyb v odhadech a jejich řešení&lt;br /&gt;
* Monitoring&lt;br /&gt;
* Doporučení&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
== Zálohování a replikace ==&lt;br /&gt;
Toto školení je určeno pokročilejším uživatelům PostgreSQL. V rámci školení se účastníci seznámí s možnostmi zálohování a také si prakticky vyzkouší konfiguraci vestavěné replikace. &lt;br /&gt;
* Úvod - backup, replikace&lt;br /&gt;
* Konfigurace exportu transakčního logu&lt;br /&gt;
* pg_basebackup&lt;br /&gt;
* [http://docs.pgbarman.org/ Barman]&lt;br /&gt;
* Konfigurace vestavěné replikace&lt;br /&gt;
* Kombinace replikace a exportu transakčního logu&lt;br /&gt;
* pg_rewind&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
&lt;br /&gt;
| valign=&amp;quot;top&amp;quot; |&lt;br /&gt;
== Programování extenzí pro PostgreSQL v programovacím jazyku C  ==&lt;br /&gt;
Toto školení je určeno pokročilejším uživatelům PostgreSQL. V rámci školení se účastníci seznámí se základními interními koncepty v PostgreSQL a vytvoří jednoduchou extenzi pro PostgreSQL.&lt;br /&gt;
K dispozici je git [https://github.com/okbob/simple repozitář] se zdrojovými kódy cvičné extenze.&lt;br /&gt;
* Extenze - popis, organizace, náležitosti&lt;br /&gt;
* V1 volající konvence&lt;br /&gt;
* Datové typy v postgresu - vazba mezi C typem a SQL typem&lt;br /&gt;
* Správa paměti, paměťové kontexty,&lt;br /&gt;
* SPI&lt;br /&gt;
* Hooky - executor hook, fmgr hook&lt;br /&gt;
* build a testování extenzí&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Školení pod záštitou www.root.cz (Akademie root.cz)==&lt;br /&gt;
Ve spolupráci s redakcí Root.cz připravujeme školení PostgreSQL. Podrobnosti o obecném školení můžete nalézt na http://akademie.blog.root.cz/postgresql-efektivne/, školení programování uložených procedur na http://www.root.cz/texty/ulozene-procedury-v-postgresql/ a školení http://www.root.cz/texty/akademie-sql-pro-zacatecniky/ věnované úvodu do SQL.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
==Školení pod záštitou Počítačové školy GOPAS==&lt;br /&gt;
Další školení PostgreSQL je připraveno ve spolupráci s Počítačovou školou GOPAS - http://www.gopas.cz/DetailKurzu.aspx?IDKurzu=942, http://www.gopas.cz/DetailKurzu.aspx?IDKurzu=941.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
==Školení v NICu (Akademie)==&lt;br /&gt;
*[http://www.nic.cz/akademie/course/16/detail/ Optimalizace PostgreSQL] (CZ.NIC) - Čtyřhodinový kurz věnovaný optimalizaci aplikací&lt;br /&gt;
*[http://www.nic.cz/akademie/course/21/detail/ SQL injection – princip a ochrana] (CZ.NIC) - Čtyřhodinový kurz věnovaný problematice SQL injections&lt;br /&gt;
&lt;br /&gt;
==Školení plánovaná na zimu 2014==&lt;br /&gt;
* 2. prosince - [http://www.root.cz/skoleni/sql-pro-zacatecniky/ Úvod do SQL] - Jak jednoduše získat informace z SQL databáze (Akademie root.cz)&lt;br /&gt;
* 3. prosince - [http://akademie.blog.root.cz/postgresql-efektivne/ PostgreSQL efektivne] - Základní administrace PostgreSQL, vysvětlení základních funkcí PostgreSQL ovlivňujících chování MVCC, TOAST - cílem školení je vysvětlit nejdůležitější  funkce PostgreSQL, tak aby účastník školení dokázal efektivně nasadit a provozovat PostgreSQL (Akademie root.cz)&lt;br /&gt;
&lt;br /&gt;
*10. listopadu - [http://www.nic.cz/akademie/course/16/detail/ Optimalizace PostgreSQL] (CZ.NIC) - Čtyřhodinový kurz věnovaný optimalizaci aplikací&lt;br /&gt;
*10. listopadu - [http://www.nic.cz/akademie/course/21/detail/ SQL injection – princip a ochrana] (CZ.NIC) - Čtyřhodinový kurz věnovaný problematice SQL injections&amp;lt;/s&amp;gt;&lt;br /&gt;
*&amp;lt;s&amp;gt;29.11.-1.12. 2010 – PostgreSQL1 - Instalace, administrace a implementace vlastních rozšíření v PostgreSQL (GOPAS)&lt;br /&gt;
*2.-3.12. 2010 – PostgreSQL2 - Implementace uložených procedur v PostgreSQL (GOPAS)&amp;lt;/s&amp;gt;&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1579</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1579"/>
		<updated>2026-04-21T11:38:07Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1578</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1578"/>
		<updated>2026-04-21T10:37:28Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1577</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1577"/>
		<updated>2026-04-21T04:22:00Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1576</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1576"/>
		<updated>2026-04-21T04:21:28Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1575</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1575"/>
		<updated>2026-04-21T03:45:46Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1574</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1574"/>
		<updated>2026-04-21T03:39:57Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1573</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1573"/>
		<updated>2026-04-21T03:31:17Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1572</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1572"/>
		<updated>2026-04-21T03:28:12Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1571</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1571"/>
		<updated>2026-04-20T11:12:40Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1570</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1570"/>
		<updated>2026-04-19T11:29:55Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1569</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1569"/>
		<updated>2026-04-19T11:11:40Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1568</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1568"/>
		<updated>2026-04-19T06:13:22Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1567</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1567"/>
		<updated>2026-04-19T05:23:59Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1566</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1566"/>
		<updated>2026-04-19T05:12:46Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1565</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1565"/>
		<updated>2026-04-19T05:01:12Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1564</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1564"/>
		<updated>2026-04-19T04:41:53Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1563</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1563"/>
		<updated>2026-04-18T04:58:41Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1562</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1562"/>
		<updated>2026-04-17T12:10:15Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&amp;lt;/s&amp;gt;&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1561</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1561"/>
		<updated>2026-04-17T11:59:57Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1560</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1560"/>
		<updated>2026-04-17T11:47:34Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1559</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1559"/>
		<updated>2026-04-17T11:35:11Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1558</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1558"/>
		<updated>2026-04-17T06:22:56Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1557</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1557"/>
		<updated>2026-04-17T06:12:51Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1556</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1556"/>
		<updated>2026-04-17T06:12:15Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1555</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1555"/>
		<updated>2026-04-17T06:06:14Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1554</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1554"/>
		<updated>2026-04-15T19:18:54Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1553</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1553"/>
		<updated>2026-04-15T09:17:42Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1552</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1552"/>
		<updated>2026-04-15T05:52:53Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1551</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1551"/>
		<updated>2026-04-15T04:40:55Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&amp;lt;/s&amp;gt;&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1550</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1550"/>
		<updated>2026-04-15T04:36:29Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1549</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1549"/>
		<updated>2026-04-15T04:13:57Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1548</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1548"/>
		<updated>2026-04-14T15:35:44Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1547</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1547"/>
		<updated>2026-04-14T15:21:56Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1546</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1546"/>
		<updated>2026-04-14T14:17:48Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1545</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1545"/>
		<updated>2026-04-14T14:07:27Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1544</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1544"/>
		<updated>2026-04-14T08:38:00Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
	<entry>
		<id>http://postgres.cz/index.php?title=Patche_19&amp;diff=1543</id>
		<title>Patche 19</title>
		<link rel="alternate" type="text/html" href="http://postgres.cz/index.php?title=Patche_19&amp;diff=1543"/>
		<updated>2026-04-14T08:34:51Z</updated>

		<summary type="html">&lt;p&gt;PavelStehule: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd09f024a1bbdd7a7e2ca944595a9d4b6c90fb83 - regdatabase&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0da29e4cb161f78a5ef534b3fb4467756a422e25 - podpora memoize v anti joinu (v nekterych pripadech)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fe07100e82b096d3c848cace790d4b4daf0c4131 - GetNamedDSA(), GetNamedDSHash() - user friendly alokace dynamicke sdilene pameti&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=167ed8082f40ee1f3f4cd18cf02bd6d17df57dab - pohled pg_dsm_registry_allocations&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f698d7f4b7b4c49c3649b2fcc063eb66f9d2e6c - možnost konfigurace příkazu CHECKPOINT&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=161a3e8b682ebb98ea0b9d5015d22990696b99ec - použití COPY pro LO&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3357471cf9f5e470dfed0c7919bcf31c7efaf2b9 - přidání typu plánu do pg_stat_statements&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd5a1a0c3e566f7fc860838084466a1c25944281 - reseni konfliktu delete/update&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=665c3dbba497b795c4ee46145777bc4eb89c78a1 - příprava na 64bit Datum i na 32bit platformách&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a600a93c7be5b0bf8cacb1af78009db12bc4857 - Datum je 8bajt všude&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=24225ad9aafc576295e210026d8ffa9f50d61145 - vylepšená optimalizace semijoinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;prechod z c99 na c11&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=63599896545c7869f7dd28cd593e8b548983d613 - generování GUC z dat souboru&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=faf071b553830d39fc583beabcaf56ed65259acc - random funkce pro date a timestamp&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=83a56419457ec0eff2eddfed8eb3aba86bede9cc - vylepsene chybove hlaseni nenalezeni funkce&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e1d917182c1953b16b32a39ed2fe38e3d0823047 - podpora kodovani base64url&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ef38a4d9756db9ae1d20f40aa39f3cf76059b81a - GROUP BY ALL&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=25a30bbd4235a49c854036c84fe90f2bc5a87652 - IGNORE NULL pro window funkce&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ec8719ccbfcd78c6b40b5f2b94f60769f3bd08aa - optimalizace hex encode decode pouziti simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e11859102f947e6145acdd809e5cdcdfbe90fa5 - moznost predradit agregaci joinu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4bea91f21f61d01bd40a4191a4a8c82d0959fffe - copy dokaze cist primo z partisen&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2b75c38b707a070922231de667a0bd08ee71b268 - funkce error_on_null - pozor nefunguje korektne s radkovymi typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f0b3573c3aac6c0ea4cbc278f98178516579d370 - podpora synchronizace sekvenci https://www.depesz.com/2025/11/11/waiting-for-postgresql-19-sequence-synchronization-in-logical-replication/&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5173bfd0443e0c0f3fa37006727d516dc1ba4cee - rychlejsi pg_rewind&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f9a09aa2952039a9956b44d929b9df74d62a4cd4 - v pg_stat_wal zobrazi bajty způsobené zápisem full pages&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b3ce55f413cdf70b1bc4724052fb4eacf9de239a - psql moznost v promptu zobrazit search_path&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=645cb44c5490f70da4dca57b8ecca6562fb883a7 - psql moznost nastavit si nahradni text za t a f&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=447aae13b0305780e87cac7b0dd669db6fab3d9d - WAIT FOR lsn&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b140c8d7a3f3a5de4e4cc4a0b52909aa13060d4c - [https://www.thatguyfromdelhi.com/2025/11/teaching-query-planner-to-see-inside-c.html moznost inline dotaz dynamicky dotaz z plpgsql]&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e68b6adad96d414fdf24e072fdb1d41fb4b8f0b7 - slotsync_skip_reason&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bd8d9c9bdfa0c2168bb37edca6fa88168cacbbaa - 64bit multixid&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=67c20979ce72b8c236622e5603f9775968ff501c - moznost pouzivat logickou replikaci bez restartu&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f2e4cc427951b7c46629fb7625a22f7898586f3a - MERGE PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4b3d173629f4cd7ab6cd700d1053af5d5c7c9e37 - SPLIT PARTITIONS&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=97b101776ce23dd6c4abbdae213806bc24ed6133 - monitoring multiactu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b139bd3b6ef000ab5d00dd47128e366a726da5f9 - datovy typ oid8&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=282b1cde9dedf456ecf02eb27caf086023a7bb71 - optimalizace LISTEN&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fcb9c977aa5f1eefe7444e423e833ff64a5d1d8f - specialni zamky pro buffmgr&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=45762084545ec14dbbe66ace1d69d7e89f8978ac - odstraneni podpora pro defaultni postgresove retezce&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0e80f3f88deaefc03e5fd204190daab6f761e73d - moznost dumpu extended statistik&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=38e0190ced714b33c43c9676d768cc6814fc662a - možnost nastavit logování per typ dotazu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=0a379612540cc51e54dc1c0cc4b9ef8797d2533c - optimalizace IS DISTINCT FROM pro ne nullove hodnoty&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f41ab51573a4c3d11f906b32a068182a1fd8596d - optimalizace IS DISTINCT FROM NULL&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=cf74558feb8f41b2bc459f59ed3f991024d04893 - redukce specialnich pripadu outer joinu na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.depesz.com/2026/02/21/waiting-for-postgresql-19-psql-add-i-prompt-escape-to-indicate-hot-standby-status/ - moznost v promtu nastavit stav replikace&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4a1b05caa55dc14a1f936af78d8d19c843bfd8b9 - znovu povolena podpora AIX&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=763aaa06f03401584d07db71256fc0ab47235cce - pg_dumpall muze ukladat i v jinem nez textovem formatu https://www.depesz.com/2026/03/17/waiting-for-postgresql-19-add-non-text-output-formats-to-pg_dumpall/&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ba97bf9cb7b4ca184ab669569be2633a46cfdd0c - podpora dumpu extended expr statistik&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2a525cc97e19868940c533787165bc7e7de3a80a - copy on error set null&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://www.cybertec-postgresql.com/en/insert-on-conflict-do-select-a-new-feature-in-postgresql-v19/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7c1849311e49ec57cb86b32a9aa630456588c3f0 - vychozi komprese wal je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=fd366065e06ae953c4f2d973d5c5f0474f3b87b6 - CREATE PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=34dfca293432e206b8f80431f81535aff69782ca - vychozi komprese TOAST je lz4&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=01d485b142e4c89aef79da9fd60f203c1bd4458b - novy pohled pg_stat_recovery&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8185bb53476378443240d57f7d844347d5fae1bf - CREATE SUBSCRIPTION SERVER&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ac58465e0618941842439eb3f5a2cf8bebd5a3f1 - REPACK&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=342051d73b386ad763e13930e15031f7ba5367f5 - ALTER TABLE ALTER CHECK NOT ENFORCED&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=383eb21ebffe9ddd97dca03e529fa363580e7ccf - konverze NOT IN (SELECT) na antijoin&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=5883ff30b02ceed3c5eabba4d9c09a7766f9a8fc - pg_plan_advice v contribu https://www.depesz.com/2026/03/22/waiting-for-postgresql-19-add-pg_plan_advice-contrib-module/&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a0b6ef29a51818a4073a5f390ed10ef6453d5c11 - umoznuje rychly ALTER TABLE ALTERL COLUMN i pro domenove typy&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=213f0079b3415ad8f5f0a62d119ed1f0a448ad8f - pgstattuple pouziva streaming&lt;br /&gt;
https://postgrespro.com/blog/pgsql/5972812&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e0a3a3fd5361913502ff696ecf47770ca55975ae - optimalizace COPY FROM simd&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c456e39113809376f6604e720910ccd24e18e034 - optimalizace transformace heaptuple na radek&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2f094e7ac691abc9d2fe0f4dcf0feac4a6ce1d9c - podpora SQL/PGQ&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=dd1398f1378799acc60c3ed85d82439b2ff69141 - moznost urcit grantora v prikazu GRANT, REVOKE&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1811f1af98fb237fdd5adb588cd4b57c433b75f8 - výrazně lepší chování HASHJOINu s velkým množstvím NULL hodnot&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=493f8c6439cf64d75883c650b5dd573d8fe0664b - ALTER PUBLICATION EXCEPT TABLE&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7dadd38cda95bf5bc0c4715d9ab71766d1693379 - COPY TO v jsonu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4c0390ac53b745c2800f6aa3d9ee2515d6ab499b - COPY TO JSON force_array&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=ce8d5fe0e2802158b65699aeae1551d489948167 - optimalizace SELECT const INTO var (v plpgsql)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=4019f725f5d43f37b23222d06d20e3da1038d373 - statistiky pro zamky&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e2f289e5b9b82acaf1523fda827e71b8fc8bd549 - soft errors cast - priprava na fault tolerant CAST&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=497c1170cb108cd84fe13db19c049177376fec5f - podpora base32hex&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=41d69e6dccad6ef26511a466e6484bc8807362cf - popisky v internich psql dotazech&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d7965d65fc5bb2139bc51c051c11428414c65160 - prioritni vyber tabulek v autovacuum&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=2da86c1ef9b5446e0e22c0b6a5846293e58d98e3 - optimalizace kontroly referencni integrity&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=8e72d914c52876525a90b28444453de8085c866f - podpora DELETE, UPDATE FOR PORTION OF&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=7f8c88c2b872cb74882ab93dcb05529dab2a10bc - vypnuti JIT&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=b7b27eb41a5cc0b45a1a9ce5c1cde5883d7bc358 - dalsi optimalizace kontroly RI (cca 3x rychlejsi)&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=f19c0eccae9680f5785b11cdc58ef571998caec9 - online vypinani zapinani kontrolnich souctu&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=a4f774cf1c7e5c6cf2f3393f611e1df16cdb5a5a - get pg_get_database_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=76e514ebb4b55f95b844e3e94e61fa64ab16fd0b - get_object_ddl&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e8ec19aa321abc89fb4fd277c994f14680ba17db - pg_stash_advice&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=e972dff6c30447ebcfa2f8601b67f926247463b6 - moznost nastaveni explainu v auto-explainu&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=28d534e2ae0ac888b5460f977a10cd9bb017ef98 - REPACK CONCURRENTLY (zatim s omezenim)&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=87f61f0c82806b7e4201f15bd77920e9e7108b11 - pohled pg_stat_autovacuum_scores&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=1ff3180ca0169556984ab83759477f593129794d - autovacuum muze pouzit paralelni vacuum indexu&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=c10edb102ada607eb054bc9e23690109d86849ef - persistentni hinty&lt;br /&gt;
* &amp;lt;s&amp;gt;https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=294520c44487ecaade7a6ea8781b973f9ed03909 - použití TSC pro explain analyze - explain analyze zpomaluje cca o 60% misto o 150% dotaz 170ms, EA19 278ms, EA18 428ms&amp;lt;/s&amp;gt;&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=3b1117d6e2e47d86cdbd978b79434c630cb0ef52 - EXPLAIN IO&lt;br /&gt;
* https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=d1c01b79d4ae90e52bf9db9c05c9de17b7313e85 - automatika v nastaveni poctu IO workeru&lt;/div&gt;</summary>
		<author><name>PavelStehule</name></author>
	</entry>
</feed>