Thread: query output in psql PROMPT
A simple patch allow query output in psql PROMPT strings: Index: prompt.c =================================================================== RCS file: /projects/cvsroot/pgsql/src/bin/psql/prompt.c,v retrieving revision 1.38 diff -U2 -r1.38 prompt.c --- prompt.c 1 Jan 2005 05:43:08 -0000 1.38 +++ prompt.c 14 Jan 2005 14:39:24 -0000 @@ -61,4 +61,7 @@ * %[ ... %] - tell readline that the contained text is invisible * + * %.query. - the value of the first field in the first row returned + * by the specified query. + * * If the application-wide prompts become NULL somehow, the returned string * will be empty (not NULL!). @@ -272,4 +275,29 @@ } + /* execute db proc */ + case '.': + { + char *cmd = pg_strdup(p + 1); + PGresult *res; + int cmdend; + + cmdend = strcspn(cmd, "."); + cmd[cmdend] = '\0'; + if (cmd) + { + res = PSQLexec(cmd, false); + } + if (res && PQntuples(res) ) + { + memcpy(buf, PQgetvalue(res, 0, 0), MAX_PROMPT_SIZE-1); + PQclear(res); + } + if (strlen(buf) > 0 && buf[strlen(buf) - 1] == '\n') + buf[strlen(buf) - 1] = '\0'; + free(cmd); + p += cmdend + 1; + break; + } + /* interpolate variable */ case ':': -- For standing up against patentability of software, Thank You, Poland! Read the intervention: http://kwiki.ffii.org/ConsPolon041221En Send your thanks: thankyoupoland.info Read/do more: http://www.noepatents.org/
strk <strk@keybit.net> writes: > A simple patch allow query output in psql PROMPT strings: Why is this a good idea? Having a query implicitly executed during every prompt will have a ton of bad side effects, for instance prematurely freezing the query snapshot in SERIALIZABLE transactions. The syntax you propose is downright bizarre --- what if I needed a dot in the query text? > + cmdend = strcspn(cmd, "."); > + cmd[cmdend] = '\0'; > + if (cmd) > + { > + res = PSQLexec(cmd, false); > + } What's the if for? cmd can't be NULL (you already dumped core if it is). > + if (res && PQntuples(res) ) > + { > + memcpy(buf, PQgetvalue(res, 0, 0), MAX_PROMPT_SIZE-1); > + PQclear(res); > + } Leaks memory on query failure. > + if (strlen(buf) > 0 && buf[strlen(buf) - 1] == '\n') > + buf[strlen(buf) - 1] = '\0'; Uses undefined contents of buf on query failure. > + p += cmdend + 1; Falls off the end of the prompt if there was no terminating dot, causing subsequent iterations of the loop to continue reading undefined memory. regards, tom lane
On Fri, Jan 14, 2005 at 12:06:32PM -0500, Tom Lane wrote: > strk <strk@keybit.net> writes: > > A simple patch allow query output in psql PROMPT strings: > > Why is this a good idea? Having a query implicitly executed during > every prompt will have a ton of bad side effects, for instance > prematurely freezing the query snapshot in SERIALIZABLE transactions. The only purpose for having made the patch is having current_schema() printed on the prompt (for the first question). I know the code is very dirty, is there a chance to current_schema() as a variable if that won't change transaction status ? --strk; > > The syntax you propose is downright bizarre --- what if I needed a dot > in the query text? > > > + cmdend = strcspn(cmd, "."); > > + cmd[cmdend] = '\0'; > > + if (cmd) > > + { > > + res = PSQLexec(cmd, false); > > + } > > What's the if for? cmd can't be NULL (you already dumped core if it > is). > > > + if (res && PQntuples(res) ) > > + { > > + memcpy(buf, PQgetvalue(res, 0, 0), MAX_PROMPT_SIZE-1); > > + PQclear(res); > > + } > > Leaks memory on query failure. > > > + if (strlen(buf) > 0 && buf[strlen(buf) - 1] == '\n') > > + buf[strlen(buf) - 1] = '\0'; > > Uses undefined contents of buf on query failure. > > > + p += cmdend + 1; > > Falls off the end of the prompt if there was no terminating dot, causing > subsequent iterations of the loop to continue reading undefined memory. > > regards, tom lane -- For standing up against patentability of software, Thank You, Poland! Read the intervention: http://kwiki.ffii.org/ConsPolon041221En Send your thanks: thankyoupoland.info Read/do more: http://www.noepatents.org/
Mm... let alone my patch but the 'Uses undefined contents of buf' is not true (buf is initialized to contain all 0es: 111:memset(buf, 0, MAX_PROMPT_SIZE + 1); And the 'Falls off the end of prompt string' is common to all non-singlechar handlings (execute command, interpolate variable). .. the remaining part can be cleaned up but I dunno about transaction state problems .. --strk; On Fri, Jan 14, 2005 at 12:06:32PM -0500, Tom Lane wrote: > strk <strk@keybit.net> writes: > > A simple patch allow query output in psql PROMPT strings: > > Why is this a good idea? Having a query implicitly executed during > every prompt will have a ton of bad side effects, for instance > prematurely freezing the query snapshot in SERIALIZABLE transactions. > > The syntax you propose is downright bizarre --- what if I needed a dot > in the query text? > > > + cmdend = strcspn(cmd, "."); > > + cmd[cmdend] = '\0'; > > + if (cmd) > > + { > > + res = PSQLexec(cmd, false); > > + } > > What's the if for? cmd can't be NULL (you already dumped core if it > is). > > > + if (res && PQntuples(res) ) > > + { > > + memcpy(buf, PQgetvalue(res, 0, 0), MAX_PROMPT_SIZE-1); > > + PQclear(res); > > + } > > Leaks memory on query failure. > > > + if (strlen(buf) > 0 && buf[strlen(buf) - 1] == '\n') > > + buf[strlen(buf) - 1] = '\0'; > > Uses undefined contents of buf on query failure. > > > + p += cmdend + 1; > > Falls off the end of the prompt if there was no terminating dot, causing > subsequent iterations of the loop to continue reading undefined memory. > > regards, tom lane -- For standing up against patentability of software, Thank You, Poland! Read the intervention: http://kwiki.ffii.org/ConsPolon041221En Send your thanks: thankyoupoland.info Read/do more: http://www.noepatents.org/