1717#include " php.h"
1818#include " php_pdo_driver.h"
1919#include " php_pdo_int.h"
20+ #include " pdo_sql_parser.h"
2021
21- #define PDO_PARSER_TEXT 1
22- #define PDO_PARSER_BIND 2
23- #define PDO_PARSER_BIND_POS 3
24- #define PDO_PARSER_ESCAPED_QUESTION 4
25- #define PDO_PARSER_EOI 5
26-
27- #define PDO_PARSER_BINDNO_ESCAPED_CHAR -1
28-
29- #define RET (i ) {s->cur = cursor; return i; }
30- #define SKIP_ONE (i ) {s->cur = s->tok + 1 ; return i; }
31-
32- #define YYCTYPE unsigned char
33- #define YYCURSOR cursor
34- #define YYLIMIT s->end
35- #define YYMARKER s->ptr
36- #define YYFILL (n ) { RET (PDO_PARSER_EOI); }
37-
38- typedef struct Scanner {
39- const char *ptr, *cur, *tok, *end;
40- } Scanner;
41-
42- static int scan (Scanner *s)
22+ static int default_scanner (pdo_scanner_t *s)
4323{
4424 const char *cursor = s->cur ;
4525
4626 s->tok = cursor;
4727 /* !re2c
4828 BINDCHR = [:][a-zA-Z0-9_]+;
4929 QUESTION = [?];
50- ESCQUESTION = [?][?];
5130 COMMENTS = ("/*"([^*]+|[*]+[^/*])*[*]*"*/ " |" --" [^\r\n ]*);
52- SPECIALS = [:?" ' -/ ];
53- MULTICHAR = [:]{2,};
31+ SPECIALS = [:?" ' /- ];
32+ MULTICHAR = ( [:]{2,}|[?]{2,}) ;
5433 ANYNOEOF = [\001 -\377 ];
5534 */
5635
5736 /*!re2c
58- (["](([\\ ]ANYNOEOF )|ANYNOEOF\[ "\\ ])*["]) { RET(PDO_PARSER_TEXT); }
59- ([' ](([\\]ANYNOEOF )|ANYNOEOF\[' \\ ])*[' ]) { RET (PDO_PARSER_TEXT); }
37+ (["]((["]["] )|ANYNOEOF\[ "])*["]) { RET(PDO_PARSER_TEXT); }
38+ ([' ](([' ][ ' ] )|ANYNOEOF\[' ])*[' ]) { RET (PDO_PARSER_TEXT); }
6039 MULTICHAR { RET (PDO_PARSER_TEXT); }
61- ESCQUESTION { RET (PDO_PARSER_ESCAPED_QUESTION); }
6240 BINDCHR { RET (PDO_PARSER_BIND); }
6341 QUESTION { RET (PDO_PARSER_BIND_POS); }
6442 SPECIALS { SKIP_ONE (PDO_PARSER_TEXT); }
@@ -81,7 +59,7 @@ static void free_param_name(zval *el) {
8159
8260PDO_API int pdo_parse_params (pdo_stmt_t *stmt, zend_string *inquery, zend_string **outquery)
8361{
84- Scanner s;
62+ pdo_scanner_t s;
8563 char *newbuffer;
8664 ptrdiff_t t;
8765 uint32_t bindno = 0 ;
@@ -91,6 +69,9 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, zend_string *inquery, zend_string
9169 struct pdo_bound_param_data *param;
9270 int query_type = PDO_PLACEHOLDER_NONE;
9371 struct placeholder *placeholders = NULL , *placetail = NULL , *plc = NULL ;
72+ int (*scan)(pdo_scanner_t *s);
73+
74+ scan = stmt->dbh ->methods ->scanner ? stmt->dbh ->methods ->scanner : default_scanner;
9475
9576 s.cur = ZSTR_VAL (inquery);
9677 s.end = s.cur + ZSTR_LEN (inquery) + 1 ;
0 commit comments