From 18298475db4d82203c2944b037eed391d0d59ee2 Mon Sep 17 00:00:00 2001 From: Lester Caine Date: Tue, 2 Jun 2026 12:40:50 +0100 Subject: Fix LOCALTIMESTAMP/CURRENT_TIMESTAMP schema default handling for Firebird 4+ CURRENT_TIMESTAMP returns TIMESTAMP WITH TIME ZONE in Firebird 4+, which PHP PDO cannot handle without a valid session timezone, causing SQLSTATE 22009. - adodb-firebird.inc.php: sysTimeStamp changed to LOCALTIMESTAMP so DEFTIMESTAMP generates a timezone-naive default (propagates to pdo_firebird via adodb-pdo.inc.php) - adodb-datadict.inc.php: extend space-padding escape hatch to D/T columns so SQL keywords can be passed through verbatim as DEFAULT values Co-Authored-By: Claude Sonnet 4.6 --- adodb-datadict.inc.php | 18 ++++++++++-------- drivers/adodb-firebird.inc.php | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/adodb-datadict.inc.php b/adodb-datadict.inc.php index 29f2120c..f04ddc82 100644 --- a/adodb-datadict.inc.php +++ b/adodb-datadict.inc.php @@ -828,14 +828,16 @@ class ADODB_DataDict { ( substr($fdefault,0,1) != "'" && !is_numeric($fdefault))) { if (($ty == 'D' || $ty == 'T') && strtolower($fdefault) != 'null') { - // convert default date into database-aware code - if ($ty == 'T') - { - $fdefault = $this->connection->dbTimeStamp($fdefault); - } - else - { - $fdefault = $this->connection->dbDate($fdefault); + // space-padded value = SQL keyword/expression, pass through verbatim + if (strlen($fdefault) > 1 && $fdefault[0] == ' ' && $fdefault[-1] == ' ') { + $fdefault = trim($fdefault); + } else { + // convert default date into database-aware code + if ($ty == 'T') { + $fdefault = $this->connection->dbTimeStamp($fdefault); + } else { + $fdefault = $this->connection->dbDate($fdefault); + } } } else diff --git a/drivers/adodb-firebird.inc.php b/drivers/adodb-firebird.inc.php index 52d751d8..57419fd7 100644 --- a/drivers/adodb-firebird.inc.php +++ b/drivers/adodb-firebird.inc.php @@ -53,7 +53,7 @@ class ADODB_firebird extends ADOConnection { var $hasGenID = true; var $_bindInputArray = true; var $sysDate = "cast('TODAY' as timestamp)"; - var $sysTimeStamp = "CURRENT_TIMESTAMP"; //"cast('NOW' as timestamp)"; + var $sysTimeStamp = "LOCALTIMESTAMP"; // CURRENT_TIMESTAMP returns TIMESTAMP WITH TIME ZONE in Firebird 4+, breaking PHP PDO var $ansiOuter = true; var $hasAffectedRows = true; var $poorAffectedRows = false; -- cgit v1.3