From c42b959fb318637b43ab245da10035d4ec3cb4d3 Mon Sep 17 00:00:00 2001 From: Jan Wieck Date: Thu, 28 Jan 1999 11:48:31 +0000 Subject: [PATCH] Partial support for mixed case in PL/pgSQL. Left are identifiers that contain non-alnum/_ chars. So e.g. whitespaces in identifiers are still not supported. Jan --- src/pl/plpgsql/src/gram.y | 6 ++--- src/pl/plpgsql/src/pl_comp.c | 14 ++++++------ src/pl/plpgsql/src/pl_funcs.c | 43 ++++++++++++++++++++++++++++------- src/pl/plpgsql/src/scan.l | 6 ++--- 4 files changed, 48 insertions(+), 21 deletions(-) diff --git a/src/pl/plpgsql/src/gram.y b/src/pl/plpgsql/src/gram.y index 30bc55f69e..a9488eda38 100644 --- a/src/pl/plpgsql/src/gram.y +++ b/src/pl/plpgsql/src/gram.y @@ -4,7 +4,7 @@ * procedural language * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.1 1998/08/24 19:14:47 momjian Exp $ + * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/gram.y,v 1.2 1999/01/28 11:48:30 wieck Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -344,7 +344,7 @@ decl_aliasitem : T_WORD char *name; plpgsql_ns_setlocal(false); - name = plpgsql_tolower(pstrdup(yytext)); + name = plpgsql_tolower(yytext); if (name[0] != '$') { elog(ERROR, "can only alias positional parameters"); } @@ -374,7 +374,7 @@ decl_varname : T_WORD decl_renname : T_WORD { - $$ = plpgsql_tolower(pstrdup(yytext)); + $$ = plpgsql_tolower(yytext); } ; diff --git a/src/pl/plpgsql/src/pl_comp.c b/src/pl/plpgsql/src/pl_comp.c index a5a29878af..08176cb280 100644 --- a/src/pl/plpgsql/src/pl_comp.c +++ b/src/pl/plpgsql/src/pl_comp.c @@ -3,7 +3,7 @@ * procedural language * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.4 1998/11/27 20:07:22 vadim Exp $ + * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_comp.c,v 1.5 1999/01/28 11:48:31 wieck Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -537,7 +537,7 @@ plpgsql_parse_word(char *word) * We do our lookups case insensitive * ---------- */ - cp = plpgsql_tolower(pstrdup(word)); + cp = plpgsql_tolower(word); /* ---------- * Special handling when compiling triggers @@ -657,7 +657,7 @@ plpgsql_parse_dblword(char *string) * Convert to lower case and separate the words * ---------- */ - word1 = plpgsql_tolower(pstrdup(string)); + word1 = plpgsql_tolower(string); word2 = strchr(word1, '.'); *word2++ = '\0'; @@ -783,7 +783,7 @@ plpgsql_parse_tripword(char *string) * Convert to lower case and separate the words * ---------- */ - word1 = plpgsql_tolower(pstrdup(string)); + word1 = plpgsql_tolower(string); word2 = strchr(word1, '.'); *word2++ = '\0'; word3 = strchr(word2, '.'); @@ -893,7 +893,7 @@ plpgsql_parse_wordtype(char *word) * We do our lookups case insensitive * ---------- */ - cp = plpgsql_tolower(pstrdup(word)); + cp = plpgsql_tolower(word); *(strchr(cp, '%')) = '\0'; /* ---------- @@ -988,7 +988,7 @@ plpgsql_parse_dblwordtype(char *string) * Convert to lower case and separate the words * ---------- */ - word1 = plpgsql_tolower(pstrdup(string)); + word1 = plpgsql_tolower(string); word2 = strchr(word1, '.'); *word2++ = '\0'; *(strchr(word2, '%')) = '\0'; @@ -1123,7 +1123,7 @@ plpgsql_parse_wordrowtype(char *string) * Get the word in lower case and fetch the pg_class tuple. * ---------- */ - word1 = plpgsql_tolower(pstrdup(string)); + word1 = plpgsql_tolower(string); cp = strchr(word1, '%'); *cp = '\0'; diff --git a/src/pl/plpgsql/src/pl_funcs.c b/src/pl/plpgsql/src/pl_funcs.c index 5cb2b7002b..d8dd645a26 100644 --- a/src/pl/plpgsql/src/pl_funcs.c +++ b/src/pl/plpgsql/src/pl_funcs.c @@ -3,7 +3,7 @@ * procedural language * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.2 1998/09/01 04:40:24 momjian Exp $ + * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.3 1999/01/28 11:48:31 wieck Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -189,6 +189,7 @@ plpgsql_ns_additem(int itemtype, int itemno, char *name) if (name == NULL) name = ""; + name = plpgsql_tolower(name); if (ns->items_used == ns->items_alloc) { @@ -320,22 +321,48 @@ plpgsql_ns_rename(char *oldname, char *newname) /* ---------- - * plpgsql_tolower Translate a string in place to - * lower case + * plpgsql_tolower Translate a string to lower case + * but honor "" escaping. * ---------- */ char * plpgsql_tolower(char *s) { - char *cp; + char *ret; + char *cp; - for (cp = s; *cp; cp++) + ret = palloc(strlen(s) + 1); + cp = ret; + + while (*s) { - if (isupper(*cp)) - *cp = tolower(*cp); + if (*s == '"') + { + s++; + while (*s) + { + if (*s == '"') + break; + *cp++ = *s++; + } + if (*s != '"') + { + plpgsql_comperrinfo(); + elog(ERROR, "unterminated \""); + } + s++; + } + else + { + if (isupper(*s)) + *cp++ = tolower(*s++); + else + *cp++ = *s++; + } } + *cp = '\0'; - return s; + return ret; } diff --git a/src/pl/plpgsql/src/scan.l b/src/pl/plpgsql/src/scan.l index 6575bdd77b..b408b5139b 100644 --- a/src/pl/plpgsql/src/scan.l +++ b/src/pl/plpgsql/src/scan.l @@ -4,7 +4,7 @@ * procedural language * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.1 1998/08/24 19:14:49 momjian Exp $ + * $Header: /cvsroot/pgsql/src/pl/plpgsql/src/Attic/scan.l,v 1.2 1999/01/28 11:48:31 wieck Exp $ * * This software is copyrighted by Jan Wieck - Hamburg. * @@ -46,8 +46,8 @@ static void plpgsql_input(char *buf, int *result, int max); #define YY_INPUT(buf,res,max) plpgsql_input(buf, &res, max) %} -WS [[:alpha:]_] -WC [[:alnum:]_] +WS [[:alpha:]_"] +WC [[:alnum:]_"] %x IN_STRING IN_COMMENT