summaryrefslogtreecommitdiff
path: root/ext/pdo/pdo_sql_parser.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/pdo/pdo_sql_parser.c')
-rw-r--r--ext/pdo/pdo_sql_parser.c366
1 files changed, 142 insertions, 224 deletions
diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c
index e3e6541e4..10db41cd4 100644
--- a/ext/pdo/pdo_sql_parser.c
+++ b/ext/pdo/pdo_sql_parser.c
@@ -1,9 +1,9 @@
-/* Generated by re2c 0.9.11 on Wed Jan 25 11:31:13 2006 */
+/* Generated by re2c 0.11.0 on Mon Mar 5 19:42:28 2007 */
/*
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2006 The PHP Group |
+ | Copyright (c) 1997-2007 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: pdo_sql_parser.c,v 1.35.2.6 2006/01/25 16:35:23 iliaa Exp $ */
+/* $Id: pdo_sql_parser.c,v 1.35.2.6.2.11 2007/03/06 00:52:55 iliaa Exp $ */
#include "php.h"
#include "php_pdo_driver.h"
@@ -30,14 +30,14 @@
#define RET(i) {s->cur = cursor; return i; }
-#define YYCTYPE char
+#define YYCTYPE unsigned char
#define YYCURSOR cursor
-#define YYLIMIT s->lim
+#define YYLIMIT cursor
#define YYMARKER s->ptr
#define YYFILL(n)
typedef struct Scanner {
- char *lim, *ptr, *cur, *tok;
+ char *ptr, *cur, *tok;
} Scanner;
static int scan(Scanner *s)
@@ -49,224 +49,123 @@ static int scan(Scanner *s)
{
static unsigned char yybm[] = {
- 0, 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, 2, 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,
+ 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,
};
-{
- YYCTYPE yych;
- unsigned int yyaccept = 0;
- goto yy0;
- ++YYCURSOR;
-yy0:
- 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;
-yy2: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yybm[0+yych] & 64) {
- goto yy30;
- }
- if(yych <= 0x00) goto yy3;
- if(yych == '"') goto yy28;
- goto yy33;
+ {
+ 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;
+yy2:
+ yych = *++YYCURSOR;
+ goto yy24;
yy3:
-{ RET(PDO_PARSER_TEXT); }
-yy4: yyaccept = 0;
- yych = *(YYMARKER = ++YYCURSOR);
- if(yybm[0+yych] & 16) {
- goto yy19;
- }
- if(yych <= 0x00) goto yy3;
- if(yych == '\'') goto yy21;
- goto yy24;
-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;
+ { RET(PDO_PARSER_TEXT); }
+yy4:
+ yych = *++YYCURSOR;
+ goto yy20;
+yy5:
+ yych = *++YYCURSOR;
+ if(yybm[0+yych] & 32) {
goto yy16;
- } else {
- if(yych <= '`') goto yy3;
- if(yych <= 'z') goto yy16;
- goto yy3;
}
- }
-yy6: ++YYCURSOR;
- if(yybm[0+(yych = *YYCURSOR)] & 4) {
+ if(yych == ':') goto yy13;
+ if(yych == '?') goto yy13;
+ goto yy3;
+yy6:
+ ++YYCURSOR;
+ if(yybm[0+(yych = *YYCURSOR)] & 16) {
+ goto yy13;
+ }
+ { RET(PDO_PARSER_BIND_POS); }
+yy8:
+ ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
- goto yy13;
- }
- goto yy7;
-yy7:
-{ RET(PDO_PARSER_BIND_POS); }
-yy8: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- goto yy9;
-yy9: if(yybm[0+yych] & 2) {
- goto yy8;
- }
- goto yy10;
-yy10:
-{ RET(PDO_PARSER_TEXT); }
-yy11: ++YYCURSOR;
- goto yy12;
-yy12:
-{ RET(PDO_PARSER_EOI); }
-yy13: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- goto yy14;
-yy14: if(yybm[0+yych] & 4) {
- goto yy13;
- }
- goto yy15;
-yy15:
-{ RET(PDO_PARSER_TEXT); }
-yy16: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- goto yy17;
-yy17: if(yybm[0+yych] & 8) {
- goto yy16;
- }
- goto yy18;
-yy18:
-{ RET(PDO_PARSER_BIND); }
-yy19: yyaccept = 1;
- YYMARKER = ++YYCURSOR;
- if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- goto yy20;
-yy20: if(yybm[0+yych] & 16) {
- goto yy19;
- }
- if(yych <= '\''){
- if(yych <= 0x00) goto yy15;
- if(yych <= '&') goto yy23;
- goto yy21;
- } else {
- if(yych == '\\') goto yy26;
- goto yy23;
- }
-yy21: ++YYCURSOR;
- if(yybm[0+(yych = *YYCURSOR)] & 4) {
+ if(yybm[0+yych] & 8) {
+ goto yy8;
+ }
+ { RET(PDO_PARSER_TEXT); }
+yy11:
+ ++YYCURSOR;
+ { RET(PDO_PARSER_EOI); }
+yy13:
+ ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
- goto yy13;
- }
- goto yy22;
-yy22:
-{ RET(PDO_PARSER_TEXT); }
-yy23: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- goto yy24;
-yy24: if(yybm[0+yych] & 32) {
- goto yy23;
- }
- if(yych <= 0x00) goto yy25;
- if(yych <= '[') goto yy27;
- goto yy26;
-yy25: YYCURSOR = YYMARKER;
- switch(yyaccept){
- case 1: goto yy15;
- case 0: goto yy3;
- }
-yy26: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- if(yych == '\'') goto yy23;
- goto yy25;
-yy27: yych = *++YYCURSOR;
- goto yy22;
-yy28: ++YYCURSOR;
- if(yybm[0+(yych = *YYCURSOR)] & 4) {
+ if(yybm[0+yych] & 16) {
+ goto yy13;
+ }
+ { RET(PDO_PARSER_TEXT); }
+yy16:
+ ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
yych = *YYCURSOR;
- goto yy13;
- }
- goto yy29;
-yy29:
-{ RET(PDO_PARSER_TEXT); }
-yy30: yyaccept = 1;
- YYMARKER = ++YYCURSOR;
- if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- goto yy31;
-yy31: if(yybm[0+yych] & 64) {
- goto yy30;
- }
- if(yych <= '"'){
- if(yych <= 0x00) goto yy15;
- if(yych >= '"') goto yy28;
- goto yy32;
- } else {
- if(yych == '\\') goto yy34;
- goto yy32;
- }
-yy32: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- goto yy33;
-yy33: if(yybm[0+yych] & 128) {
- goto yy32;
+ if(yybm[0+yych] & 32) {
+ goto yy16;
+ }
+ { RET(PDO_PARSER_BIND); }
+yy19:
+ ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+yy20:
+ if(yybm[0+yych] & 64) {
+ goto yy19;
+ }
+ ++YYCURSOR;
+ { RET(PDO_PARSER_TEXT); }
+yy23:
+ ++YYCURSOR;
+ if(YYLIMIT == YYCURSOR) YYFILL(1);
+ yych = *YYCURSOR;
+yy24:
+ if(yybm[0+yych] & 128) {
+ goto yy23;
+ }
+ ++YYCURSOR;
+ { RET(PDO_PARSER_TEXT); }
}
- if(yych <= 0x00) goto yy25;
- if(yych <= '[') goto yy35;
- goto yy34;
-yy34: ++YYCURSOR;
- if(YYLIMIT == YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- if(yych == '"') goto yy32;
- goto yy25;
-yy35: ++YYCURSOR;
- yych = *YYCURSOR;
- goto yy29;
-}
}
}
@@ -297,7 +196,6 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len,
ptr = *outquery;
s.cur = inquery;
- s.lim = inquery + inquery_len;
/* phase 1: look for args */
while((t = scan(&s)) != PDO_PARSER_EOI) {
@@ -333,10 +231,10 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len,
if (query_type == (PDO_PLACEHOLDER_NAMED|PDO_PLACEHOLDER_POSITIONAL)) {
/* they mixed both types; punt */
pdo_raise_impl_error(stmt->dbh, stmt, "HY093", "mixed named and positional parameters" TSRMLS_CC);
- return -1;
+ ret = -1;
+ goto clean_up;
}
-
if (stmt->supports_placeholders == query_type && !stmt->named_rewrite_template) {
/* query matches native syntax */
ret = 0;
@@ -360,9 +258,27 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len,
ret = -1;
goto clean_up;
}
-
+
+ if (params && bindno != zend_hash_num_elements(params) && stmt->supports_placeholders == PDO_PLACEHOLDER_NONE) {
+ /* extra bit of validation for instances when same params are bound more then once */
+ if (query_type != PDO_PLACEHOLDER_POSITIONAL && bindno > zend_hash_num_elements(params)) {
+ int ok = 1;
+ for (plc = placeholders; plc; plc = plc->next) {
+ if (zend_hash_find(params, plc->pos, plc->len, (void**) &param) == FAILURE) {
+ ok = 0;
+ break;
+ }
+ }
+ if (ok) {
+ goto safe;
+ }
+ }
+ pdo_raise_impl_error(stmt->dbh, stmt, "HY093", "number of bound variables does not match number of tokens" TSRMLS_CC);
+ ret = -1;
+ goto clean_up;
+ }
+safe:
/* what are we going to do ? */
-
if (stmt->supports_placeholders == PDO_PLACEHOLDER_NONE) {
/* query generation */
@@ -396,11 +312,14 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len,
/* bork */
ret = -1;
strcpy(stmt->error_code, stmt->dbh->error_code);
- efree(buf);
+ if (buf) {
+ efree(buf);
+ }
goto clean_up;
}
- efree(buf);
-
+ if (buf) {
+ efree(buf);
+ }
} else {
pdo_raise_impl_error(stmt->dbh, stmt, "HY105", "Expected a stream resource" TSRMLS_CC);
ret = -1;
@@ -603,7 +522,6 @@ int old_pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char
ptr = *outquery;
s.cur = inquery;
- s.lim = inquery + inquery_len;
while((t = scan(&s)) != PDO_PARSER_EOI) {
if(t == PDO_PARSER_TEXT) {
memcpy(ptr, s.tok, s.cur - s.tok);