Fix ancient oversight in psql's \d pattern processing code: when seeing two

quote chars inside quote marks, should emit one quote *and stay in inquotes
mode*.  No doubt the lack of reports of this have something to do with the
poor documentation of the feature ...
This commit is contained in:
Tom Lane 2006-10-07 22:21:50 +00:00
parent 704f8ea11c
commit 5361743826

View File

@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2005, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.111 2005/01/01 05:43:08 momjian Exp $
* $PostgreSQL: pgsql/src/bin/psql/describe.c,v 1.111.4.1 2006/10/07 22:21:50 tgl Exp $
*/
#include "postgres_fe.h"
#include "describe.h"
@ -1815,34 +1815,37 @@ processNamePattern(PQExpBuffer buf, const char *pattern,
while (*cp)
{
if (*cp == '"')
char ch = *cp;
if (ch == '"')
{
if (inquotes && cp[1] == '"')
{
/* emit one quote */
/* emit one quote, stay in inquotes mode */
appendPQExpBufferChar(&namebuf, '"');
cp++;
}
inquotes = !inquotes;
else
inquotes = !inquotes;
cp++;
}
else if (!inquotes && isupper((unsigned char) *cp))
else if (!inquotes && isupper((unsigned char) ch))
{
appendPQExpBufferChar(&namebuf,
pg_tolower((unsigned char) *cp));
pg_tolower((unsigned char) ch));
cp++;
}
else if (!inquotes && *cp == '*')
else if (!inquotes && ch == '*')
{
appendPQExpBuffer(&namebuf, ".*");
cp++;
}
else if (!inquotes && *cp == '?')
else if (!inquotes && ch == '?')
{
appendPQExpBufferChar(&namebuf, '.');
cp++;
}
else if (!inquotes && *cp == '.')
else if (!inquotes && ch == '.')
{
/* Found schema/name separator, move current pattern to schema */
resetPQExpBuffer(&schemabuf);