Thread: RAISE concatination/variables in plpgsql
SEVERITY:Minor Anoyance In the plpgsql docs it has the following example: RAISE NOTICE ''Id number '' || key || '' not found!''; When I put a function round this statement it gives a compile error at the |. Also when fiddling if I put a variable first it complains about that variable (eg key || '' val.....'') Here is the script I ran: DROP FUNCTION tstktxt(text); CREATE FUNCTION tstktxt(text) RETURNS text AS ' DECLARE key ALIAS FOR $1; BEGIN RAISE NOTICE ''Id number '' || key || '' not found!''; RETURN key; END; ' LANGUAGE 'plpgsql'; DROP FUNCTION tstkint(int4); CREATE FUNCTION tstkint(int4) RETURNS int4 AS ' DECLARE key ALIAS FOR $1; BEGIN RAISE NOTICE ''Id number '' || key || '' not found!''; RETURN key; END; ' LANGUAGE 'plpgsql'; SELECT tstktxt('Test'); SELECT tstkint(42); This gave the following result: DROP CREATE DROP CREATE psql:core/kytst.sql:21: NOTICE: plpgsql: ERROR during compile of tstktxt near line 4 psql:core/kytst.sql:21: ERROR: parse error at or near "|" psql:core/kytst.sql:22: NOTICE: plpgsql: ERROR during compile of tstkint near line 4 psql:core/kytst.sql:22: ERROR: parse error at or near "|" Is this a bug or documentation error? I'm running on cygwin 1.1.7, cygipc 1.9.2, on win98SE Here's the postmaster output (with -d2): <<z>>
Attachment
"Henshall, Stuart - WCP" <SHenshall@westcountrypublications.co.uk> writes: > In the plpgsql docs it has the following example: > RAISE NOTICE ''Id number '' || key || '' not found!''; > When I put a function round this statement it gives a compile error at the > |. > Also when fiddling if I put a variable first it complains about that > variable (eg key || '' val.....'') Looking at the plpgsql code, it's clear that what's actually implemented is RAISE level string-literal [ , variable [ , variable [ ... ] ] which is pretty bletcherous; seems like it should accept a list of expressions instead. But for 7.1, I guess this is a documentation bug rather than something to change in the code. regards, tom lane
Bruce Momjian <pgman@candle.pha.pa.us> writes: >> Looking at the plpgsql code, it's clear that what's actually implemented >> is >> RAISE level string-literal [ , variable [ , variable [ ... ] ] > I see the current docs showing: > RAISE level 'format' [, identifier [...]]; > Is this acceptable? Should 'identifier' be 'variable'? Probably. And 'format' is even more misleading, since it implies that you write a printf-like format string, which you do not. The output is just the concatenation of the literal and the variable values. >> which is pretty bletcherous; seems like it should accept a list of >> expressions instead. But for 7.1, I guess this is a documentation bug >> rather than something to change in the code. > Do I need a TODO item here? It seems in need of fixing to me ... regards, tom lane
> Bruce Momjian <pgman@candle.pha.pa.us> writes: > >> Looking at the plpgsql code, it's clear that what's actually implemented > >> is > >> RAISE level string-literal [ , variable [ , variable [ ... ] ] > > > I see the current docs showing: > > > RAISE level 'format' [, identifier [...]]; > > > Is this acceptable? Should 'identifier' be 'variable'? > > Probably. And 'format' is even more misleading, since it implies that > you write a printf-like format string, which you do not. The output is > just the concatenation of the literal and the variable values. Updated with patch attached. > > >> which is pretty bletcherous; seems like it should accept a list of > >> expressions instead. But for 7.1, I guess this is a documentation bug > >> rather than something to change in the code. > > > Do I need a TODO item here? > > It seems in need of fixing to me ... TODO updated with: * Allow Pl/PgSQL's RAISE function to take expressions -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 Index: doc/src/sgml/plsql.sgml =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/doc/src/sgml/plsql.sgml,v retrieving revision 2.25 diff -c -r2.25 plsql.sgml *** doc/src/sgml/plsql.sgml 2001/03/23 22:07:50 2.25 --- doc/src/sgml/plsql.sgml 2001/05/08 00:05:24 *************** *** 1306,1312 **** <productname>Postgres</productname> elog mechanism. <synopsis> ! RAISE <replaceable class="parameter">level</replaceable> '<replaceable class="parameter">format</replaceable>' <optional>,<replaceable class="parameter">identifier</replaceable> <optional>...</optional></optional>; </synopsis> Inside the format, <literal>%</literal> is used as a placeholder for the --- 1306,1312 ---- <productname>Postgres</productname> elog mechanism. <synopsis> ! RAISE <replaceable class="parameter">level</replaceable> '<replaceable class="parameter">string</replaceable>' <optional>,<replaceable class="parameter">variable</replaceable> <optional>...</optional></optional>; </synopsis> Inside the format, <literal>%</literal> is used as a placeholder for the
I wrote: >> Probably. And 'format' is even more misleading, since it implies that >> you write a printf-like format string, which you do not. The output is >> just the concatenation of the literal and the variable values. Ugh. Should've read the code before pontificating ;-). The code makes clear what is quite unclear in the docs: /* * Occurences of a single % are replaced by the next arguments * external representation. Double %'s are left as is so elog() * will also don't touch them. */ So "format" is appropriate, but the next sentence could use some improvement. regards, tom lane
> "Henshall, Stuart - WCP" <SHenshall@westcountrypublications.co.uk> writes: > > In the plpgsql docs it has the following example: > > RAISE NOTICE ''Id number '' || key || '' not found!''; > > When I put a function round this statement it gives a compile error at the > > |. > > Also when fiddling if I put a variable first it complains about that > > variable (eg key || '' val.....'') > > Looking at the plpgsql code, it's clear that what's actually implemented > is > RAISE level string-literal [ , variable [ , variable [ ... ] ] I see the current docs showing: RAISE level 'format' [, identifier [...]]; Is this acceptable? Should 'identifier' be 'variable'? > which is pretty bletcherous; seems like it should accept a list of > expressions instead. But for 7.1, I guess this is a documentation bug > rather than something to change in the code. Do I need a TODO item here? -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026
OK, SGML updated. > I wrote: > >> Probably. And 'format' is even more misleading, since it implies that > >> you write a printf-like format string, which you do not. The output is > >> just the concatenation of the literal and the variable values. > > Ugh. Should've read the code before pontificating ;-). The code makes > clear what is quite unclear in the docs: > /* > * Occurences of a single % are replaced by the next arguments > * external representation. Double %'s are left as is so elog() > * will also don't touch them. > */ > So "format" is appropriate, but the next sentence could use some > improvement. > > regards, tom lane > -- Bruce Momjian | http://candle.pha.pa.us pgman@candle.pha.pa.us | (610) 853-3000 + If your life is a hard drive, | 830 Blythe Avenue + Christ can be your backup. | Drexel Hill, Pennsylvania 19026 Index: doc/src/sgml/plsql.sgml =================================================================== RCS file: /home/projects/pgsql/cvsroot/pgsql/doc/src/sgml/plsql.sgml,v retrieving revision 2.26 diff -c -r2.26 plsql.sgml *** doc/src/sgml/plsql.sgml 2001/05/08 00:09:22 2.26 --- doc/src/sgml/plsql.sgml 2001/05/08 00:25:57 *************** *** 1306,1319 **** <productname>Postgres</productname> elog mechanism. <synopsis> ! RAISE <replaceable class="parameter">level</replaceable> '<replaceable class="parameter">string</replaceable>' <optional>,<replaceable class="parameter">variable</replaceable> <optional>...</optional></optional>; </synopsis> ! Inside the format, <literal>%</literal> is used as a placeholder for the ! subsequent comma-separated identifiers. Possible levels are ! DEBUG (silently suppressed in production running databases), NOTICE ! (written into the database log and forwarded to the client application) ! and EXCEPTION (written into the database log and aborting the transaction). </para> <para> --- 1306,1320 ---- <productname>Postgres</productname> elog mechanism. <synopsis> ! RAISE <replaceable class="parameter">level</replaceable> '<replaceable class="parameter">format</replaceable>' <optional>,<replaceable class="parameter">variable</replaceable> <optional>...</optional></optional>; </synopsis> ! Inside the format, <literal>%</literal> is replaced by the next argument's ! external representation. Double %'s are left unchanged for internal ! reasons. Possible levels are DEBUG (silently suppressed in production ! running databases), NOTICE (written into the database log and forwarded to ! the client application) and EXCEPTION (written into the database log and ! aborting the transaction). </para> <para>