summaryrefslogtreecommitdiff
path: root/ext/pdo/pdo_sql_parser.c
diff options
context:
space:
mode:
authorPeter Kokot <peterkokot@gmail.com>2018-11-10 02:47:26 +0100
committerPeter Kokot <peterkokot@gmail.com>2018-11-11 02:55:46 +0100
commitf0251a8b16631edf06830e08698cef5d76c1e01b (patch)
tree8a2fefe158a2d1cda48fd70bc697ea85e62e9828 /ext/pdo/pdo_sql_parser.c
parent1c873c119133c6d5ef13b635cba820236fa5848d (diff)
downloadphp-git-f0251a8b16631edf06830e08698cef5d76c1e01b.tar.gz
Remove lexer files generated by RE2C
This patch removes generated lexer files by re2c during the build process so they are not tracked by Git yet can be still shipped when PHP is released. The genfiles script additionally provides generation of these lexer files when creating a release of the PHP source code. The genfiles script refactorings: - added file header - echoing steps instead of comments - cleaning only lines starting with `#line` - eval removed in favor of direct executed commands - the debug mode `set -x` removed - script can be called from any path - improved comments
Diffstat (limited to 'ext/pdo/pdo_sql_parser.c')
-rw-r--r--ext/pdo/pdo_sql_parser.c739
1 files changed, 0 insertions, 739 deletions
diff --git a/ext/pdo/pdo_sql_parser.c b/ext/pdo/pdo_sql_parser.c
deleted file mode 100644
index 779a70280a..0000000000
--- a/ext/pdo/pdo_sql_parser.c
+++ /dev/null
@@ -1,739 +0,0 @@
-/* Generated by re2c 1.0.3 */
-#line 1 "ext/pdo/pdo_sql_parser.re"
-/*
- +----------------------------------------------------------------------+
- | PHP Version 7 |
- +----------------------------------------------------------------------+
- | Copyright (c) 1997-2018 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 |
- | available through the world-wide-web at the following url: |
- | http://www.php.net/license/3_01.txt |
- | If you did not receive a copy of the PHP license and are unable to |
- | obtain it through the world-wide-web, please send a note to |
- | license@php.net so we can mail you a copy immediately. |
- +----------------------------------------------------------------------+
- | Author: George Schlossnagle <george@omniti.com> |
- +----------------------------------------------------------------------+
-*/
-
-#include "php.h"
-#include "php_pdo_driver.h"
-#include "php_pdo_int.h"
-
-#define PDO_PARSER_TEXT 1
-#define PDO_PARSER_BIND 2
-#define PDO_PARSER_BIND_POS 3
-#define PDO_PARSER_EOI 4
-
-#define RET(i) {s->cur = cursor; return i; }
-#define SKIP_ONE(i) {s->cur = s->tok + 1; return i; }
-
-#define YYCTYPE unsigned char
-#define YYCURSOR cursor
-#define YYLIMIT s->end
-#define YYMARKER s->ptr
-#define YYFILL(n) { RET(PDO_PARSER_EOI); }
-
-typedef struct Scanner {
- char *ptr, *cur, *tok, *end;
-} Scanner;
-
-static int scan(Scanner *s)
-{
- char *cursor = s->cur;
-
- s->tok = cursor;
- #line 53 "ext/pdo/pdo_sql_parser.re"
-
-
-
-#line 53 "ext/pdo/pdo_sql_parser.c"
-{
- YYCTYPE yych;
- if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
- yych = *YYCURSOR;
- switch (yych) {
- case 0x00: goto yy2;
- case '"': goto yy6;
- case '\'': goto yy8;
- case '(':
- case ')':
- case '*':
- case '+':
- case ',':
- case '.': goto yy9;
- case '-': goto yy10;
- case '/': goto yy11;
- case ':': goto yy12;
- case '?': goto yy13;
- default: goto yy3;
- }
-yy2:
- YYCURSOR = YYMARKER;
- goto yy7;
-yy3:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- switch (yych) {
- case 0x00:
- case '"':
- case '\'':
- case '(':
- case ')':
- case '*':
- case '+':
- case ',':
- case '-':
- case '.':
- case '/':
- case ':':
- case '?': goto yy5;
- default: goto yy3;
- }
-yy5:
-#line 63 "ext/pdo/pdo_sql_parser.re"
- { RET(PDO_PARSER_TEXT); }
-#line 100 "ext/pdo/pdo_sql_parser.c"
-yy6:
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych >= 0x01) goto yy16;
-yy7:
-#line 61 "ext/pdo/pdo_sql_parser.re"
- { SKIP_ONE(PDO_PARSER_TEXT); }
-#line 107 "ext/pdo/pdo_sql_parser.c"
-yy8:
- yych = *(YYMARKER = ++YYCURSOR);
- if (yych <= 0x00) goto yy7;
- goto yy21;
-yy9:
- ++YYCURSOR;
- goto yy7;
-yy10:
- yych = *++YYCURSOR;
- switch (yych) {
- case '-': goto yy25;
- default: goto yy7;
- }
-yy11:
- yych = *++YYCURSOR;
- switch (yych) {
- case '*': goto yy28;
- default: goto yy7;
- }
-yy12:
- yych = *++YYCURSOR;
- 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 yy30;
- case ':': goto yy33;
- default: goto yy7;
- }
-yy13:
- yych = *++YYCURSOR;
- switch (yych) {
- case '?': goto yy36;
- default: goto yy14;
- }
-yy14:
-#line 60 "ext/pdo/pdo_sql_parser.re"
- { RET(PDO_PARSER_BIND_POS); }
-#line 205 "ext/pdo/pdo_sql_parser.c"
-yy15:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
-yy16:
- switch (yych) {
- case 0x00: goto yy2;
- case '"': goto yy17;
- case '\\': goto yy19;
- default: goto yy15;
- }
-yy17:
- ++YYCURSOR;
-#line 56 "ext/pdo/pdo_sql_parser.re"
- { RET(PDO_PARSER_TEXT); }
-#line 221 "ext/pdo/pdo_sql_parser.c"
-yy19:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- if (yych <= 0x00) goto yy2;
- goto yy15;
-yy20:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
-yy21:
- switch (yych) {
- case 0x00: goto yy2;
- case '\'': goto yy22;
- case '\\': goto yy24;
- default: goto yy20;
- }
-yy22:
- ++YYCURSOR;
-#line 57 "ext/pdo/pdo_sql_parser.re"
- { RET(PDO_PARSER_TEXT); }
-#line 243 "ext/pdo/pdo_sql_parser.c"
-yy24:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- if (yych <= 0x00) goto yy2;
- goto yy20;
-yy25:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- switch (yych) {
- case '\n':
- case '\r': goto yy27;
- default: goto yy25;
- }
-yy27:
-#line 62 "ext/pdo/pdo_sql_parser.re"
- { RET(PDO_PARSER_TEXT); }
-#line 262 "ext/pdo/pdo_sql_parser.c"
-yy28:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- switch (yych) {
- case '*': goto yy38;
- default: goto yy28;
- }
-yy30:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- 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 yy30;
- default: goto yy32;
- }
-yy32:
-#line 59 "ext/pdo/pdo_sql_parser.re"
- { RET(PDO_PARSER_BIND); }
-#line 344 "ext/pdo/pdo_sql_parser.c"
-yy33:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- switch (yych) {
- case ':': goto yy33;
- default: goto yy35;
- }
-yy35:
-#line 58 "ext/pdo/pdo_sql_parser.re"
- { RET(PDO_PARSER_TEXT); }
-#line 356 "ext/pdo/pdo_sql_parser.c"
-yy36:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- switch (yych) {
- case '?': goto yy36;
- default: goto yy35;
- }
-yy38:
- ++YYCURSOR;
- if (YYLIMIT <= YYCURSOR) YYFILL(1);
- yych = *YYCURSOR;
- switch (yych) {
- case '*': goto yy38;
- case '/': goto yy40;
- default: goto yy28;
- }
-yy40:
- ++YYCURSOR;
- goto yy27;
-}
-#line 64 "ext/pdo/pdo_sql_parser.re"
-
-}
-
-struct placeholder {
- char *pos;
- size_t len;
- size_t qlen; /* quoted length of value */
- char *quoted; /* quoted value */
- int freeq;
- int bindno;
- struct placeholder *next;
-};
-
-static void free_param_name(zval *el) {
- efree(Z_PTR_P(el));
-}
-
-PDO_API int pdo_parse_params(pdo_stmt_t *stmt, char *inquery, size_t inquery_len,
- char **outquery, size_t *outquery_len)
-{
- Scanner s;
- char *ptr, *newbuffer;
- ptrdiff_t t;
- uint32_t bindno = 0;
- int ret = 0;
- size_t newbuffer_len;
- HashTable *params;
- struct pdo_bound_param_data *param;
- int query_type = PDO_PLACEHOLDER_NONE;
- struct placeholder *placeholders = NULL, *placetail = NULL, *plc = NULL;
-
- ptr = *outquery;
- s.cur = inquery;
- s.end = inquery + inquery_len + 1;
-
- /* phase 1: look for args */
- while((t = scan(&s)) != PDO_PARSER_EOI) {
- if (t == PDO_PARSER_BIND || t == PDO_PARSER_BIND_POS) {
- if (t == PDO_PARSER_BIND) {
- ptrdiff_t len = s.cur - s.tok;
- if ((inquery < (s.cur - len)) && isalnum(*(s.cur - len - 1))) {
- continue;
- }
- query_type |= PDO_PLACEHOLDER_NAMED;
- } else {
- query_type |= PDO_PLACEHOLDER_POSITIONAL;
- }
-
- plc = emalloc(sizeof(*plc));
- memset(plc, 0, sizeof(*plc));
- plc->next = NULL;
- plc->pos = s.tok;
- plc->len = s.cur - s.tok;
- plc->bindno = bindno++;
-
- if (placetail) {
- placetail->next = plc;
- } else {
- placeholders = plc;
- }
- placetail = plc;
- }
- }
-
- if (bindno == 0) {
- /* nothing to do; good! */
- return 0;
- }
-
- /* did the query make sense to me? */
- 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");
- ret = -1;
- goto clean_up;
- }
-
- 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 */
- if (bindno && !params && stmt->supports_placeholders == PDO_PLACEHOLDER_NONE) {
- pdo_raise_impl_error(stmt->dbh, stmt, "HY093", "no parameters were bound");
- 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 than once */
- if (query_type != PDO_PLACEHOLDER_POSITIONAL && bindno > zend_hash_num_elements(params)) {
- int ok = 1;
- for (plc = placeholders; plc; plc = plc->next) {
- if ((param = zend_hash_str_find_ptr(params, plc->pos, plc->len)) == NULL) {
- 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");
- ret = -1;
- goto clean_up;
- }
-safe:
- /* what are we going to do ? */
- if (stmt->supports_placeholders == PDO_PLACEHOLDER_NONE) {
- /* query generation */
-
- newbuffer_len = inquery_len;
-
- /* let's quote all the values */
- for (plc = placeholders; plc; plc = plc->next) {
- if (query_type == PDO_PLACEHOLDER_POSITIONAL) {
- param = zend_hash_index_find_ptr(params, plc->bindno);
- } else {
- param = zend_hash_str_find_ptr(params, plc->pos, plc->len);
- }
- if (param == NULL) {
- /* parameter was not defined */
- ret = -1;
- pdo_raise_impl_error(stmt->dbh, stmt, "HY093", "parameter was not defined");
- goto clean_up;
- }
- if (stmt->dbh->methods->quoter) {
- zval *parameter;
- if (Z_ISREF(param->parameter)) {
- parameter = Z_REFVAL(param->parameter);
- } else {
- parameter = &param->parameter;
- }
- if (param->param_type == PDO_PARAM_LOB && Z_TYPE_P(parameter) == IS_RESOURCE) {
- php_stream *stm;
-
- php_stream_from_zval_no_verify(stm, parameter);
- if (stm) {
- zend_string *buf;
-
- buf = php_stream_copy_to_mem(stm, PHP_STREAM_COPY_ALL, 0);
- if (!buf) {
- buf = ZSTR_EMPTY_ALLOC();
- }
- if (!stmt->dbh->methods->quoter(stmt->dbh, ZSTR_VAL(buf), ZSTR_LEN(buf), &plc->quoted, &plc->qlen,
- param->param_type)) {
- /* bork */
- ret = -1;
- strncpy(stmt->error_code, stmt->dbh->error_code, 6);
- if (buf) {
- zend_string_release_ex(buf, 0);
- }
- goto clean_up;
- }
- if (buf) {
- zend_string_release_ex(buf, 0);
- }
- } else {
- pdo_raise_impl_error(stmt->dbh, stmt, "HY105", "Expected a stream resource");
- ret = -1;
- goto clean_up;
- }
- plc->freeq = 1;
- } else {
- enum pdo_param_type param_type = param->param_type;
- zend_string *buf = NULL;
-
- /* assume all types are nullable */
- if (Z_TYPE_P(parameter) == IS_NULL) {
- param_type = PDO_PARAM_NULL;
- }
-
- switch (param_type) {
- case PDO_PARAM_BOOL:
- plc->quoted = zend_is_true(parameter) ? "1" : "0";
- plc->qlen = sizeof("1")-1;
- plc->freeq = 0;
- break;
-
- case PDO_PARAM_INT:
- buf = zend_long_to_str(zval_get_long(parameter));
-
- plc->qlen = ZSTR_LEN(buf);
- plc->quoted = estrdup(ZSTR_VAL(buf));
- plc->freeq = 1;
- break;
-
- case PDO_PARAM_NULL:
- plc->quoted = "NULL";
- plc->qlen = sizeof("NULL")-1;
- plc->freeq = 0;
- break;
-
- default:
- buf = zval_get_string(parameter);
- if (!stmt->dbh->methods->quoter(stmt->dbh, ZSTR_VAL(buf),
- ZSTR_LEN(buf), &plc->quoted, &plc->qlen,
- param_type)) {
- /* bork */
- ret = -1;
- strncpy(stmt->error_code, stmt->dbh->error_code, 6);
- if (buf) {
- zend_string_release_ex(buf, 0);
- }
- goto clean_up;
- }
- plc->freeq = 1;
- }
-
- if (buf) {
- zend_string_release_ex(buf, 0);
- }
- }
- } else {
- zval *parameter;
- if (Z_ISREF(param->parameter)) {
- parameter = Z_REFVAL(param->parameter);
- } else {
- parameter = &param->parameter;
- }
- plc->quoted = Z_STRVAL_P(parameter);
- plc->qlen = Z_STRLEN_P(parameter);
- }
- newbuffer_len += plc->qlen;
- }
-
-rewrite:
- /* allocate output buffer */
- newbuffer = emalloc(newbuffer_len + 1);
- *outquery = newbuffer;
-
- /* and build the query */
- plc = placeholders;
- ptr = inquery;
-
- do {
- t = plc->pos - ptr;
- if (t) {
- memcpy(newbuffer, ptr, t);
- newbuffer += t;
- }
- memcpy(newbuffer, plc->quoted, plc->qlen);
- newbuffer += plc->qlen;
- ptr = plc->pos + plc->len;
-
- plc = plc->next;
- } while (plc);
-
- t = (inquery + inquery_len) - ptr;
- if (t) {
- memcpy(newbuffer, ptr, t);
- newbuffer += t;
- }
- *newbuffer = '\0';
- *outquery_len = newbuffer - *outquery;
-
- ret = 1;
- goto clean_up;
-
- } else if (query_type == PDO_PLACEHOLDER_POSITIONAL) {
- /* rewrite ? to :pdoX */
- char *name, *idxbuf;
- const char *tmpl = stmt->named_rewrite_template ? stmt->named_rewrite_template : ":pdo%d";
- int bind_no = 1;
-
- newbuffer_len = inquery_len;
-
- if (stmt->bound_param_map == NULL) {
- ALLOC_HASHTABLE(stmt->bound_param_map);
- zend_hash_init(stmt->bound_param_map, 13, NULL, free_param_name, 0);
- }
-
- for (plc = placeholders; plc; plc = plc->next) {
- int skip_map = 0;
- char *p;
- name = estrndup(plc->pos, plc->len);
-
- /* check if bound parameter is already available */
- if (!strcmp(name, "?") || (p = zend_hash_str_find_ptr(stmt->bound_param_map, name, plc->len)) == NULL) {
- spprintf(&idxbuf, 0, tmpl, bind_no++);
- } else {
- idxbuf = estrdup(p);
- skip_map = 1;
- }
-
- plc->quoted = idxbuf;
- plc->qlen = strlen(plc->quoted);
- plc->freeq = 1;
- newbuffer_len += plc->qlen;
-
- if (!skip_map && stmt->named_rewrite_template) {
- /* create a mapping */
- zend_hash_str_update_mem(stmt->bound_param_map, name, plc->len, idxbuf, plc->qlen + 1);
- }
-
- /* map number to name */
- zend_hash_index_update_mem(stmt->bound_param_map, plc->bindno, idxbuf, plc->qlen + 1);
-
- efree(name);
- }
-
- goto rewrite;
-
- } else {
- /* rewrite :name to ? */
-
- newbuffer_len = inquery_len;
-
- if (stmt->bound_param_map == NULL) {
- ALLOC_HASHTABLE(stmt->bound_param_map);
- zend_hash_init(stmt->bound_param_map, 13, NULL, free_param_name, 0);
- }
-
- for (plc = placeholders; plc; plc = plc->next) {
- char *name;
- name = estrndup(plc->pos, plc->len);
- zend_hash_index_update_mem(stmt->bound_param_map, plc->bindno, name, plc->len + 1);
- efree(name);
- plc->quoted = "?";
- plc->qlen = 1;
- }
-
- goto rewrite;
- }
-
-clean_up:
-
- while (placeholders) {
- plc = placeholders;
- placeholders = plc->next;
-
- if (plc->freeq) {
- efree(plc->quoted);
- }
-
- efree(plc);
- }
-
- return ret;
-}
-
-/*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * End:
- * vim600: noet sw=4 ts=4 fdm=marker ft=c
- * vim<600: noet sw=4 ts=4
- */