From 38c68da824918319d7a80cf1fc6d3ff915616b2c Mon Sep 17 00:00:00 2001 From: Ilia Alshanetsky Date: Mon, 29 Oct 2007 22:37:44 +0000 Subject: [PATCH] MFB: Fixed bug #43130 (Bound parameters cannot have - in their name) --- ext/pdo/pdo_sql_parser.c | 436 ++++++++++++++++++++++------------- ext/pdo/pdo_sql_parser.re | 2 +- ext/pdo/tests/bug_43130.phpt | 30 +++ 3 files changed, 309 insertions(+), 159 deletions(-) create mode 100644 ext/pdo/tests/bug_43130.phpt diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c index 2df04994df1..345f21c3cf0 100644 --- a/ext/pdo/pdo_sql_parser.c +++ b/ext/pdo/pdo_sql_parser.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.11.0 on Tue Jun 5 18:56:17 2007 */ +/* Generated by re2c 0.11.0 on Mon Oct 29 18:37:31 2007 */ #line 1 "ext/pdo/pdo_sql_parser.re" /* +----------------------------------------------------------------------+ @@ -50,189 +50,309 @@ static int scan(Scanner *s) #line 54 "ext/pdo/pdo_sql_parser.re" - { - static unsigned char yybm[] = { - 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, - 162, 162, 52, 162, 162, 162, 162, 196, - 162, 162, 162, 162, 162, 162, 162, 162, - 170, 170, 170, 170, 170, 170, 170, 170, - 170, 170, 244, 162, 162, 162, 162, 244, - 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, 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, - 170, 170, 170, 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, 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, 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, - 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, 162, - 162, 162, 162, 162, 162, 162, 162, 162, - }; + +#line 55 "ext/pdo/pdo_sql_parser.c" +{ + YYCTYPE yych; -#line 90 "ext/pdo/pdo_sql_parser.c" - { - YYCTYPE yych; - - if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); - yych = *YYCURSOR; - if(yybm[0+yych] & 2) { - goto yy8; - } - if(yych <= 0x00) goto yy11; - if(yych <= '&') goto yy2; - if(yych <= '\'') goto yy4; - if(yych <= '>') goto yy5; - goto yy6; + if((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR; + switch(yych) { + case 0x00: goto yy11; + case '"': goto yy2; + case '\'': goto yy4; + case ':': goto yy5; + case '?': goto yy6; + default: goto yy8; + } yy2: - yych = *++YYCURSOR; - if(yybm[0+yych] & 64) { - goto yy28; - } - if(yych == '"') goto yy26; - goto yy30; + yych = *++YYCURSOR; + switch(yych) { + case '"': goto yy26; + case '\'': + case ':': + case '?': goto yy28; + default: goto yy30; + } yy3: #line 62 "ext/pdo/pdo_sql_parser.re" - { SKIP_ONE(PDO_PARSER_TEXT); } -#line 114 "ext/pdo/pdo_sql_parser.c" + { SKIP_ONE(PDO_PARSER_TEXT); } +#line 81 "ext/pdo/pdo_sql_parser.c" yy4: - yych = *++YYCURSOR; - if(yybm[0+yych] & 16) { - goto yy19; - } - if(yych == '\'') goto yy21; - goto yy23; + yych = *++YYCURSOR; + switch(yych) { + case '"': + case ':': + case '?': goto yy19; + case '\'': goto yy21; + default: goto yy23; + } yy5: - yych = *++YYCURSOR; - if(yybm[0+yych] & 4) { - goto yy13; - } - if(yych <= 'Z') { - if(yych <= '/') goto yy3; - if(yych <= ':') goto yy16; - if(yych <= '@') goto yy3; - goto yy16; - } else { - if(yych <= '_') { - if(yych <= '^') goto yy3; - goto yy16; - } else { - if(yych <= '`') goto yy3; - if(yych <= 'z') goto yy16; - goto yy3; - } - } + yych = *++YYCURSOR; + switch(yych) { + case '"': + case '\'': + case ':': + case '?': goto yy13; + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy16; + default: goto yy3; + } yy6: - ++YYCURSOR; - if(yybm[0+(yych = *YYCURSOR)] & 4) { - goto yy13; - } + ++YYCURSOR; + switch((yych = *YYCURSOR)) { + case '"': + case '\'': + case ':': + case '?': goto yy13; + default: goto yy7; + } +yy7: #line 61 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_BIND_POS); } -#line 149 "ext/pdo/pdo_sql_parser.c" + { RET(PDO_PARSER_BIND_POS); } +#line 176 "ext/pdo/pdo_sql_parser.c" yy8: - ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if(yybm[0+yych] & 2) { - goto yy8; - } + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch(yych) { + case 0x00: + case '"': + case '\'': + case ':': + case '?': goto yy10; + default: goto yy8; + } +yy10: #line 63 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_TEXT); } -#line 159 "ext/pdo/pdo_sql_parser.c" + { RET(PDO_PARSER_TEXT); } +#line 192 "ext/pdo/pdo_sql_parser.c" yy11: - ++YYCURSOR; + ++YYCURSOR; #line 64 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_EOI); } -#line 164 "ext/pdo/pdo_sql_parser.c" + { RET(PDO_PARSER_EOI); } +#line 197 "ext/pdo/pdo_sql_parser.c" yy13: - ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if(yybm[0+yych] & 4) { - goto yy13; - } + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch(yych) { + case '"': + case '\'': + case ':': + case '?': goto yy13; + default: goto yy15; + } +yy15: #line 59 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_TEXT); } -#line 174 "ext/pdo/pdo_sql_parser.c" + { RET(PDO_PARSER_TEXT); } +#line 212 "ext/pdo/pdo_sql_parser.c" yy16: - ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if(yybm[0+yych] & 8) { - goto yy16; - } + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch(yych) { + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy16; + default: goto yy18; + } +yy18: #line 60 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_BIND); } -#line 184 "ext/pdo/pdo_sql_parser.c" + { RET(PDO_PARSER_BIND); } +#line 287 "ext/pdo/pdo_sql_parser.c" yy19: - if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if(yybm[0+yych] & 16) { - goto yy19; - } - if(yych != '\'') goto yy23; + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + switch(yych) { + case '"': + case ':': + case '?': goto yy19; + case '\'': goto yy21; + default: goto yy23; + } yy21: - ++YYCURSOR; - if(yybm[0+(yych = *YYCURSOR)] & 4) { - goto yy13; - } + ++YYCURSOR; + switch((yych = *YYCURSOR)) { + case '"': + case '\'': + case ':': + case '?': goto yy13; + default: goto yy22; + } yy22: #line 58 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_TEXT); } -#line 200 "ext/pdo/pdo_sql_parser.c" + { RET(PDO_PARSER_TEXT); } +#line 310 "ext/pdo/pdo_sql_parser.c" yy23: - ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if(yybm[0+yych] & 32) { - goto yy23; - } - yych = *++YYCURSOR; - goto yy22; + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch(yych) { + case '\'': goto yy25; + default: goto yy23; + } +yy25: + yych = *++YYCURSOR; + goto yy22; yy26: - ++YYCURSOR; - if(yybm[0+(yych = *YYCURSOR)] & 4) { - goto yy13; - } + ++YYCURSOR; + switch((yych = *YYCURSOR)) { + case '"': + case '\'': + case ':': + case '?': goto yy13; + default: goto yy27; + } yy27: #line 57 "ext/pdo/pdo_sql_parser.re" - { RET(PDO_PARSER_TEXT); } -#line 218 "ext/pdo/pdo_sql_parser.c" + { RET(PDO_PARSER_TEXT); } +#line 334 "ext/pdo/pdo_sql_parser.c" yy28: - if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if(yybm[0+yych] & 64) { - goto yy28; - } - if(yych == '"') goto yy26; -yy30: - ++YYCURSOR; - if(YYLIMIT == YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if(yybm[0+yych] & 128) { - goto yy30; - } - ++YYCURSOR; - yych = *YYCURSOR; - goto yy27; + if((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + switch(yych) { + case '"': goto yy26; + case '\'': + case ':': + case '?': goto yy28; + default: goto yy30; } +yy30: + ++YYCURSOR; + if(YYLIMIT == YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch(yych) { + case '"': goto yy32; + default: goto yy30; + } +yy32: + ++YYCURSOR; + yych = *YYCURSOR; + goto yy27; } #line 65 "ext/pdo/pdo_sql_parser.re" diff --git a/ext/pdo/pdo_sql_parser.re b/ext/pdo/pdo_sql_parser.re index b17bc01d7af..b2b3bc0a7fe 100644 --- a/ext/pdo/pdo_sql_parser.re +++ b/ext/pdo/pdo_sql_parser.re @@ -46,7 +46,7 @@ static int scan(Scanner *s) s->tok = cursor; /*!re2c - BINDCHR = [:][a-zA-Z0-9_]+; + BINDCHR = [:][a-zA-Z0-9_-]+; QUESTION = [?]; SPECIALS = [:?"']; EOF = [\000]; diff --git a/ext/pdo/tests/bug_43130.phpt b/ext/pdo/tests/bug_43130.phpt new file mode 100644 index 00000000000..89c2aec32cb --- /dev/null +++ b/ext/pdo/tests/bug_43130.phpt @@ -0,0 +1,30 @@ +--TEST-- +PDO Common: Bug #43130 (Bound parameters cannot have - in their name) +--SKIPIF-- + +--FILE-- +exec("CREATE TABLE test (a varchar(100), b varchar(100), c varchar(100))"); + +for ($i = 0; $i < 5; $i++) { + $db->exec("INSERT INTO test (a,b,c) VALUES('test".$i."','".$i."','".$i."')"); +} + +$stmt = $db->prepare("SELECT a FROM test WHERE b=:id-value"); +$stmt->bindParam(':id-value', $id); +$id = '1'; +$stmt->execute(); +var_dump($stmt->fetch(PDO::FETCH_COLUMN)); +?> +--EXPECT-- +string(5) "test1"