]> granicus.if.org Git - php/commitdiff
Fixed bug #36798 (Error parsing named parameters with queries containing
authorIlia Alshanetsky <iliaa@php.net>
Tue, 5 Dec 2006 18:04:59 +0000 (18:04 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Tue, 5 Dec 2006 18:04:59 +0000 (18:04 +0000)
high-ascii chars).

NEWS
ext/pdo/pdo_sql_parser.c
ext/pdo/pdo_sql_parser.re
ext/pdo/tests/bug_36798.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 1fb8e22c99dee2b4231cb0512e1cd16aab71654f..9aa0432de33167e3d1580ae35532658aadf8833c 100644 (file)
--- 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)
index e420f643a19a3a5ad57c7867e0465943551dbc2f..a8947721d1ab74fe09fab134ad22746406359036 100644 (file)
@@ -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"
        
 }
 
index 9bef98e0de0d2b508ebfb73056172e74374cee4c..9bb5cc0bf496a1b5c9ae54642d6bf6a69d90ff8e 100644 (file)
@@ -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 (file)
index 0000000..4e301eb
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+PDO Common: Bug #36798 (Error parsing named parameters with queries containing high-ascii chars)
+--SKIPIF--
+<?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 (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) "Ã"
+}