summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--ext/pdo/pdo_sql_parser.c121
-rw-r--r--ext/pdo/pdo_sql_parser.re8
-rw-r--r--ext/pdo/tests/bug_36798.phpt32
4 files changed, 73 insertions, 90 deletions
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--
+<?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) "Ã"
+}