[PECL-CVS] [pecl-database-pdo_oci] boolean_support: Initial commit

[email protected] (Sharad Chandran R) Thu, 8 Jan 2026 22:09:18 +0000
Newsgroups php.pecl.cvs
Message-ID <[email protected]>
Author: Sharad Chandran R (sharadraju)
Date: 2026-01-09T03:08:07+05:30

Commit: https://github.com/php/pecl-database-pdo_oci/commit/e3d50c70a2cefcc9235e2dec54eb79a4c9a9a35a
Raw diff: https://github.com/php/pecl-database-pdo_oci/commit/e3d50c70a2cefcc9235e2dec54eb79a4c9a9a35a.diff

Initial commit

Changed paths:
  A  tests/pdo_oci_insert_boolean.phpt
  M  oci_statement.c


Diff:

diff --git a/oci_statement.c b/oci_statement.c
index 5f8f062..2ff1b6a 100644
--- a/oci_statement.c
+++ b/oci_statement.c
@@ -581,6 +581,11 @@ static int oci_stmt_describe(pdo_stmt_t *stmt, int colno) /* {{{ */
 			dyn = TRUE;
 			break;
 
+		case SQLT_BOL:
+			S->cols[colno].datalen = 1;
+			S->cols[colno].data = emalloc(S->cols[colno].datalen + 1);
+			break;
+
 		case SQLT_BIN:
 		default:
 			if (dtype == SQLT_DAT || dtype == SQLT_NUM || dtype == SQLT_RDD
@@ -795,6 +800,11 @@ static int oci_stmt_get_col(pdo_stmt_t *stmt, int colno, zval *result, enum pdo_
 	} else if (C->indicator == 0) {
 		/* it was stored perfectly */
 
+		if (C->dtype == SQLT_BOL) {
+			ZVAL_BOOL(result, strlen(C->data));
+			return 1;
+		}
+
 		if (C->dtype == SQLT_BLOB || C->dtype == SQLT_CLOB) {
 			if (C->data) {
 				php_stream *stream = oci_create_lob_stream(stmt, (OCILobLocator*)C->data);
@@ -970,6 +980,10 @@ static int oci_stmt_col_meta(pdo_stmt_t *stmt, zend_long colno, zval *return_val
 			add_assoc_string(return_value, "oci:decl_type", "BINARY_DOUBLE");
 			add_assoc_string(return_value, "native_type", "BINARY_DOUBLE");
 			break;
+		case SQLT_BOL:
+			add_assoc_string(return_value, "oci:decl_type", "BOOLEAN");
+			add_assoc_string(return_value, "native_type", "BOOLEAN");
+			break;
 		default:
 			add_assoc_long(return_value, "oci:decl_type", dtype);
 			add_assoc_string(return_value, "native_type", "UNKNOWN");
@@ -981,6 +995,9 @@ static int oci_stmt_col_meta(pdo_stmt_t *stmt, zend_long colno, zval *return_val
 	}
 
 	switch (dtype) {
+		case SQLT_BOL:
+			add_assoc_long(return_value, "pdo_type", PDO_PARAM_BOOL);
+			break;
 		case SQLT_BLOB:
 		case SQLT_CLOB:
 			add_assoc_long(return_value, "pdo_type", PDO_PARAM_LOB);
@@ -1002,6 +1019,9 @@ static int oci_stmt_col_meta(pdo_stmt_t *stmt, zend_long colno, zval *return_val
 
 	/* PDO type */
 	switch (dtype) {
+		case SQLT_BOL:
+			add_assoc_long(return_value, "pdo_type", PDO_PARAM_BOOL);
+			break;
 		case SQLT_BFILE:
 		case SQLT_BLOB:
 		case SQLT_CLOB:
diff --git a/tests/pdo_oci_insert_boolean.phpt b/tests/pdo_oci_insert_boolean.phpt
new file mode 100644
index 0000000..8c7187b
--- /dev/null
+++ b/tests/pdo_oci_insert_boolean.phpt
@@ -0,0 +1,70 @@
+--TEST--
+PDO_OCI: Insert BOOLEAN values into BOOLEAN column (Oracle 23ai+)
+--EXTENSIONS--
+pdo
+pdo_oci
+--SKIPIF--
+<?php
+require(getenv('PDO_TEST_DIR').'/pdo_test.inc');
+$db = PDOTest::factory();
+
+$version = $db->getAttribute(PDO::ATTR_SERVER_VERSION);
+preg_match('/^(\d+)\./', $version, $matches);
+$majorVersion = (int)$matches[1];
+if ($majorVersion < 23) {
+    die('skip BOOLEAN type supported from Oracle Database 23ai');
+}
+
+PDOTest::skip();
+?>
+--FILE--
+<?php
+
+require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
+$db = PDOTest::factory();
+
+// Create table
+$db->exec("CREATE TABLE IF NOT EXISTS test_bool (id NUMBER, bool_val BOOLEAN)");
+
+// Insert true
+$stmt = $db->prepare("INSERT INTO test_bool (id, bool_val) VALUES (1, :val)");
+$val = true;
+$stmt->bindParam(':val', $val, PDO::PARAM_BOOL);
+$stmt->execute();
+
+// Insert false
+$stmt = $db->prepare("INSERT INTO test_bool (id, bool_val) VALUES (2, :val)");
+$val = false;
+$stmt->bindParam(':val', $val, PDO::PARAM_BOOL);
+$stmt->execute();
+
+// Fetch and dump
+$stmt = $db->query("SELECT id, bool_val FROM test_bool ORDER BY id");
+var_dump($stmt->fetchAll(PDO::FETCH_ASSOC));
+?>
+--CLEAN--
+<?php
+
+require_once(getenv('PDO_TEST_DIR').'/pdo_test.inc');
+$db = PDOTest::factory();
+
+$db->exec("DROP TABLE test_bool PURGE");
+
+?>
+--EXPECT--
+array(2) {
+  [0]=>
+  array(2) {
+    ["id"]=>
+    string(1) "1"
+    ["bool_val"]=>
+    string(1) "1"
+  }
+  [1]=>
+  array(2) {
+    ["id"]=>
+    string(1) "2"
+    ["bool_val"]=>
+    string(1) "0"
+  }
+}