]> granicus.if.org Git - php/commitdiff
set active_query_string to null in case of failure
authorGeorge Schlossnagle <gschlossnagle@php.net>
Thu, 20 May 2004 18:29:59 +0000 (18:29 +0000)
committerGeorge Schlossnagle <gschlossnagle@php.net>
Thu, 20 May 2004 18:29:59 +0000 (18:29 +0000)
ext/pdo/pdo_sql_parser.c
ext/pdo/pdo_sql_parser.re

index 3677157204ab32798c5373938b62c2e51bb14c84..ddc86ca37da1a94f892de018ecfc3a0434d4edba 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.5 on Thu May 20 12:43:08 2004 */
+/* Generated by re2c 0.5 on Thu May 20 13:12:59 2004 */
 #line 1 "/home/george/src/pecl/pdo/pdo_sql_parser.re"
 /*
   +----------------------------------------------------------------------+
@@ -25,7 +25,8 @@
 
 #define PDO_PARSER_TEXT 1
 #define PDO_PARSER_BIND 2
-#define PDO_PARSER_EOI 3
+#define PDO_PARSER_BIND_POS 3
+#define PDO_PARSER_EOI 4
 
 #define RET(i) {s->cur = cursor; return i; }
 
@@ -44,103 +45,138 @@ static int scan(Scanner *s)
        char *cursor = s->cur;
        std:
                s->tok = cursor;
-       #line 51
+       #line 54
 
 
        {
        YYCTYPE yych;
        unsigned int yyaccept;
        static unsigned char yybm[] = {
-         0, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160,   0, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       224, 224, 224, 224, 224, 224, 224, 224, 
-       224, 224, 128, 160, 160, 160, 160, 160, 
-       160, 224, 224, 224, 224, 224, 224, 224, 
-       224, 224, 224, 224, 224, 224, 224, 224, 
-       224, 224, 224, 224, 224, 224, 224, 224, 
-       224, 224, 224, 160,  32, 160, 160, 224, 
-       160, 224, 224, 224, 224, 224, 224, 224, 
-       224, 224, 224, 224, 224, 224, 224, 224, 
-       224, 224, 224, 224, 224, 224, 224, 224, 
-       224, 224, 224, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
-       160, 160, 160, 160, 160, 160, 160, 160
+         0, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168,   0, 168, 168, 168, 168, 192
+       168, 168, 168, 168, 168, 168, 168, 168
+       184, 184, 184, 184, 184, 184, 184, 184, 
+       184, 184, 160, 168, 168, 168, 168, 160, 
+       168, 184, 184, 184, 184, 184, 184, 184, 
+       184, 184, 184, 184, 184, 184, 184, 184, 
+       184, 184, 184, 184, 184, 184, 184, 184, 
+       184, 184, 184, 168,   8, 168, 168, 184, 
+       168, 184, 184, 184, 184, 184, 184, 184, 
+       184, 184, 184, 184, 184, 184, 184, 184, 
+       184, 184, 184, 184, 184, 184, 184, 184, 
+       184, 184, 184, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
+       168, 168, 168, 168, 168, 168, 168, 168
        };
        goto yy0;
 yy1:   ++YYCURSOR;
 yy0:
        if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = *YYCURSOR;
-       if(yybm[0+yych] & 32)   goto yy5;
-       if(yych <= '\000')      goto yy8;
-       if(yych >= ':') goto yy4;
+       if(yybm[0+yych] & 8)    goto yy8;
+       if(yych <= '\000')      goto yy11;
+       if(yych <= '&') goto yy2;
+       if(yych <= '\'')        goto yy4;
+       if(yych <= '>') goto yy5;
+       goto yy6;
 yy2:   yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych >= '\001')      goto yy14;
+       if(yych >= '\001')      goto yy24;
 yy3:
-#line 56
+#line 61
        { RET(PDO_PARSER_TEXT); }
-yy4:   yych = *++YYCURSOR;
-       if(yybm[0+yych] & 64)   goto yy10;
+yy4:   yyaccept = 0;
+       yych = *(YYMARKER = ++YYCURSOR);
+       if(yych <= '\000')      goto yy3;
+       if(yych == '"') goto yy3;
+       goto yy17;
+yy5:   yych = *++YYCURSOR;
+       if(yybm[0+yych] & 16)   goto yy13;
        goto yy3;
-yy5:   ++YYCURSOR;
+yy6:   yych = *++YYCURSOR;
+yy7:
+#line 60
+       { RET(PDO_PARSER_BIND_POS); }
+yy8:   ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-yy6:   if(yybm[0+yych] & 32)   goto yy5;
-yy7:
-#line 57
+yy9:   if(yybm[0+yych] & 8)    goto yy8;
+yy10:
+#line 62
        { RET(PDO_PARSER_TEXT); }
-yy8:   yych = *++YYCURSOR;
-yy9:
-#line 58
+yy11:  yych = *++YYCURSOR;
+yy12:
+#line 63
        { RET(PDO_PARSER_EOI); }
-yy10:  ++YYCURSOR;
+yy13:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-yy11:  if(yybm[0+yych] & 64)   goto yy10;
-yy12:
-#line 55
+yy14:  if(yybm[0+yych] & 16)   goto yy13;
+yy15:
+#line 59
        { RET(PDO_PARSER_BIND); }
-yy13:  ++YYCURSOR;
+yy16:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-yy14:  if(yybm[0+yych] & 128)  goto yy13;
-       if(yych <= '\000')      goto yy15;
-       if(yych <= '[') goto yy17;
-       goto yy16;
-yy15:  YYCURSOR = YYMARKER;
+yy17:  if(yybm[0+yych] & 32)   goto yy16;
+       if(yych <= '&') goto yy18;
+       if(yych <= '\'')        goto yy19;
+       goto yy22;
+yy18:  YYCURSOR = YYMARKER;
        switch(yyaccept){
+       case 1: goto yy21;
        case 0: goto yy3;
        }
-yy16:  ++YYCURSOR;
+yy19:  yyaccept = 1;
+       YYMARKER = ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+yy20:  if(yybm[0+yych] & 32)   goto yy16;
+       if(yych <= '&') goto yy21;
+       if(yych <= '\'')        goto yy19;
+       goto yy22;
+yy21:
+#line 58
+       { RET(PDO_PARSER_TEXT); }
+yy22:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+       if(yych == '\'')        goto yy16;
+       goto yy18;
+yy23:  ++YYCURSOR;
+       if(YYLIMIT == YYCURSOR) YYFILL(1);
+       yych = *YYCURSOR;
+yy24:  if(yybm[0+yych] & 128)  goto yy23;
+       if(yych <= '\000')      goto yy18;
+       if(yych <= '[') goto yy26;
+yy25:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       if(yych == '"') goto yy13;
-       goto yy15;
-yy17:  yych = *++YYCURSOR;
-yy18:
-#line 54
+       if(yych == '"') goto yy23;
+       goto yy18;
+yy26:  yych = *++YYCURSOR;
+yy27:
+#line 57
        { RET(PDO_PARSER_TEXT); }
 }
-#line 59
+#line 64
        
 }
 
@@ -196,7 +232,7 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou
                        if(!params) { 
                                /* error */
                                efree(*outquery);
-                               return 0;
+                               return (int) (s.cur - inquery);
                        }
                        /* lookup bind first via hash and then index */
                        /* stupid keys need to be null-terminated, even though we know their length */
@@ -229,13 +265,47 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou
                        else {
                                /* error and cleanup */
                                efree(*outquery);
-                               return 0;
+                               return (int) (s.cur - inquery);
+                       }
+                       bindno++;
+               }
+               else if(t == PDO_PARSER_BIND_POS) {
+                       if(!params) { 
+                               /* error */
+                               efree(*outquery);
+                               return (int) (s.cur - inquery);
+                       }
+                       /* lookup bind by index */
+                       if(SUCCESS == zend_hash_index_find(params, bindno, (void **)&param)) 
+                       {
+                               char *quotedstr;
+                               int quotedstrlen;
+                               /* currently everything is a string here */
+                               
+                               /* quote the bind value if necessary */
+                               if(stmt->dbh->methods->quoter(stmt->dbh, Z_STRVAL_P(param->parameter), 
+                                       Z_STRLEN_P(param->parameter), &quotedstr, &quotedstrlen TSRMLS_CC))
+                               {
+                                       memcpy(ptr, quotedstr, quotedstrlen);
+                                       ptr += quotedstrlen;
+                                       *outquery_len += quotedstrlen;
+                                       efree(quotedstr);
+                               } else {
+                                       memcpy(ptr, Z_STRVAL_P(param->parameter), Z_STRLEN_P(param->parameter));
+                                       ptr += Z_STRLEN_P(param->parameter);
+                                       *outquery_len += (Z_STRLEN_P(param->parameter));
+                               }
+                       }
+                       else {
+                               /* error and cleanup */
+                               efree(*outquery);
+                               return (int) (s.cur - inquery);
                        }
                        bindno++;
-               }       
+               }
        }       
        *ptr = '\0';
-       return 1;
+       return 0;
 }
 
 /*
index 87427131b2b7aaca1dc5e2d0643a0b8ada92c587..83ce3d2538e65619be74f603fe329da9c8217355 100644 (file)
@@ -46,14 +46,16 @@ static int scan(Scanner *s)
        /*!re2c
        BINDCHR         = [:][a-zA-Z0-9_]+;
        QUESTION        = [?];
-       SPECIALS        = [:?"];
-       ESC             = [\\]["];
+       SPECIALS        = [:?"'];
+       ESCQQ           = [\\]["];
+       ESCQ            = [\\]['];
        EOF                     = [\000];
        ANYNOEOF        = [\001-\377];
        */
 
        /*!re2c
-               (["] (ESC|ANYNOEOF\[\\"])* ["])         { RET(PDO_PARSER_TEXT); }
+               (["] (ESCQQ|ANYNOEOF\[\\"])* ["])               { RET(PDO_PARSER_TEXT); }
+               (['] (ESCQ|ANYNOEOF\[\\"])* ['])                { RET(PDO_PARSER_TEXT); }
                BINDCHR { RET(PDO_PARSER_BIND); }
                QUESTION        { RET(PDO_PARSER_BIND_POS); }
                SPECIALS        { RET(PDO_PARSER_TEXT); }
@@ -114,6 +116,7 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou
                        if(!params) { 
                                /* error */
                                efree(*outquery);
+                               *outquery = NULL;
                                return (int) (s.cur - inquery);
                        }
                        /* lookup bind first via hash and then index */
@@ -144,9 +147,10 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou
                                        *outquery_len += (Z_STRLEN_P(param->parameter));
                                }
                        }
-                       else {
+                       else_{
                                /* error and cleanup */
                                efree(*outquery);
+                               *outquery = NULL;
                                return (int) (s.cur - inquery);
                        }
                        bindno++;
@@ -155,6 +159,7 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou
                        if(!params) { 
                                /* error */
                                efree(*outquery);
+                               *outquery = NULL;
                                return (int) (s.cur - inquery);
                        }
                        /* lookup bind by index */
@@ -181,6 +186,7 @@ int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len, char **ou
                        else {
                                /* error and cleanup */
                                efree(*outquery);
+                               *outquery = NULL;
                                return (int) (s.cur - inquery);
                        }
                        bindno++;