[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"
+ }
+}