PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL forza la sintassi SQL standard

PostgreSQL non ha tale funzionalità. Anche se lo facesse, non ti aiuterebbe moltissimo perché le interpretazioni dello standard SQL variano, il supporto per la sintassi e le funzionalità standard variano e alcuni DB sono rilassati sulle restrizioni che altri impongono o hanno limitazioni che altri no. La sintassi è l'ultimo dei tuoi problemi.

L'unico modo affidabile per scrivere SQL portatile su più DB è testare quell'SQL su ogni database di destinazione come parte di una suite di test automatizzata . E giurare molto.

In molti punti il ​​parser/rewriter di query trasforma l'"ortografia" standard di una query nel modulo interno di PostgreSQL, che verrà emesso durante il dump/reload. In particolare, PostgreSQL non memorizza il codice sorgente non elaborato per cose come viste, espressioni di vincoli di controllo, espressioni di indice, ecc. Memorizza l'albero di analisi interno e ricostruisce il sorgente da quello quando gli viene chiesto di scaricare o visualizzare l'oggetto.

Ad esempio:

regress=> CREATE TABLE sometable ( x varchar(100) );
CREATE TABLE
regress=> CREATE VIEW someview AS SELECT CAST (x AS integer) FROM sometable;
CREATE VIEW
regress=> SELECT pg_get_viewdef('someview');
           pg_get_viewdef            
-------------------------------------
  SELECT (sometable.x)::integer AS x
    FROM sometable;
(1 row)

Sarebbe comunque abbastanza inutile, dal momento che lo standard non specifica alcune funzionalità piuttosto comuni e importanti e spesso ha specifiche piuttosto ambigue di cose che definisce. Fino a poco tempo fa non definiva un modo per limitare il numero di righe restituite da una query, ad esempio, quindi ogni database aveva una propria sintassi diversa (TOP , LIMIT / OFFSET , ecc).

Altre cose specificate dallo standard non sono implementate dalla maggior parte dei fornitori, quindi usarle è piuttosto inutile. Buona fortuna per l'utilizzo delle colonne di identità e generate dallo standard SQL in tutti i fornitori di database.

Sarebbe molto carino avere una modalità di dump "preferisci l'ortografia standard", che utilizzava CAST invece di :: , ecc, ma non è davvero semplice da fare perché alcune trasformazioni non sono 1:1 reversibili, ad esempio:

regress=> CREATE VIEW v AS SELECT '1234' SIMILAR TO '%23%';
CREATE VIEW
regress=> SELECT pg_get_viewdef('v');

 SELECT ('1234'::text ~ similar_escape('%23%'::text, NULL::text));

oppure:

regress=> CREATE VIEW v2 AS SELECT extract(dow FROM current_date);
CREATE VIEW
regress=> SELECT pg_get_viewdef('v2');

 SELECT date_part('dow'::text, ('now'::text)::date) AS date_part;

quindi vedi che dovrebbero essere apportate modifiche significative al modo in cui PostgreSQL rappresenta internamente e funziona con funzioni ed espressioni prima che ciò che desideri sia possibile.

Molte delle cose standard SQL utilizzano una sintassi originale che PostgreSQL converte in chiamate di funzione e cast durante l'analisi, quindi non è necessario aggiungere funzionalità di casi speciali ogni volta che il comitato SQL ha un'altra scoreggia cerebrale e tira qualche nuovo bit creativo di sintassi fuori... da qualche parte. La modifica richiederebbe l'aggiunta di tonnellate di nuovi tipi di nodi di espressione e confusione generale, il tutto senza alcun reale guadagno.