From: George Schlossnagle Date: Thu, 20 May 2004 18:29:59 +0000 (+0000) Subject: set active_query_string to null in case of failure X-Git-Tag: RELEASE_0_1~57 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=336691620319153b030e8af118b1a59ba3e7948a;p=php set active_query_string to null in case of failure --- diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c index 3677157204..ddc86ca37d 100644 --- a/ext/pdo/pdo_sql_parser.c +++ b/ext/pdo/pdo_sql_parser.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.5 on Thu May 20 12:43:08 2004 */ +/* Generated by re2c 0.5 on Thu May 20 13:12:59 2004 */ #line 1 "/home/george/src/pecl/pdo/pdo_sql_parser.re" /* +----------------------------------------------------------------------+ @@ -25,7 +25,8 @@ #define PDO_PARSER_TEXT 1 #define PDO_PARSER_BIND 2 -#define PDO_PARSER_EOI 3 +#define PDO_PARSER_BIND_POS 3 +#define PDO_PARSER_EOI 4 #define RET(i) {s->cur = cursor; return i; } @@ -44,103 +45,138 @@ static int scan(Scanner *s) char *cursor = s->cur; std: s->tok = cursor; - #line 51 + #line 54 { YYCTYPE yych; unsigned int yyaccept; static unsigned char yybm[] = { - 0, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 0, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 128, 160, 160, 160, 160, 160, - 160, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 160, 32, 160, 160, 224, - 160, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 224, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, + 0, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 0, 168, 168, 168, 168, 192, + 168, 168, 168, 168, 168, 168, 168, 168, + 184, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 160, 168, 168, 168, 168, 160, + 168, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 184, 168, 8, 168, 168, 184, + 168, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 184, 184, 184, 184, 184, 184, + 184, 184, 184, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 168, 168, 168, }; goto yy0; yy1: ++YYCURSOR; yy0: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; - if(yybm[0+yych] & 32) goto yy5; - if(yych <= '\000') goto yy8; - if(yych >= ':') goto yy4; + if(yybm[0+yych] & 8) goto yy8; + if(yych <= '\000') goto yy11; + if(yych <= '&') goto yy2; + if(yych <= '\'') goto yy4; + if(yych <= '>') goto yy5; + goto yy6; yy2: yyaccept = 0; yych = *(YYMARKER = ++YYCURSOR); - if(yych >= '\001') goto yy14; + if(yych >= '\001') goto yy24; yy3: -#line 56 +#line 61 { RET(PDO_PARSER_TEXT); } -yy4: yych = *++YYCURSOR; - if(yybm[0+yych] & 64) goto yy10; +yy4: yyaccept = 0; + yych = *(YYMARKER = ++YYCURSOR); + if(yych <= '\000') goto yy3; + if(yych == '"') goto yy3; + goto yy17; +yy5: yych = *++YYCURSOR; + if(yybm[0+yych] & 16) goto yy13; goto yy3; -yy5: ++YYCURSOR; +yy6: yych = *++YYCURSOR; +yy7: +#line 60 + { RET(PDO_PARSER_BIND_POS); } +yy8: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy6: if(yybm[0+yych] & 32) goto yy5; -yy7: -#line 57 +yy9: if(yybm[0+yych] & 8) goto yy8; +yy10: +#line 62 { RET(PDO_PARSER_TEXT); } -yy8: yych = *++YYCURSOR; -yy9: -#line 58 +yy11: yych = *++YYCURSOR; +yy12: +#line 63 { RET(PDO_PARSER_EOI); } -yy10: ++YYCURSOR; +yy13: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy11: if(yybm[0+yych] & 64) goto yy10; -yy12: -#line 55 +yy14: if(yybm[0+yych] & 16) goto yy13; +yy15: +#line 59 { RET(PDO_PARSER_BIND); } -yy13: ++YYCURSOR; +yy16: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy14: if(yybm[0+yych] & 128) goto yy13; - if(yych <= '\000') goto yy15; - if(yych <= '[') goto yy17; - goto yy16; -yy15: YYCURSOR = YYMARKER; +yy17: if(yybm[0+yych] & 32) goto yy16; + if(yych <= '&') goto yy18; + if(yych <= '\'') goto yy19; + goto yy22; +yy18: YYCURSOR = YYMARKER; switch(yyaccept){ + case 1: goto yy21; case 0: goto yy3; } -yy16: ++YYCURSOR; +yy19: yyaccept = 1; + YYMARKER = ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy20: if(yybm[0+yych] & 32) goto yy16; + if(yych <= '&') goto yy21; + if(yych <= '\'') goto yy19; + goto yy22; +yy21: +#line 58 + { RET(PDO_PARSER_TEXT); } +yy22: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if(yych == '\'') goto yy16; + goto yy18; +yy23: ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy24: if(yybm[0+yych] & 128) goto yy23; + if(yych <= '\000') goto yy18; + if(yych <= '[') goto yy26; +yy25: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych == '"') goto yy13; - goto yy15; -yy17: yych = *++YYCURSOR; -yy18: -#line 54 + if(yych == '"') goto yy23; + goto yy18; +yy26: yych = *++YYCURSOR; +yy27: +#line 57 { RET(PDO_PARSER_TEXT); } } -#line 59 +#line 64 } @@ -196,7 +232,7 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou if(!params) { /* error */ efree(*outquery); - return 0; + return (int) (s.cur - inquery); } /* lookup bind first via hash and then index */ /* stupid keys need to be null-terminated, even though we know their length */ @@ -229,13 +265,47 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou else { /* error and cleanup */ efree(*outquery); - return 0; + return (int) (s.cur - inquery); + } + bindno++; + } + else if(t == PDO_PARSER_BIND_POS) { + if(!params) { + /* error */ + efree(*outquery); + return (int) (s.cur - inquery); + } + /* lookup bind by index */ + if(SUCCESS == zend_hash_index_find(params, bindno, (void **)¶m)) + { + char *quotedstr; + int quotedstrlen; + /* currently everything is a string here */ + + /* quote the bind value if necessary */ + if(stmt->dbh->methods->quoter(stmt->dbh, Z_STRVAL_P(param->parameter), + Z_STRLEN_P(param->parameter), "edstr, "edstrlen TSRMLS_CC)) + { + memcpy(ptr, quotedstr, quotedstrlen); + ptr += quotedstrlen; + *outquery_len += quotedstrlen; + efree(quotedstr); + } else { + memcpy(ptr, Z_STRVAL_P(param->parameter), Z_STRLEN_P(param->parameter)); + ptr += Z_STRLEN_P(param->parameter); + *outquery_len += (Z_STRLEN_P(param->parameter)); + } + } + else { + /* error and cleanup */ + efree(*outquery); + return (int) (s.cur - inquery); } bindno++; - } + } } *ptr = '\0'; - return 1; + return 0; } /* diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re index 87427131b2..83ce3d2538 100644 --- a/ext/pdo/pdo_sql_parser.re +++ b/ext/pdo/pdo_sql_parser.re @@ -46,14 +46,16 @@ static int scan(Scanner *s) /*!re2c BINDCHR = [:][a-zA-Z0-9_]+; QUESTION = [?]; - SPECIALS = [:?"]; - ESC = [\\]["]; + SPECIALS = [:?"']; + ESCQQ = [\\]["]; + ESCQ = [\\][']; EOF = [\000]; ANYNOEOF = [\001-\377]; */ /*!re2c - (["] (ESC|ANYNOEOF\[\\"])* ["]) { RET(PDO_PARSER_TEXT); } + (["] (ESCQQ|ANYNOEOF\[\\"])* ["]) { RET(PDO_PARSER_TEXT); } + (['] (ESCQ|ANYNOEOF\[\\"])* [']) { RET(PDO_PARSER_TEXT); } BINDCHR { RET(PDO_PARSER_BIND); } QUESTION { RET(PDO_PARSER_BIND_POS); } SPECIALS { RET(PDO_PARSER_TEXT); } @@ -114,6 +116,7 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou if(!params) { /* error */ efree(*outquery); + *outquery = NULL; return (int) (s.cur - inquery); } /* lookup bind first via hash and then index */ @@ -144,9 +147,10 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou *outquery_len += (Z_STRLEN_P(param->parameter)); } } - else { + else_{ /* error and cleanup */ efree(*outquery); + *outquery = NULL; return (int) (s.cur - inquery); } bindno++; @@ -155,6 +159,7 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou if(!params) { /* error */ efree(*outquery); + *outquery = NULL; return (int) (s.cur - inquery); } /* lookup bind by index */ @@ -181,6 +186,7 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou else { /* error and cleanup */ efree(*outquery); + *outquery = NULL; return (int) (s.cur - inquery); } bindno++;