git: e000de2adb6a - main - lang/php85: Update version 8.5.0alpha4=>8.5.0beta1
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Tue, 19 Aug 2025 06:46:10 UTC
The branch main has been updated by bofh:
URL: https://cgit.FreeBSD.org/ports/commit/?id=e000de2adb6a7bb79613530d9e9ebf62fd9495d9
commit e000de2adb6a7bb79613530d9e9ebf62fd9495d9
Author: Muhammad Moinur Rahman <bofh@FreeBSD.org>
AuthorDate: 2025-08-19 06:21:03 +0000
Commit: Muhammad Moinur Rahman <bofh@FreeBSD.org>
CommitDate: 2025-08-19 06:45:45 +0000
lang/php85: Update version 8.5.0alpha4=>8.5.0beta1
Please DO NOT use this version in production, it is an early test
version.
Changelog: https://github.com/php/php-src/blob/php-8.5.0beta1/NEWS
---
archivers/php85-phar/files/patch-phar__internal.h | 18 +
.../php85-phar/files/patch-phar__path__check.c | 241 -------
archivers/php85-phar/files/patch-pharzip.h | 19 +
databases/php85-pdo/files/patch-pdo__sql__parser.c | 729 ---------------------
.../files/patch-mysql__sql__parser.c | 398 -----------
.../files/patch-pgsql__sql__parser.c | 528 ---------------
.../files/patch-sqlite__sql__parser.c | 398 -----------
lang/php85/Makefile | 10 +-
lang/php85/distinfo | 6 +-
lang/php85/pkg-plist | 1 +
10 files changed, 45 insertions(+), 2303 deletions(-)
diff --git a/archivers/php85-phar/files/patch-phar__internal.h b/archivers/php85-phar/files/patch-phar__internal.h
new file mode 100644
index 000000000000..8e78b1e703f8
--- /dev/null
+++ b/archivers/php85-phar/files/patch-phar__internal.h
@@ -0,0 +1,18 @@
+--- phar_internal.h.orig 2025-08-19 05:47:26 UTC
++++ phar_internal.h
+@@ -17,6 +17,9 @@
+ +----------------------------------------------------------------------+
+ */
+
++#ifndef PHAR_PHAR_INTERNAL_H
++#define PHAR_PHAR_INTERNAL_H
++
+ #ifdef HAVE_CONFIG_H
+ #include <config.h>
+ #endif
+@@ -487,3 +490,5 @@ END_EXTERN_C()
+ phar_path_check_result phar_path_check(char **p, size_t *len, const char **error);
+
+ END_EXTERN_C()
++
++#endif /* PHAR_PHAR_INTERNAL_H */
diff --git a/archivers/php85-phar/files/patch-phar__path__check.c b/archivers/php85-phar/files/patch-phar__path__check.c
deleted file mode 100644
index 8e599176ec86..000000000000
--- a/archivers/php85-phar/files/patch-phar__path__check.c
+++ /dev/null
@@ -1,241 +0,0 @@
---- phar_path_check.c.orig 2025-07-02 12:00:06 UTC
-+++ phar_path_check.c
-@@ -0,0 +1,238 @@
-+/* Generated by re2c 3.1 */
-+/*
-+ +----------------------------------------------------------------------+
-+ | phar php single-file executable PHP extension |
-+ +----------------------------------------------------------------------+
-+ | Copyright (c) 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: |
-+ | https://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. |
-+ +----------------------------------------------------------------------+
-+ | Authors: Marcus Boerger <helly@php.net> |
-+ +----------------------------------------------------------------------+
-+*/
-+
-+#include "phar_internal.h"
-+
-+phar_path_check_result phar_path_check(char **s, size_t *len, const char **error)
-+{
-+ const unsigned char *p = (const unsigned char*)*s;
-+ const unsigned char *m;
-+
-+ if (*len == 1 && *p == '.') {
-+ *error = "current directory reference";
-+ return pcr_err_curr_dir;
-+ } else if (*len == 2 && p[0] == '.' && p[1] == '.') {
-+ *error = "upper directory reference";
-+ return pcr_err_up_dir;
-+ }
-+
-+#define YYCTYPE unsigned char
-+#define YYCURSOR p
-+#define YYLIMIT p+*len
-+#define YYMARKER m
-+#define YYFILL(n) do {} while (0)
-+
-+loop:
-+
-+{
-+ YYCTYPE yych;
-+ unsigned int yyaccept = 0;
-+ if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4);
-+ yych = *YYCURSOR;
-+ if (yych <= '[') {
-+ if (yych <= ')') {
-+ if (yych <= '\f') {
-+ if (yych >= 0x01) goto yy1;
-+ } else {
-+ if (yych <= '\r') goto yy3;
-+ if (yych <= 0x19) goto yy1;
-+ goto yy4;
-+ }
-+ } else {
-+ if (yych <= '/') {
-+ if (yych <= '*') goto yy6;
-+ if (yych <= '.') goto yy4;
-+ goto yy7;
-+ } else {
-+ if (yych == '?') goto yy8;
-+ goto yy4;
-+ }
-+ }
-+ } else {
-+ if (yych <= 0xEC) {
-+ if (yych <= 0xC1) {
-+ if (yych <= '\\') goto yy9;
-+ if (yych <= 0x7F) goto yy4;
-+ goto yy1;
-+ } else {
-+ if (yych <= 0xDF) goto yy10;
-+ if (yych <= 0xE0) goto yy11;
-+ goto yy12;
-+ }
-+ } else {
-+ if (yych <= 0xF0) {
-+ if (yych <= 0xED) goto yy13;
-+ if (yych <= 0xEF) goto yy12;
-+ goto yy14;
-+ } else {
-+ if (yych <= 0xF3) goto yy15;
-+ if (yych <= 0xF4) goto yy16;
-+ goto yy1;
-+ }
-+ }
-+ }
-+ ++YYCURSOR;
-+ {
-+ if (**s == '/') {
-+ (*s)++;
-+ (*len)--;
-+ }
-+ if ((p - (const unsigned char*)*s) - 1 != *len)
-+ {
-+ *error ="illegal character";
-+ return pcr_err_illegal_char;
-+ }
-+ *error = NULL;
-+ return pcr_is_ok;
-+ }
-+yy1:
-+ ++YYCURSOR;
-+yy2:
-+ {
-+ *error ="illegal character";
-+ return pcr_err_illegal_char;
-+ }
-+yy3:
-+ yych = *++YYCURSOR;
-+ if (yych == '\n') goto yy1;
-+ goto yy2;
-+yy4:
-+ ++YYCURSOR;
-+yy5:
-+ {
-+ goto loop;
-+ }
-+yy6:
-+ ++YYCURSOR;
-+ {
-+ *error = "star";
-+ return pcr_err_star;
-+ }
-+yy7:
-+ yyaccept = 0;
-+ yych = *(YYMARKER = ++YYCURSOR);
-+ if (yych <= '-') goto yy5;
-+ if (yych <= '.') goto yy17;
-+ if (yych <= '/') goto yy19;
-+ goto yy5;
-+yy8:
-+ ++YYCURSOR;
-+ {
-+ if (**s == '/') {
-+ (*s)++;
-+ }
-+ *len = (p - (const unsigned char*)*s) -1;
-+ *error = NULL;
-+ return pcr_use_query;
-+ }
-+yy9:
-+ ++YYCURSOR;
-+ {
-+ *error = "back-slash";
-+ return pcr_err_back_slash;
-+ }
-+yy10:
-+ yych = *++YYCURSOR;
-+ if (yych <= 0x7F) goto yy2;
-+ if (yych <= 0xBF) goto yy4;
-+ goto yy2;
-+yy11:
-+ yyaccept = 1;
-+ yych = *(YYMARKER = ++YYCURSOR);
-+ if (yych <= 0x9F) goto yy2;
-+ if (yych <= 0xBF) goto yy20;
-+ goto yy2;
-+yy12:
-+ yyaccept = 1;
-+ yych = *(YYMARKER = ++YYCURSOR);
-+ if (yych <= 0x7F) goto yy2;
-+ if (yych <= 0xBF) goto yy20;
-+ goto yy2;
-+yy13:
-+ yyaccept = 1;
-+ yych = *(YYMARKER = ++YYCURSOR);
-+ if (yych <= 0x7F) goto yy2;
-+ if (yych <= 0x9F) goto yy20;
-+ goto yy2;
-+yy14:
-+ yyaccept = 1;
-+ yych = *(YYMARKER = ++YYCURSOR);
-+ if (yych <= 0x8F) goto yy2;
-+ if (yych <= 0xBF) goto yy21;
-+ goto yy2;
-+yy15:
-+ yyaccept = 1;
-+ yych = *(YYMARKER = ++YYCURSOR);
-+ if (yych <= 0x7F) goto yy2;
-+ if (yych <= 0xBF) goto yy21;
-+ goto yy2;
-+yy16:
-+ yyaccept = 1;
-+ yych = *(YYMARKER = ++YYCURSOR);
-+ if (yych <= 0x7F) goto yy2;
-+ if (yych <= 0x8F) goto yy21;
-+ goto yy2;
-+yy17:
-+ yych = *++YYCURSOR;
-+ if (yych <= 0x00) goto yy22;
-+ if (yych <= '-') goto yy18;
-+ if (yych <= '.') goto yy23;
-+ if (yych <= '/') goto yy22;
-+yy18:
-+ YYCURSOR = YYMARKER;
-+ if (yyaccept == 0) {
-+ goto yy5;
-+ } else {
-+ goto yy2;
-+ }
-+yy19:
-+ ++YYCURSOR;
-+ {
-+ *error = "double slash";
-+ return pcr_err_double_slash;
-+ }
-+yy20:
-+ yych = *++YYCURSOR;
-+ if (yych <= 0x7F) goto yy18;
-+ if (yych <= 0xBF) goto yy4;
-+ goto yy18;
-+yy21:
-+ yych = *++YYCURSOR;
-+ if (yych <= 0x7F) goto yy18;
-+ if (yych <= 0xBF) goto yy20;
-+ goto yy18;
-+yy22:
-+ ++YYCURSOR;
-+ {
-+ *error = "current directory reference";
-+ return pcr_err_curr_dir;
-+ }
-+yy23:
-+ yych = *++YYCURSOR;
-+ if (yych <= 0x00) goto yy24;
-+ if (yych != '/') goto yy18;
-+yy24:
-+ ++YYCURSOR;
-+ {
-+ *error = "upper directory reference";
-+ return pcr_err_up_dir;
-+ }
-+}
-+
-+}
diff --git a/archivers/php85-phar/files/patch-pharzip.h b/archivers/php85-phar/files/patch-pharzip.h
new file mode 100644
index 000000000000..5e0e89f2a844
--- /dev/null
+++ b/archivers/php85-phar/files/patch-pharzip.h
@@ -0,0 +1,19 @@
+--- pharzip.h.orig 2025-08-19 05:41:37 UTC
++++ pharzip.h
+@@ -17,6 +17,10 @@
+ +----------------------------------------------------------------------+
+ */
+
++/* Add missing include guard to avoid multiple inclusion */
++#ifndef PHAR_PHARZIP_H
++#define PHAR_PHARZIP_H
++
+ typedef struct _phar_zip_file_header {
+ char signature[4]; /* local file header signature 4 bytes (0x04034b50) */
+ char zipversion[2]; /* version needed to extract 2 bytes */
+@@ -238,3 +242,5 @@ typedef struct _phar_zip_dir_end {
+ char comment_len[2]; /* .ZIP file comment length 2 bytes */
+ /* .ZIP file comment (variable size) */
+ } phar_zip_dir_end;
++
++#endif /* PHAR_PHARZIP_H */
diff --git a/databases/php85-pdo/files/patch-pdo__sql__parser.c b/databases/php85-pdo/files/patch-pdo__sql__parser.c
deleted file mode 100644
index 191eea16a3bd..000000000000
--- a/databases/php85-pdo/files/patch-pdo__sql__parser.c
+++ /dev/null
@@ -1,729 +0,0 @@
---- pdo_sql_parser.c.orig 2025-07-02 12:59:51 UTC
-+++ pdo_sql_parser.c
-@@ -0,0 +1,726 @@
-+/* Generated by re2c 3.1 */
-+/*
-+ +----------------------------------------------------------------------+
-+ | Copyright (c) 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: |
-+ | https://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 "pdo_sql_parser.h"
-+
-+static int default_scanner(pdo_scanner_t *s)
-+{
-+ const char *cursor = s->cur;
-+
-+ s->tok = cursor;
-+
-+
-+
-+{
-+ YYCTYPE yych;
-+ unsigned int yyaccept = 0;
-+ if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
-+ yych = *YYCURSOR;
-+ switch (yych) {
-+ case 0x00: goto yy1;
-+ case '"': goto yy4;
-+ case '\'': goto yy6;
-+ case '-': goto yy7;
-+ case '/': goto yy8;
-+ case ':': goto yy9;
-+ case '?': goto yy10;
-+ default: goto yy2;
-+ }
-+yy1:
-+ YYCURSOR = YYMARKER;
-+ switch (yyaccept) {
-+ case 0: goto yy5;
-+ case 1: goto yy15;
-+ default: goto yy19;
-+ }
-+yy2:
-+ ++YYCURSOR;
-+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
-+ yych = *YYCURSOR;
-+ switch (yych) {
-+ case 0x00:
-+ case '"':
-+ case '\'':
-+ case '-':
-+ case '/':
-+ case ':':
-+ case '?': goto yy3;
-+ default: goto yy2;
-+ }
-+yy3:
-+ { RET(PDO_PARSER_TEXT); }
-+yy4:
-+ yyaccept = 0;
-+ yych = *(YYMARKER = ++YYCURSOR);
-+ if (yych >= 0x01) goto yy13;
-+yy5:
-+ { SKIP_ONE(PDO_PARSER_TEXT); }
-+yy6:
-+ yyaccept = 0;
-+ yych = *(YYMARKER = ++YYCURSOR);
-+ if (yych <= 0x00) goto yy5;
-+ goto yy17;
-+yy7:
-+ yych = *++YYCURSOR;
-+ switch (yych) {
-+ case '-': goto yy20;
-+ default: goto yy5;
-+ }
-+yy8:
-+ yych = *++YYCURSOR;
-+ switch (yych) {
-+ case '*': goto yy22;
-+ default: goto yy5;
-+ }
-+yy9:
-+ 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 yy23;
-+ case ':': goto yy25;
-+ default: goto yy5;
-+ }
-+yy10:
-+ yych = *++YYCURSOR;
-+ switch (yych) {
-+ case '?': goto yy27;
-+ default: goto yy11;
-+ }
-+yy11:
-+ { RET(PDO_PARSER_BIND_POS); }
-+yy12:
-+ ++YYCURSOR;
-+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
-+ yych = *YYCURSOR;
-+yy13:
-+ switch (yych) {
-+ case 0x00: goto yy1;
-+ case '"': goto yy14;
-+ default: goto yy12;
-+ }
-+yy14:
-+ yyaccept = 1;
-+ YYMARKER = ++YYCURSOR;
-+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
-+ yych = *YYCURSOR;
-+ switch (yych) {
-+ case '"': goto yy12;
-+ default: goto yy15;
-+ }
-+yy15:
-+ { RET(PDO_PARSER_TEXT); }
-+yy16:
-+ ++YYCURSOR;
-+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
-+ yych = *YYCURSOR;
-+yy17:
-+ switch (yych) {
-+ case 0x00: goto yy1;
-+ case '\'': goto yy18;
-+ default: goto yy16;
-+ }
-+yy18:
-+ yyaccept = 2;
-+ YYMARKER = ++YYCURSOR;
-+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
-+ yych = *YYCURSOR;
-+ switch (yych) {
-+ case '\'': goto yy16;
-+ default: goto yy19;
-+ }
-+yy19:
-+ { RET(PDO_PARSER_TEXT); }
-+yy20:
-+ ++YYCURSOR;
-+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
-+ yych = *YYCURSOR;
-+ switch (yych) {
-+ case '\n': goto yy21;
-+ default: goto yy20;
-+ }
-+yy21:
-+ { RET(PDO_PARSER_TEXT); }
-+yy22:
-+ ++YYCURSOR;
-+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
-+ yych = *YYCURSOR;
-+ switch (yych) {
-+ case '*': goto yy28;
-+ default: goto yy22;
-+ }
-+yy23:
-+ ++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 yy23;
-+ default: goto yy24;
-+ }
-+yy24:
-+ { RET(PDO_PARSER_BIND); }
-+yy25:
-+ ++YYCURSOR;
-+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
-+ yych = *YYCURSOR;
-+ switch (yych) {
-+ case ':': goto yy25;
-+ default: goto yy26;
-+ }
-+yy26:
-+ { RET(PDO_PARSER_TEXT); }
-+yy27:
-+ ++YYCURSOR;
-+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
-+ yych = *YYCURSOR;
-+ switch (yych) {
-+ case '?': goto yy27;
-+ default: goto yy26;
-+ }
-+yy28:
-+ ++YYCURSOR;
-+ if (YYLIMIT <= YYCURSOR) YYFILL(1);
-+ yych = *YYCURSOR;
-+ switch (yych) {
-+ case '*': goto yy28;
-+ case '/': goto yy29;
-+ default: goto yy22;
-+ }
-+yy29:
-+ ++YYCURSOR;
-+ goto yy21;
-+}
-+
-+}
-+
-+struct placeholder {
-+ const char *pos;
-+ size_t len;
-+ zend_string *quoted; /* quoted value */
-+ int bindno;
-+ struct placeholder *next;
-+};
-+
-+struct custom_quote {
-+ const char *pos;
-+ size_t len;
-+};
-+
-+static void free_param_name(zval *el) {
-+ zend_string_release(Z_PTR_P(el));
-+}
-+
-+PDO_API int pdo_parse_params(pdo_stmt_t *stmt, zend_string *inquery, zend_string **outquery)
-+{
-+ pdo_scanner_t s;
-+ char *newbuffer;
-+ ptrdiff_t t;
-+ uint32_t bindno = 0;
-+ int ret = 0, escapes = 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;
-+ int (*scan)(pdo_scanner_t *s);
-+ struct custom_quote custom_quote = {NULL, 0};
-+
-+ scan = stmt->dbh->methods->scanner ? stmt->dbh->methods->scanner : default_scanner;
-+
-+ s.cur = ZSTR_VAL(inquery);
-+ s.end = s.cur + ZSTR_LEN(inquery) + 1;
-+
-+ /* phase 1: look for args */
-+ while((t = scan(&s)) != PDO_PARSER_EOI) {
-+ if (custom_quote.pos) {
-+ /* Inside a custom quote */
-+ if (t == PDO_PARSER_CUSTOM_QUOTE && custom_quote.len == s.cur - s.tok && !strncmp(s.tok, custom_quote.pos, custom_quote.len)) {
-+ /* Matching closing quote found, end custom quoting */
-+ custom_quote.pos = NULL;
-+ custom_quote.len = 0;
-+ } else if (t == PDO_PARSER_ESCAPED_QUESTION) {
-+ /* An escaped question mark has been used inside a dollar quoted string, most likely as a workaround
-+ * as a single "?" would have been parsed as placeholder, due to the lack of support for dollar quoted
-+ * strings. For now, we emit a deprecation notice, but still process it */
-+ php_error_docref(NULL, E_DEPRECATED, "Escaping question marks inside dollar quoted strings is not required anymore and is deprecated");
-+
-+ goto placeholder;
-+ }
-+
-+ continue;
-+ }
-+
-+ if (t == PDO_PARSER_CUSTOM_QUOTE) {
-+ /* Start of a custom quote, keep a reference to search for the matching closing quote */
-+ custom_quote.pos = s.tok;
-+ custom_quote.len = s.cur - s.tok;
-+
-+ continue;
-+ }
-+
-+ if (t == PDO_PARSER_BIND || t == PDO_PARSER_BIND_POS || t == PDO_PARSER_ESCAPED_QUESTION) {
-+ if (t == PDO_PARSER_ESCAPED_QUESTION && stmt->supports_placeholders == PDO_PLACEHOLDER_POSITIONAL) {
-+ /* escaped question marks unsupported, treat as text */
-+ continue;
-+ }
-+
-+ if (t == PDO_PARSER_BIND) {
-+ ptrdiff_t len = s.cur - s.tok;
-+ if ((ZSTR_VAL(inquery) < (s.cur - len)) && isalnum(*(s.cur - len - 1))) {
-+ continue;
-+ }
-+ query_type |= PDO_PLACEHOLDER_NAMED;
-+ } else if (t == PDO_PARSER_BIND_POS) {
-+ query_type |= PDO_PLACEHOLDER_POSITIONAL;
-+ }
-+
-+placeholder:
-+ plc = emalloc(sizeof(*plc));
-+ memset(plc, 0, sizeof(*plc));
-+ plc->next = NULL;
-+ plc->pos = s.tok;
-+ plc->len = s.cur - s.tok;
-+
-+ if (t == PDO_PARSER_ESCAPED_QUESTION) {
-+ plc->bindno = PDO_PARSER_BINDNO_ESCAPED_CHAR;
-+ plc->quoted = ZSTR_CHAR('?');
-+ escapes++;
-+ } else {
-+ plc->bindno = bindno++;
-+ }
-+
-+ if (placetail) {
-+ placetail->next = plc;
-+ } else {
-+ placeholders = plc;
-+ }
-+ placetail = plc;
-+ }
-+ }
-+
-+ /* 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;
-+ }
-+
-+ params = stmt->bound_params;
-+ if (stmt->supports_placeholders == PDO_PLACEHOLDER_NONE && params && bindno != zend_hash_num_elements(params)) {
-+ /* 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;
-+ }
-+
-+ if (!placeholders) {
-+ /* nothing to do; good! */
-+ return 0;
-+ }
-+
-+ if (stmt->supports_placeholders == query_type && !stmt->named_rewrite_template) {
-+ /* query matches native syntax */
-+ if (escapes) {
-+ newbuffer_len = ZSTR_LEN(inquery);
-+ goto rewrite;
-+ }
-+
-+ ret = 0;
-+ goto clean_up;
-+ }
-+
-+ if (query_type == PDO_PLACEHOLDER_NAMED && 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;
-+ }
-+
-+safe:
-+ /* what are we going to do ? */
-+ if (stmt->supports_placeholders == PDO_PLACEHOLDER_NONE) {
-+ /* query generation */
-+
-+ newbuffer_len = ZSTR_LEN(inquery);
-+
-+ /* let's quote all the values */
-+ for (plc = placeholders; plc && params; plc = plc->next) {
-+ if (plc->bindno == PDO_PARSER_BINDNO_ESCAPED_CHAR) {
-+ /* escaped character */
-+ continue;
-+ }
-+
-+ if (query_type == PDO_PLACEHOLDER_NONE) {
-+ continue;
-+ }
-+
-+ 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 = ¶m->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();
-+ }
-+
-+ plc->quoted = stmt->dbh->methods->quoter(stmt->dbh, buf, param->param_type);
-+
-+ if (buf) {
-+ zend_string_release_ex(buf, 0);
-+ }
-+ if (plc->quoted == NULL) {
-+ /* bork */
-+ ret = -1;
-+ strncpy(stmt->error_code, stmt->dbh->error_code, 6);
-+ goto clean_up;
-+ }
-+
-+ } else {
-+ pdo_raise_impl_error(stmt->dbh, stmt, "HY105", "Expected a stream resource");
-+ ret = -1;
-+ goto clean_up;
-+ }
-+ } 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) ? ZSTR_CHAR('1') : ZSTR_CHAR('0');
-+ break;
-+
-+ case PDO_PARAM_INT:
-+ plc->quoted = zend_long_to_str(zval_get_long(parameter));
-+ break;
-+
-+ case PDO_PARAM_NULL:
-+ plc->quoted = ZSTR_KNOWN(ZEND_STR_NULL);
-+ break;
-+
-+ default: {
-+ buf = zval_try_get_string(parameter);
-+ /* parameter does not have a string representation, buf == NULL */
-+ if (EG(exception)) {
-+ /* bork */
-+ ret = -1;
-+ strncpy(stmt->error_code, stmt->dbh->error_code, 6);
-+ goto clean_up;
-+ }
-+
-+ plc->quoted = stmt->dbh->methods->quoter(stmt->dbh, buf, param_type);
-+ }
-+ }
-+
-+ if (buf) {
-+ zend_string_release_ex(buf, 0);
-+ }
-+ }
-+ } else {
-+ zval *parameter;
-+ if (Z_ISREF(param->parameter)) {
-+ parameter = Z_REFVAL(param->parameter);
-+ } else {
-+ parameter = ¶m->parameter;
-+ }
-+ plc->quoted = zend_string_copy(Z_STR_P(parameter));
-+ }
-+ newbuffer_len += ZSTR_LEN(plc->quoted);
-+ }
-+
-+rewrite:
-+ /* allocate output buffer */
-+ *outquery = zend_string_alloc(newbuffer_len, 0);
-+ newbuffer = ZSTR_VAL(*outquery);
-+
-+ /* and build the query */
-+ const char *ptr = ZSTR_VAL(inquery);
-+ plc = placeholders;
-+
-+ do {
-+ t = plc->pos - ptr;
-+ if (t) {
-+ memcpy(newbuffer, ptr, t);
-+ newbuffer += t;
-+ }
-+ if (plc->quoted) {
-+ memcpy(newbuffer, ZSTR_VAL(plc->quoted), ZSTR_LEN(plc->quoted));
-+ newbuffer += ZSTR_LEN(plc->quoted);
-+ } else {
-+ memcpy(newbuffer, plc->pos, plc->len);
-+ newbuffer += plc->len;
-+ }
-+ ptr = plc->pos + plc->len;
-+
-+ plc = plc->next;
-+ } while (plc);
-+
-+ t = ZSTR_VAL(inquery) + ZSTR_LEN(inquery) - ptr;
-+ if (t) {
-+ memcpy(newbuffer, ptr, t);
-+ newbuffer += t;
-+ }
-+ *newbuffer = '\0';
-+ ZSTR_LEN(*outquery) = newbuffer - ZSTR_VAL(*outquery);
-+
-+ ret = 1;
-+ goto clean_up;
-+
-+ } else if (query_type == PDO_PLACEHOLDER_POSITIONAL) {
-+ /* rewrite ? to :pdoX */
-+ const char *tmpl = stmt->named_rewrite_template ? stmt->named_rewrite_template : ":pdo%d";
-+ int bind_no = 1;
-+
-+ newbuffer_len = ZSTR_LEN(inquery);
*** 1481 LINES SKIPPED ***