Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow dollar quoting for PL/pgSQL code #122

Open
schmandr opened this issue Sep 18, 2023 · 2 comments
Open

Allow dollar quoting for PL/pgSQL code #122

schmandr opened this issue Sep 18, 2023 · 2 comments
Assignees
Labels
enhancement New feature or request

Comments

@schmandr
Copy link
Contributor

schmandr commented Sep 18, 2023

Ich versuche, mit dem SqlExecutor folgende Funktion anzulegen:

CREATE OR REPLACE FUNCTION ${dbSchema}.lastchange() RETURNS trigger AS $$
BEGIN
    NEW.t_lastchange := current_timestamp;
    NEW.t_user := session_user;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

Dies schlägt fehl mit der Meldung:
java.sql.SQLException: Error while executing the sqlstatement. ERROR: syntax error at or near "$"
Am PostgreSQL-DB-Server kommt hierbei folgende Query an:

CREATE OR REPLACE FUNCTION arp_agglomerationsprogramme_v1.lastchange() RETURNS trigger AS $ BEGIN     NEW.t_lastchange := current_timestamp

Also andere Variante, die Funktion zu formulieren:

CREATE OR REPLACE FUNCTION ${dbSchema}.lastchange() RETURNS trigger AS $foo$
BEGIN
    NEW.t_lastchange := current_timestamp;
    NEW.t_user := session_user;
    RETURN NEW;
END;
$foo$ LANGUAGE plpgsql;

So schlägt der SqlExecutor ebenfalls fehl mit der Meldung:
java.sql.SQLException: Error while executing the sqlstatement. Unterminated dollar quote started at position 90 in SQL CREATE OR REPLACE FUNCTION arp_agglomerationsprogramme_v1.lastchange() RETURNS trigger AS $foo$ BEGIN NEW.t_lastchange := current_timestamp. Expected terminating $$
Die Query wird in diesem Fall gar nicht erst an den DB-Server gesendet.

Nochmal andere Variante, die Funktion zu schreiben (mit Hochkommas statt Dollar Quoting):

CREATE OR REPLACE FUNCTION ${dbSchema}.lastchange() RETURNS trigger AS
'BEGIN
    NEW.t_lastchange := current_timestamp;
    NEW.t_user := session_user;
    RETURN NEW;
END;'
LANGUAGE plpgsql;

Dies funktioniert. Es hat allerdings den Nachteil, dass komplizierterer Funktionsinhalt wegen dem dann notwendigen Escapen von Anführungszeichen sehr unübersichtlich wird. (Beispiele siehe https://www.postgresql.org/docs/15/plpgsql-development-tips.html#PLPGSQL-QUOTE-TIPS.) Die bessere Variante wäre also das Dollar Quoting.

Mein Feature Request ist deshalb, dass GRETL dies falls möglich erlauben würde, zumindest den ersten Fall.

@schmandr schmandr added the enhancement New feature or request label Sep 18, 2023
@schmandr
Copy link
Contributor Author

Ah, die Parameter-Funktionalität ist wohl in https://github.com/claeis/ehisqlgen/blob/f8282853340e0bf0344e3c2e0537dd7d3259a22e/src/ch/ehi/sqlgen/SqlReader.java#L112, also nicht in GRETL selber zu Hause...

@schmandr
Copy link
Contributor Author

schmandr commented Sep 18, 2023

Habe noch folgenden Hack ausprobiert:

CREATE OR REPLACE FUNCTION ${dbSchema}.lastchange() RETURNS trigger AS ${dollarQuoting}
BEGIN
    NEW.t_lastchange := current_timestamp;
    NEW.t_user := session_user;
    RETURN NEW;
END;
${dollarQuoting} LANGUAGE plpgsql;

Wobei ich als Parameter zusätzlich dollarQuoting: '$$' übergeben habe.

Dies scheitert mit der Meldung wie im zweiten Fall von oben:
java.sql.SQLException: Error while executing the sqlstatement. Unterminated dollar quote started at position 90 in SQL CREATE OR REPLACE FUNCTION arp_agglomerationsprogramme_v1.lastchange() RETURNS trigger AS $$ BEGIN NEW.t_lastchange := current_timestamp. Expected terminating $$
Die Query wird in diesem Fall ebenfalls gar nicht an den DB-Server gesendet.

Das Problem ist wohl (nach etwas Recherche), dass der SQL-Parser nicht kapiert, dass das erste Semikolon innerhalb der Funktionsdefinition nicht der Abschluss des gesamten SQL-Statements ist, sondern dass es nur diesen einen plpgsql-Befehl abschliesst. Quelle: https://stackoverflow.com/q/30211053 (zweiter Kommentar)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants