diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/parser/scan.l | 5 | ||||
-rw-r--r-- | src/backend/parser/scansup.c | 25 | ||||
-rw-r--r-- | src/backend/utils/misc/guc.c | 6 | ||||
-rw-r--r-- | src/bin/pg_dump/pg_dump.c | 6 | ||||
-rw-r--r-- | src/bin/psql/tab-complete.c | 6 | ||||
-rw-r--r-- | src/include/parser/scansup.h | 4 | ||||
-rw-r--r-- | src/include/port.h | 4 | ||||
-rw-r--r-- | src/interfaces/ecpg/preproc/pgc.l | 27 | ||||
-rw-r--r-- | src/interfaces/libpq/fe-auth.c | 4 | ||||
-rw-r--r-- | src/pl/plpgsql/src/pl_exec.c | 5 | ||||
-rw-r--r-- | src/pl/plpgsql/src/pl_funcs.c | 8 | ||||
-rw-r--r-- | src/port/path.c | 4 |
12 files changed, 76 insertions, 28 deletions
diff --git a/src/backend/parser/scan.l b/src/backend/parser/scan.l index c97c9e6ada3..303350fac9a 100644 --- a/src/backend/parser/scan.l +++ b/src/backend/parser/scan.l @@ -24,7 +24,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/scan.l,v 1.137 2006/09/03 03:19:44 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/parser/scan.l,v 1.138 2006/09/22 21:39:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -145,6 +145,9 @@ static unsigned char unescape_single_char(unsigned char c); * did not end with a newline. * * XXX perhaps \f (formfeed) should be treated as a newline as well? + * + * XXX if you change the set of whitespace characters, fix scanner_isspace() + * to agree, and see also the plpgsql lexer. */ space [ \t\n\r\f] diff --git a/src/backend/parser/scansup.c b/src/backend/parser/scansup.c index c326ef0e3ab..807338652b4 100644 --- a/src/backend/parser/scansup.c +++ b/src/backend/parser/scansup.c @@ -9,7 +9,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/scansup.c,v 1.33 2006/07/14 14:52:22 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/parser/scansup.c,v 1.34 2006/09/22 21:39:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -183,3 +183,26 @@ truncate_identifier(char *ident, int len, bool warn) ident[len] = '\0'; } } + +/* + * scanner_isspace() --- return TRUE if flex scanner considers char whitespace + * + * This should be used instead of the potentially locale-dependent isspace() + * function when it's important to match the lexer's behavior. + * + * In principle we might need similar functions for isalnum etc, but for the + * moment only isspace seems needed. + */ +bool +scanner_isspace(char ch) +{ + /* This must match scan.l's list of {space} characters */ + /* and plpgsql's scan.l as well */ + if (ch == ' ' || + ch == '\t' || + ch == '\n' || + ch == '\r' || + ch == '\f') + return true; + return false; +} diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 7f7ded9e6a5..9467e6412c6 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -10,7 +10,7 @@ * Written by Peter Eisentraut <peter_e@gmx.net>. * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.351 2006/09/22 17:41:21 petere Exp $ + * $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.352 2006/09/22 21:39:57 tgl Exp $ * *-------------------------------------------------------------------- */ @@ -6155,7 +6155,7 @@ assign_custom_variable_classes(const char *newval, bool doit, GucSource source) initStringInfo(&buf); while ((c = *cp++) != 0) { - if (isspace(c)) + if (isspace((unsigned char) c)) { if (symLen > 0) hasSpaceAfterToken = true; @@ -6173,7 +6173,7 @@ assign_custom_variable_classes(const char *newval, bool doit, GucSource source) continue; } - if (hasSpaceAfterToken || !isalnum(c)) + if (hasSpaceAfterToken || !isalnum((unsigned char) c)) { /* * Syntax error due to token following space after token or non diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 78a653fb48c..fbf131f5779 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -12,7 +12,7 @@ * by PostgreSQL * * IDENTIFICATION - * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.447 2006/08/21 00:57:25 tgl Exp $ + * $PostgreSQL: pgsql/src/bin/pg_dump/pg_dump.c,v 1.448 2006/09/22 21:39:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -367,10 +367,10 @@ main(int argc, char **argv) new_obj_name->next = NULL; new_obj_name->name = strdup(optarg); - new_obj_name->is_include = islower(c) ? true : false; + new_obj_name->is_include = islower((unsigned char) c) ? true : false; /* add new entry to the proper list */ - if (tolower(c) == 'n') + if (tolower((unsigned char) c) == 'n') { if (!schemaList_tail) schemaList_tail = schemaList = new_obj_name; diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index f8edb78b570..64b9576a662 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -3,7 +3,7 @@ * * Copyright (c) 2000-2006, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.154 2006/07/14 14:52:27 momjian Exp $ + * $PostgreSQL: pgsql/src/bin/psql/tab-complete.c,v 1.155 2006/09/22 21:39:57 tgl Exp $ */ /*---------------------------------------------------------------------- @@ -1090,8 +1090,8 @@ psql_completion(char *text, int start, int end) /* Complete "AS ON <sth with a 'T' :)>" with a "TO" */ else if (pg_strcasecmp(prev3_wd, "AS") == 0 && pg_strcasecmp(prev2_wd, "ON") == 0 && - (toupper((unsigned char) prev_wd[4]) == 'T' || - toupper((unsigned char) prev_wd[5]) == 'T')) + (pg_toupper((unsigned char) prev_wd[4]) == 'T' || + pg_toupper((unsigned char) prev_wd[5]) == 'T')) COMPLETE_WITH_CONST("TO"); /* Complete "AS ON <sth> TO" with a table name */ else if (pg_strcasecmp(prev4_wd, "AS") == 0 && diff --git a/src/include/parser/scansup.h b/src/include/parser/scansup.h index 85f100a0a43..42575e21391 100644 --- a/src/include/parser/scansup.h +++ b/src/include/parser/scansup.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/parser/scansup.h,v 1.19 2006/03/05 15:58:58 momjian Exp $ + * $PostgreSQL: pgsql/src/include/parser/scansup.h,v 1.20 2006/09/22 21:39:58 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -22,4 +22,6 @@ extern char *downcase_truncate_identifier(const char *ident, int len, extern void truncate_identifier(char *ident, int len, bool warn); +extern bool scanner_isspace(char ch); + #endif /* SCANSUP_H */ diff --git a/src/include/port.h b/src/include/port.h index 792ff28d7df..ecf04941448 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -6,7 +6,7 @@ * Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/port.h,v 1.98 2006/09/11 20:10:30 tgl Exp $ + * $PostgreSQL: pgsql/src/include/port.h,v 1.99 2006/09/22 21:39:58 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -59,7 +59,7 @@ extern void get_parent_directory(char *path); ( \ ((filename)[0] == '/') || \ (filename)[0] == '\\' || \ - (isalpha((filename)[0]) && (filename)[1] == ':' && \ + (isalpha((unsigned char) ((filename)[0])) && (filename)[1] == ':' && \ ((filename)[2] == '\\' || (filename)[2] == '/')) \ ) #endif diff --git a/src/interfaces/ecpg/preproc/pgc.l b/src/interfaces/ecpg/preproc/pgc.l index e9f87fe183b..1af79f8e9e4 100644 --- a/src/interfaces/ecpg/preproc/pgc.l +++ b/src/interfaces/ecpg/preproc/pgc.l @@ -12,7 +12,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.149 2006/08/18 15:59:35 meskes Exp $ + * $PostgreSQL: pgsql/src/interfaces/ecpg/preproc/pgc.l,v 1.150 2006/09/22 21:39:58 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -47,6 +47,7 @@ static void addlit(char *ytext, int yleng); static void addlitchar (unsigned char); static void parse_include (void); static void check_escape_warning(void); +static bool ecpg_isspace(char ch); char *token_start; int state_before; @@ -245,6 +246,9 @@ param \${integer} * did not end with a newline. * * XXX perhaps \f (formfeed) should be treated as a newline as well? + * + * XXX if you change the set of whitespace characters, fix ecpg_isspace() + * to agree. */ ccomment "//".*\n @@ -872,7 +876,7 @@ cppline {space}*#(.*\\{space})*.*{newline} * contains at least one non-space character plus the ";" */ for (i = strlen(yytext)-2; - i > 0 && isspace((unsigned char) yytext[i]); + i > 0 && ecpg_isspace(yytext[i]); i-- ) ; yytext[i+1] = '\0'; @@ -1060,7 +1064,7 @@ cppline {space}*#(.*\\{space})*.*{newline} * contains at least one non-space character plus the ";" */ for (i = strlen(yytext)-2; - i > 0 && isspace((unsigned char) yytext[i]); + i > 0 && ecpg_isspace(yytext[i]); i-- ) ; yytext[i+1] = '\0'; @@ -1252,7 +1256,7 @@ parse_include(void) * yytext contains at least one non-space character plus the ";" */ for (i = strlen(yytext)-2; - i > 0 && isspace((unsigned char) yytext[i]); + i > 0 && ecpg_isspace(yytext[i]); i--) ; @@ -1328,3 +1332,18 @@ check_escape_warning(void) mmerror (PARSE_ERROR, ET_WARNING, "nonstandard use of escape in a string literal"); warn_on_first_escape = false; /* warn only once per string */ } + +/* + * ecpg_isspace() --- return TRUE if flex scanner considers char whitespace + */ +static bool +ecpg_isspace(char ch) +{ + if (ch == ' ' || + ch == '\t' || + ch == '\n' || + ch == '\r' || + ch == '\f') + return true; + return false; +} diff --git a/src/interfaces/libpq/fe-auth.c b/src/interfaces/libpq/fe-auth.c index db8bbdd78da..bcc4c570bf5 100644 --- a/src/interfaces/libpq/fe-auth.c +++ b/src/interfaces/libpq/fe-auth.c @@ -10,7 +10,7 @@ * exceed INITIAL_EXPBUFFER_SIZE (currently 256 bytes). * * IDENTIFICATION - * $PostgreSQL: pgsql/src/interfaces/libpq/fe-auth.c,v 1.119 2006/07/14 14:52:27 momjian Exp $ + * $PostgreSQL: pgsql/src/interfaces/libpq/fe-auth.c,v 1.120 2006/09/22 21:39:58 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -89,7 +89,7 @@ pg_an_to_ln(char *aname) *p = '\0'; #ifdef WIN32 for (p = aname; *p; p++) - *p = pg_tolower(*p); + *p = pg_tolower((unsigned char) *p); #endif return aname; diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index 7b350caf155..c5e036ccb77 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.178 2006/09/06 20:40:48 tgl Exp $ + * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.179 2006/09/22 21:39:58 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -26,6 +26,7 @@ #include "funcapi.h" #include "optimizer/clauses.h" #include "parser/parse_expr.h" +#include "parser/scansup.h" #include "tcop/tcopprot.h" #include "utils/array.h" #include "utils/builtins.h" @@ -2527,7 +2528,7 @@ exec_stmt_dynexecute(PLpgSQL_execstate *estate, char *ptr; for (ptr = querystr; *ptr; ptr++) - if (!isspace((unsigned char) *ptr)) + if (!scanner_isspace(*ptr)) break; if (*ptr == 'S' || *ptr == 's') ereport(ERROR, diff --git a/src/pl/plpgsql/src/pl_funcs.c b/src/pl/plpgsql/src/pl_funcs.c index f763e25e8d6..566480485b3 100644 --- a/src/pl/plpgsql/src/pl_funcs.c +++ b/src/pl/plpgsql/src/pl_funcs.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.54 2006/08/14 21:14:41 tgl Exp $ + * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_funcs.c,v 1.55 2006/09/22 21:39:58 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -381,7 +381,7 @@ plpgsql_convert_ident(const char *s, char **output, int numidents) /* Normal identifier: extends till dot or whitespace */ const char *thisstart = s; - while (*s && *s != '.' && !isspace((unsigned char) *s)) + while (*s && *s != '.' && !scanner_isspace(*s)) s++; /* Downcase and truncate to NAMEDATALEN */ curident = downcase_truncate_identifier(thisstart, s - thisstart, @@ -400,11 +400,11 @@ plpgsql_convert_ident(const char *s, char **output, int numidents) /* If not done, skip whitespace, dot, whitespace */ if (*s) { - while (*s && isspace((unsigned char) *s)) + while (*s && scanner_isspace(*s)) s++; if (*s++ != '.') elog(ERROR, "expected dot between identifiers: %s", sstart); - while (*s && isspace((unsigned char) *s)) + while (*s && scanner_isspace(*s)) s++; if (*s == '\0') elog(ERROR, "expected another identifier: %s", sstart); diff --git a/src/port/path.c b/src/port/path.c index 818b3212c43..4acb8046bfc 100644 --- a/src/port/path.c +++ b/src/port/path.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/port/path.c,v 1.67 2006/09/11 20:10:30 tgl Exp $ + * $PostgreSQL: pgsql/src/port/path.c,v 1.68 2006/09/22 21:39:58 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -69,7 +69,7 @@ skip_drive(const char *path) while (*path && !IS_DIR_SEP(*path)) path++; } - else if (isalpha(path[0]) && path[1] == ':') + else if (isalpha((unsigned char) path[0]) && path[1] == ':') { path += 2; } |