git: e000de2adb6a - main - lang/php85: Update version 8.5.0alpha4=>8.5.0beta1

From: Muhammad Moinur Rahman <bofh_at_FreeBSD.org>
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 = &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();
-+						}
-+
-+						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 = &param->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 ***