jako vždy je to složitější
a) pro EDB a další firmy, které vývoj Postgresu ve výsledku živí je velkou motivací zjednodušení migrace z Oracle. A řady apek se Oracle úplně neopouští, nechceš se nebo nemůžeš úplně přizpůsobit Postgresu. A pak tu máš samozřejmě ANSI/SQL, který některé věci definuje, dost jich nechává implementačně závislých, atd. V postgresu řada omezení byla implementační, a s tím jak se rozvíjí možnosti v Bizonu, a znalosti vývojářů, tak lze některá omezení eliminovat - protože některá omezení byla (jsou) matoucí. Je výrazně víc aplikací bez PL/SQL (PL/pgSQL) než s ním.
b) Problém o kterém se bavíme je primárně problémem PL/pgSQL. V běžných dotazech to taková past není, tam je jasně vidět, co z dotazu leze, a pokud se ti chytne něco, co jsi nečekal jako label, tak je to vidět. Případně ti popada apka, protože máš neočekávaný label. Interně ale se pro přístup k výsledkům dotazu používají pořadová čísla sloupců, a label je ignorovaný, takže PL/pgSQL perfektně zamaskuje chybu, což je špatně - a vychází to z technologie - PostgreSQL používá jak pro SQL, tak pro PL/pgSQL generovaný parser
https://en.wikipedia.org/wiki/GNU_Bison .
To má svoje výhody - i pro relativně komplexní jazyk jako je SQL máš docela čitelnou gramatiku. Gramatiku můžeš snadno udržovat, snadno rozšiřovat, a téměř se ti nestane, že by ti parser sežral něco, co neměl nebo naopak nesežral něco, co měl. Navíc, kód který je vygenerovaný Bisonem je velice rychlý. V PL/pgSQL se používají dvě gramatiky - PL/pgSQL a SQL, no a velkou nevýhodou je, že gramatiky téměř nejdou propojit. Nějak to jde, ale než se přišlo na nějaký jednoduchý způsob, tak to trvalo přes 20 let. Integrace PL/pgSQL a SQL se děje až při exekuci, což je na identifikaci některých chyb pozdě, a ještě poměrně nedávno nebyla jakákoliv podpora pro PL/pgSQL v SQL parseru. Kdyby se používaly ručně psané parsery, tak by to byla brnkačka (ale už není brnkačka napsal ručně parser pro SQL (zkoušel jsem to)). Jelikož ta integrace gramatik nešla, tak PL/pgSQL, když pracoval s SQL, tak používal dost primitivní metody, jak převést něco na SQL výraz, a díky tomu je to náchylné na některé chyby.
c) Vývoji engine PL/pgSQL se věnují možná 2-3 lidi na planetě. (ono je to maličké) Naštěstí je mezi nimi Tom Lane. Lidi, kteří řeší kompatibilitu s Oraclem, standardem, to nejsou. Není moc lidí, kterým by sepnulo, že díky větší toleranci začnou v PL/pgSQL procházet nějaké chyby. Navíc i kdyby jim to docvaklo, tak asi by se s tím stejně naučili žít. Chyba musí být na vstupu, a ještě do jisté míry je to chyba PL/pgSQL - a uložené procedury se možná používají v 1-5% (spíš méně).
d) Bohužel parsery generované z gramatik nejdou parametrizovat - podle mne nemůžeš napsat něco ve stylu, pokud je nastavená nějaká proměnná, tak požaduj použití AS a jindy to nepožaduj. Mohl bys mít několik různých gramatik, a přepínat mezi nimi - každá gramatika znamená cca 2MB kódu, což třeba dneska už moc není, ale Tom Lane a další jsou chlapi, ze staré školy a 2MB redundantního kódu by rozhodně neskousli. U ručně psaného parseru by to asi nebyl problém. Komerční forky Postgresu tuhle techniku používají, tipoval bych, že to dělá i MSSQL. Oracle má ručně psaný parser.
e) V postgresu je neskutečná averze proti jakýmkoliv volbám, které by umožňovaly výběr mezi různým chováním čehokoliv. Stačil třeba jen výběr chování stringu - mezi Postgresovým stringem a ANSI/SQL stringem - podobně problémový byl přechod výstupního formátu z base64 na hexacode. Uživatelé pak měli problémy s obnovou z backapů nebo s migracema, když si něco takového nastavili jinak. Konfigurace v Postgresu nastavují alokace, nastavují nějaké výchozí formáty, ale téměř nikdy, jak se něco chová. To je absolutní tabu. A teď v takovém prostředí a s použitýma technologiema něco výmýšlej.