]> granicus.if.org Git - php/commitdiff
And the generated version of the parser
authorWez Furlong <wez@php.net>
Fri, 8 Jul 2005 15:24:42 +0000 (15:24 +0000)
committerWez Furlong <wez@php.net>
Fri, 8 Jul 2005 15:24:42 +0000 (15:24 +0000)
ext/pdo/pdo_sql_parser.c

index 1b590144890def6d675ab2e0cad4d97d484dd21c..2704a3bbcdbf760b410db231f2af3a813a027c5c 100644 (file)
@@ -1,5 +1,5 @@
-/* Generated by re2c 0.9.6 on Thu Apr 14 18:29:11 2005 */
-#line 1 "pdo_sql_parser.re"
+/* Generated by re2c 0.9.3 on Fri Jul  8 08:01:28 2005 */
+#line 1 "../php5-HEAD/ext/pdo/pdo_sql_parser.re"
 /*
   +----------------------------------------------------------------------+
   | PHP Version 5                                                        |
@@ -46,7 +46,7 @@ static int scan(Scanner *s)
        char *cursor = s->cur;
        std:
                s->tok = cursor;
-       #line 55 "pdo_sql_parser.re"
+       #line 55 "../php5-HEAD/ext/pdo/pdo_sql_parser.re"
 
 
        
@@ -54,117 +54,202 @@ static int scan(Scanner *s)
 {
        YYCTYPE yych;
        unsigned int yyaccept;
-       static unsigned char yybm[] = {
-         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;
-       ++YYCURSOR;
+yy1:   ++YYCURSOR;
 yy0:
        if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
        yych = *YYCURSOR;
-       if(yybm[0+yych] & 8) {
-               goto yy8;
+       switch(yych){
+       case '\000':    goto yy11;
+       case '"':       goto yy2;
+       case '\'':      goto yy4;
+       case ':':       goto yy5;
+       case '?':       goto yy6;
+       default:        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(yych >= 0x01)        goto yy24;
+       if(yych >= '\001')      goto yy24;
        goto yy3;
 yy3:
-#line 62 "pdo_sql_parser.re"
+#line 62 "../php5-HEAD/ext/pdo/pdo_sql_parser.re"
 { RET(PDO_PARSER_TEXT); }
-#line 65 "<stdout>"
+#line 31 "<stdout>"
 yy4:   yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
-       if(yych <= 0x00)        goto yy3;
-       if(yych == '"') goto yy3;
-       goto yy17;
+       switch(yych){
+       case '\000':    case '"':       goto yy3;
+       default:        goto yy17;
+       }
 yy5:   yych = *++YYCURSOR;
-       if(yybm[0+yych] & 16) {
-               goto yy13;
+       switch(yych){
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':       case '_':       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':       goto yy13;
+       default:        goto yy3;
        }
-       goto yy3;
 yy6:   ++YYCURSOR;
        goto yy7;
 yy7:
-#line 61 "pdo_sql_parser.re"
+#line 61 "../php5-HEAD/ext/pdo/pdo_sql_parser.re"
 { RET(PDO_PARSER_BIND_POS); }
-#line 81 "<stdout>"
+#line 107 "<stdout>"
 yy8:   ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
        goto yy9;
-yy9:   if(yybm[0+yych] & 8) {
-               goto yy8;
+yy9:   switch(yych){
+       case '\000':    case '"':       case '\'':      case ':':       case '?':       goto yy10;
+       default:        goto yy8;
        }
-       goto yy10;
 yy10:
-#line 63 "pdo_sql_parser.re"
+#line 63 "../php5-HEAD/ext/pdo/pdo_sql_parser.re"
 { RET(PDO_PARSER_TEXT); }
-#line 94 "<stdout>"
+#line 120 "<stdout>"
 yy11:  ++YYCURSOR;
        goto yy12;
 yy12:
-#line 64 "pdo_sql_parser.re"
+#line 64 "../php5-HEAD/ext/pdo/pdo_sql_parser.re"
 { RET(PDO_PARSER_EOI); }
-#line 100 "<stdout>"
+#line 126 "<stdout>"
 yy13:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
        goto yy14;
-yy14:  if(yybm[0+yych] & 16) {
-               goto yy13;
+yy14:  switch(yych){
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':       case '_':       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':       goto yy13;
+       default:        goto yy15;
        }
-       goto yy15;
 yy15:
-#line 60 "pdo_sql_parser.re"
+#line 60 "../php5-HEAD/ext/pdo/pdo_sql_parser.re"
 { RET(PDO_PARSER_BIND); }
-#line 113 "<stdout>"
+#line 198 "<stdout>"
 yy16:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
        goto yy17;
-yy17:  if(yybm[0+yych] & 32) {
-               goto yy16;
+yy17:  switch(yych){
+       case '\000':    case '"':       goto yy18;
+       case '\'':      goto yy19;
+       case '\\':      goto yy22;
+       default:        goto yy16;
        }
-       if(yych <= '&') goto yy18;
-       if(yych <= '\'')        goto yy19;
-       goto yy22;
 yy18:  YYCURSOR = YYMARKER;
        switch(yyaccept){
        case 1: goto yy21;
@@ -175,44 +260,48 @@ yy19:     yyaccept = 1;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
        goto yy20;
-yy20:  if(yybm[0+yych] & 32) {
-               goto yy16;
+yy20:  switch(yych){
+       case '\000':    case '"':       goto yy21;
+       case '\'':      goto yy19;
+       case '\\':      goto yy22;
+       default:        goto yy16;
        }
-       if(yych <= '&') goto yy21;
-       if(yych <= '\'')        goto yy19;
-       goto yy22;
 yy21:
-#line 59 "pdo_sql_parser.re"
+#line 59 "../php5-HEAD/ext/pdo/pdo_sql_parser.re"
 { RET(PDO_PARSER_TEXT); }
-#line 144 "<stdout>"
+#line 229 "<stdout>"
 yy22:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       if(yych == '\'')        goto yy16;
-       goto yy18;
+       switch(yych){
+       case '\'':      goto yy16;
+       default:        goto yy18;
+       }
 yy23:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
        goto yy24;
-yy24:  if(yybm[0+yych] & 128) {
-               goto yy23;
+yy24:  switch(yych){
+       case '\000':    goto yy18;
+       case '"':       goto yy26;
+       case '\\':      goto yy25;
+       default:        goto yy23;
        }
-       if(yych <= 0x00)        goto yy18;
-       if(yych <= '[') goto yy26;
-       goto yy25;
 yy25:  ++YYCURSOR;
        if(YYLIMIT == YYCURSOR) YYFILL(1);
        yych = *YYCURSOR;
-       if(yych == '"') goto yy23;
-       goto yy18;
+       switch(yych){
+       case '"':       goto yy23;
+       default:        goto yy18;
+       }
 yy26:  ++YYCURSOR;
        goto yy27;
 yy27:
-#line 58 "pdo_sql_parser.re"
+#line 58 "../php5-HEAD/ext/pdo/pdo_sql_parser.re"
 { RET(PDO_PARSER_TEXT); }
-#line 173 "<stdout>"
+#line 262 "<stdout>"
 }
-#line 65 "pdo_sql_parser.re"
+#line 65 "../php5-HEAD/ext/pdo/pdo_sql_parser.re"
        
 }
 
@@ -281,12 +370,22 @@ PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, int inquery_len,
                return -1;
        }
 
-       if (stmt->supports_placeholders == query_type) {
+
+       if (stmt->supports_placeholders == query_type && !stmt->named_rewrite_template) {
                /* query matches native syntax */
                ret = 0;
                goto clean_up;
        }
 
+       if (stmt->named_rewrite_template) {
+               /* magic/hack.
+                * We we pretend that the query was positional even if
+                * it was named so that we fall into the
+                * named rewrite case below.  Not too pretty,
+                * but it works. */
+               query_type = PDO_PLACEHOLDER_POSITIONAL;
+       }
+       
        params = stmt->bound_params;
        
        /* Do we have placeholders but no bound params */
@@ -416,11 +515,12 @@ rewrite:
        } else if (query_type == PDO_PLACEHOLDER_POSITIONAL) {
                /* rewrite ? to :pdoX */
                char idxbuf[32];
+               const char *tmpl = stmt->named_rewrite_template ? stmt->named_rewrite_template : ":pdo%d";
                
                newbuffer_len = inquery_len;
 
                for (plc = placeholders; plc; plc = plc->next) {
-                       snprintf(idxbuf, sizeof(idxbuf), ":pdo%d", plc->bindno);
+                       snprintf(idxbuf, sizeof(idxbuf), tmpl, plc->bindno + 1);
                        plc->quoted = estrdup(idxbuf);
                        plc->qlen = strlen(plc->quoted);
                        plc->freeq = 1;