]> granicus.if.org Git - php/commitdiff
Fixed bug #43130 (Bound parameters cannot have - in their name)
authorIlia Alshanetsky <iliaa@php.net>
Mon, 29 Oct 2007 22:36:26 +0000 (22:36 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Mon, 29 Oct 2007 22:36:26 +0000 (22:36 +0000)
ext/pdo/pdo_sql_parser.c
ext/pdo/pdo_sql_parser.re
ext/pdo/tests/bug_43130.phpt [new file with mode: 0644]

index 83bc840d38224303406a315999428acdaa671494..23f9812107e5e6ec3438534f019d6cc47c725d89 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.11.0 on Tue Jun  5 18:45:24 2007 */
+/* Generated by re2c 0.11.0 on Mon Oct 29 18:26:12 2007 */
 #line 1 "ext/pdo/pdo_sql_parser.re"
 /*
   +----------------------------------------------------------------------+
@@ -50,142 +50,250 @@ static int scan(Scanner *s)
        #line 55 "ext/pdo/pdo_sql_parser.re"
 
 
-       {
-       static unsigned char yybm[] = {
-               192, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200,  64, 200, 200, 200, 200, 128, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               232, 232, 232, 232, 232, 232, 232, 232, 
-               232, 232, 208, 200, 200, 200, 200, 208, 
-               200, 232, 232, 232, 232, 232, 232, 232, 
-               232, 232, 232, 232, 232, 232, 232, 232, 
-               232, 232, 232, 232, 232, 232, 232, 232, 
-               232, 232, 232, 200, 200, 200, 200, 232, 
-               200, 232, 232, 232, 232, 232, 232, 232, 
-               232, 232, 232, 232, 232, 232, 232, 232, 
-               232, 232, 232, 232, 232, 232, 232, 232, 
-               232, 232, 232, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-               200, 200, 200, 200, 200, 200, 200, 200, 
-       };
-
-#line 90 "ext/pdo/pdo_sql_parser.c"
-       {
-               YYCTYPE yych;
-
-               if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
-               yych = *YYCURSOR;
-               if(yybm[0+yych] & 8) {
-                       goto yy8;
-               }
-               if(yych <= 0x00) goto yy11;
-               if(yych <= '&') goto yy2;
-               if(yych <= '\'') goto yy4;
-               if(yych <= '>') goto yy5;
-               goto yy6;
+       
+#line 55 "ext/pdo/pdo_sql_parser.c"
+{
+       YYCTYPE yych;
+
+       if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
+       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;
-               goto yy24;
+       yych = *++YYCURSOR;
+       goto yy24;
 yy3:
 #line 63 "ext/pdo/pdo_sql_parser.re"
-               { SKIP_ONE(PDO_PARSER_TEXT); }
-#line 110 "ext/pdo/pdo_sql_parser.c"
+       { SKIP_ONE(PDO_PARSER_TEXT); }
+#line 75 "ext/pdo/pdo_sql_parser.c"
 yy4:
-               yych = *++YYCURSOR;
-               goto yy20;
+       yych = *++YYCURSOR;
+       goto yy20;
 yy5:
-               yych = *++YYCURSOR;
-               if(yybm[0+yych] & 32) {
-                       goto yy16;
-               }
-               if(yych == ':') goto yy13;
-               if(yych == '?') goto yy13;
-               goto yy3;
+       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;
+       case ':':
+       case '?':       goto yy13;
+       default:        goto yy3;
+       }
 yy6:
-               ++YYCURSOR;
-               if(yybm[0+(yych = *YYCURSOR)] & 16) {
-                       goto yy13;
-               }
+       ++YYCURSOR;
+       switch((yych = *YYCURSOR)) {
+       case ':':
+       case '?':       goto yy13;
+       default:        goto yy7;
+       }
+yy7:
 #line 62 "ext/pdo/pdo_sql_parser.re"
-               { RET(PDO_PARSER_BIND_POS); }
-#line 129 "ext/pdo/pdo_sql_parser.c"
+       { RET(PDO_PARSER_BIND_POS); }
+#line 160 "ext/pdo/pdo_sql_parser.c"
 yy8:
-               ++YYCURSOR;
-               if(YYLIMIT == YYCURSOR) YYFILL(1);
-               yych = *YYCURSOR;
-               if(yybm[0+yych] & 8) {
-                       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 64 "ext/pdo/pdo_sql_parser.re"
-               { RET(PDO_PARSER_TEXT); }
-#line 139 "ext/pdo/pdo_sql_parser.c"
+       { RET(PDO_PARSER_TEXT); }
+#line 176 "ext/pdo/pdo_sql_parser.c"
 yy11:
-               ++YYCURSOR;
+       ++YYCURSOR;
 #line 65 "ext/pdo/pdo_sql_parser.re"
-               { RET(PDO_PARSER_EOI); }
-#line 144 "ext/pdo/pdo_sql_parser.c"
+       { RET(PDO_PARSER_EOI); }
+#line 181 "ext/pdo/pdo_sql_parser.c"
 yy13:
-               ++YYCURSOR;
-               if(YYLIMIT == YYCURSOR) YYFILL(1);
-               yych = *YYCURSOR;
-               if(yybm[0+yych] & 16) {
-                       goto yy13;
-               }
+       ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       switch(yych) {
+       case ':':
+       case '?':       goto yy13;
+       default:        goto yy15;
+       }
+yy15:
 #line 60 "ext/pdo/pdo_sql_parser.re"
-               { RET(PDO_PARSER_TEXT); }
-#line 154 "ext/pdo/pdo_sql_parser.c"
+       { RET(PDO_PARSER_TEXT); }
+#line 194 "ext/pdo/pdo_sql_parser.c"
 yy16:
-               ++YYCURSOR;
-               if(YYLIMIT == YYCURSOR) YYFILL(1);
-               yych = *YYCURSOR;
-               if(yybm[0+yych] & 32) {
-                       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 61 "ext/pdo/pdo_sql_parser.re"
-               { RET(PDO_PARSER_BIND); }
-#line 164 "ext/pdo/pdo_sql_parser.c"
+       { RET(PDO_PARSER_BIND); }
+#line 269 "ext/pdo/pdo_sql_parser.c"
 yy19:
-               ++YYCURSOR;
-               if(YYLIMIT == YYCURSOR) YYFILL(1);
-               yych = *YYCURSOR;
+       ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
 yy20:
-               if(yybm[0+yych] & 64) {
-                       goto yy19;
-               }
-               ++YYCURSOR;
+       switch(yych) {
+       case '\'':      goto yy21;
+       default:        goto yy19;
+       }
+yy21:
+       ++YYCURSOR;
 #line 59 "ext/pdo/pdo_sql_parser.re"
-               { RET(PDO_PARSER_TEXT); }
-#line 176 "ext/pdo/pdo_sql_parser.c"
+       { RET(PDO_PARSER_TEXT); }
+#line 283 "ext/pdo/pdo_sql_parser.c"
 yy23:
-               ++YYCURSOR;
-               if(YYLIMIT == YYCURSOR) YYFILL(1);
-               yych = *YYCURSOR;
+       ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
 yy24:
-               if(yybm[0+yych] & 128) {
-                       goto yy23;
-               }
-               ++YYCURSOR;
-#line 58 "ext/pdo/pdo_sql_parser.re"
-               { RET(PDO_PARSER_TEXT); }
-#line 188 "ext/pdo/pdo_sql_parser.c"
+       switch(yych) {
+       case '"':       goto yy25;
+       default:        goto yy23;
        }
+yy25:
+       ++YYCURSOR;
+#line 58 "ext/pdo/pdo_sql_parser.re"
+       { RET(PDO_PARSER_TEXT); }
+#line 297 "ext/pdo/pdo_sql_parser.c"
 }
 #line 66 "ext/pdo/pdo_sql_parser.re"
        
index 071bb12199fa594d2096ded93766aac918971199..582a0db1e552db389d7169a2df5c4c45ccd79ba1 100644 (file)
@@ -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        = [:?"'];
        MULTICHAR       = [:?];
diff --git a/ext/pdo/tests/bug_43130.phpt b/ext/pdo/tests/bug_43130.phpt
new file mode 100644 (file)
index 0000000..89c2aec
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+PDO Common: Bug #43130 (Bound parameters cannot have - in their name)
+--SKIPIF--
+<?php # vim:ft=php
+if (!extension_loaded('pdo')) die('skip');
+$dir = getenv('REDIR_TEST_DIR');
+if (false == $dir) die('skip no driver');
+require_once $dir . 'pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.dirname(__FILE__) . '/../../pdo/tests/');
+require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
+$db = PDOTest::factory();
+
+$db->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"