From e5ad7bf299672eeca0aaaf3b284226dd961ece0d Mon Sep 17 00:00:00 2001 From: Ilia Alshanetsky Date: Tue, 5 Dec 2006 18:04:59 +0000 Subject: [PATCH] Fixed bug #36798 (Error parsing named parameters with queries containing high-ascii chars). --- NEWS | 2 + ext/pdo/pdo_sql_parser.c | 121 +++++++++++------------------------ ext/pdo/pdo_sql_parser.re | 8 +-- ext/pdo/tests/bug_36798.phpt | 32 +++++++++ 4 files changed, 73 insertions(+), 90 deletions(-) create mode 100644 ext/pdo/tests/bug_36798.phpt diff --git a/NEWS b/NEWS index 1fb8e22c99..9aa0432de3 100644 --- a/NEWS +++ b/NEWS @@ -147,6 +147,8 @@ PHP NEWS (Ilia) - Fixed bug #36975 (natcasesort() causes array_pop() to misbehave). (Hannes) - Fixed bug #36812 (pg_execute() modifies input array). (Ilia) +- Fixed bug #36798 (Error parsing named parameters with queries containing + high-ascii chars). (Ilia) - Fixed bug #36644 (possible crash in variant_date_from_timestamp()). (Ilia) - Fixed bug #33282 (Re-assignment by reference does not clear the is_ref flag) (Ilia,Dmitry, Matt Wilmas) diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c index e420f643a1..a8947721d1 100644 --- a/ext/pdo/pdo_sql_parser.c +++ b/ext/pdo/pdo_sql_parser.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.10.6 on Sun Dec 3 19:05:06 2006 */ +/* Generated by re2c 0.10.6 on Mon Dec 4 16:21:45 2006 */ #line 1 "ext/pdo/pdo_sql_parser.re" /* +----------------------------------------------------------------------+ @@ -46,12 +46,12 @@ static int scan(Scanner *s) char *cursor = s->cur; s->tok = cursor; - #line 55 "ext/pdo/pdo_sql_parser.re" + #line 53 "ext/pdo/pdo_sql_parser.re" { static unsigned char yybm[] = { - 0, 162, 162, 162, 162, 162, 162, 162, + 160, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, @@ -62,7 +62,7 @@ static int scan(Scanner *s) 162, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 170, 162, 2, 162, 162, 170, + 170, 170, 170, 162, 162, 162, 162, 170, 162, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, @@ -88,7 +88,6 @@ static int scan(Scanner *s) #line 89 "ext/pdo/pdo_sql_parser.c" { YYCTYPE yych; - unsigned int yyaccept = 0; if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); yych = *YYCURSOR; @@ -101,27 +100,23 @@ static int scan(Scanner *s) if(yych <= '>') goto yy5; goto yy6; yy2: - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); + yych = *++YYCURSOR; if(yybm[0+yych] & 64) { - goto yy30; + goto yy28; } - if(yych <= 0x00) goto yy3; - if(yych == '"') goto yy28; - goto yy33; + if(yych == '"') goto yy26; + goto yy30; yy3: -#line 63 "ext/pdo/pdo_sql_parser.re" +#line 61 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_TEXT); } -#line 116 "ext/pdo/pdo_sql_parser.c" +#line 113 "ext/pdo/pdo_sql_parser.c" yy4: - yyaccept = 0; - yych = *(YYMARKER = ++YYCURSOR); + yych = *++YYCURSOR; if(yybm[0+yych] & 16) { goto yy19; } - if(yych <= 0x00) goto yy3; if(yych == '\'') goto yy21; - goto yy24; + goto yy23; yy5: yych = *++YYCURSOR; if(yybm[0+yych] & 4) { @@ -147,9 +142,9 @@ yy6: if(yybm[0+(yych = *YYCURSOR)] & 4) { goto yy13; } -#line 62 "ext/pdo/pdo_sql_parser.re" +#line 60 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_BIND_POS); } -#line 153 "ext/pdo/pdo_sql_parser.c" +#line 148 "ext/pdo/pdo_sql_parser.c" yy8: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -157,14 +152,14 @@ yy8: if(yybm[0+yych] & 2) { goto yy8; } -#line 64 "ext/pdo/pdo_sql_parser.re" +#line 62 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_TEXT); } -#line 163 "ext/pdo/pdo_sql_parser.c" +#line 158 "ext/pdo/pdo_sql_parser.c" yy11: ++YYCURSOR; -#line 65 "ext/pdo/pdo_sql_parser.re" +#line 63 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_EOI); } -#line 168 "ext/pdo/pdo_sql_parser.c" +#line 163 "ext/pdo/pdo_sql_parser.c" yy13: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -172,10 +167,9 @@ yy13: if(yybm[0+yych] & 4) { goto yy13; } -yy15: -#line 60 "ext/pdo/pdo_sql_parser.re" +#line 58 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_TEXT); } -#line 179 "ext/pdo/pdo_sql_parser.c" +#line 173 "ext/pdo/pdo_sql_parser.c" yy16: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); @@ -183,106 +177,63 @@ yy16: if(yybm[0+yych] & 8) { goto yy16; } -#line 61 "ext/pdo/pdo_sql_parser.re" +#line 59 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_BIND); } -#line 189 "ext/pdo/pdo_sql_parser.c" +#line 183 "ext/pdo/pdo_sql_parser.c" yy19: - yyaccept = 1; - YYMARKER = ++YYCURSOR; if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yybm[0+yych] & 16) { goto yy19; } - if(yych <= '\'') { - if(yych <= 0x00) goto yy15; - if(yych <= '&') goto yy23; - } else { - if(yych == '\\') goto yy26; - goto yy23; - } + if(yych != '\'') goto yy23; yy21: ++YYCURSOR; if(yybm[0+(yych = *YYCURSOR)] & 4) { goto yy13; } yy22: -#line 59 "ext/pdo/pdo_sql_parser.re" +#line 57 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_TEXT); } -#line 213 "ext/pdo/pdo_sql_parser.c" +#line 199 "ext/pdo/pdo_sql_parser.c" yy23: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy24: if(yybm[0+yych] & 32) { goto yy23; } - if(yych <= 0x00) goto yy25; - if(yych <= '[') goto yy27; - goto yy26; -yy25: - YYCURSOR = YYMARKER; - if(yyaccept <= 0) { - goto yy3; - } else { - goto yy15; - } -yy26: - ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if(yych <= 0x00) goto yy25; - goto yy23; -yy27: yych = *++YYCURSOR; goto yy22; -yy28: +yy26: ++YYCURSOR; if(yybm[0+(yych = *YYCURSOR)] & 4) { goto yy13; } -yy29: -#line 58 "ext/pdo/pdo_sql_parser.re" +yy27: +#line 56 "ext/pdo/pdo_sql_parser.re" { RET(PDO_PARSER_TEXT); } -#line 249 "ext/pdo/pdo_sql_parser.c" -yy30: - yyaccept = 1; - YYMARKER = ++YYCURSOR; +#line 217 "ext/pdo/pdo_sql_parser.c" +yy28: if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if(yybm[0+yych] & 64) { - goto yy30; + goto yy28; } - if(yych <= '"') { - if(yych <= 0x00) goto yy15; - if(yych >= '"') goto yy28; - } else { - if(yych == '\\') goto yy34; - } -yy32: + if(yych == '"') goto yy26; +yy30: ++YYCURSOR; if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; -yy33: if(yybm[0+yych] & 128) { - goto yy32; + goto yy30; } - if(yych <= 0x00) goto yy25; - if(yych <= '[') goto yy35; -yy34: ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); yych = *YYCURSOR; - if(yych <= 0x00) goto yy25; - goto yy32; -yy35: - ++YYCURSOR; - yych = *YYCURSOR; - goto yy29; + goto yy27; } } -#line 66 "ext/pdo/pdo_sql_parser.re" +#line 64 "ext/pdo/pdo_sql_parser.re" } diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re index 9bef98e0de..9bb5cc0bf4 100644 --- a/ext/pdo/pdo_sql_parser.re +++ b/ext/pdo/pdo_sql_parser.re @@ -48,15 +48,13 @@ static int scan(Scanner *s) BINDCHR = [:][a-zA-Z0-9_]+; QUESTION = [?]; SPECIALS = [:?"']; - ESCQQ = [\\]["]; - ESCQ = [\\][']; - EOF = [\000]; + EOF = [\000]; ANYNOEOF = [\001-\377]; */ /*!re2c - (["] (ESCQQ|[\\]ANYNOEOF|ANYNOEOF\[\\"])* ["]) { RET(PDO_PARSER_TEXT); } - (['] (ESCQ|[\\]ANYNOEOF|ANYNOEOF\[\\'])* [']) { RET(PDO_PARSER_TEXT); } + (["] ([^"])* ["]) { RET(PDO_PARSER_TEXT); } + (['] ([^'])* [']) { RET(PDO_PARSER_TEXT); } SPECIALS{2,} { RET(PDO_PARSER_TEXT); } BINDCHR { RET(PDO_PARSER_BIND); } QUESTION { RET(PDO_PARSER_BIND_POS); } diff --git a/ext/pdo/tests/bug_36798.phpt b/ext/pdo/tests/bug_36798.phpt new file mode 100644 index 0000000000..4e301eb0eb --- /dev/null +++ b/ext/pdo/tests/bug_36798.phpt @@ -0,0 +1,32 @@ +--TEST-- +PDO Common: Bug #36798 (Error parsing named parameters with queries containing high-ascii chars) +--SKIPIF-- + +--FILE-- +exec("CREATE TABLE test (id INTEGER)"); +$db->exec("INSERT INTO test (id) VALUES (1)"); + +$stmt = $db->prepare("SELECT 'Ã' as test FROM test WHERE id = :id"); +$stmt->execute(array(":id" => 1)); + +$row = $stmt->fetch(PDO::FETCH_NUM); +var_dump( $row ); + +?> +--EXPECT-- +array(1) { + [0]=> + string(1) "Ã" +} -- 2.40.0