Edit report at https://bugs.php.net/bug.php?id=71422&edit=1
ID: 71422
Comment by: alvaro at demogracia dot com
Reported by: alvaro at demogracia dot com
Summary: Bogus ORA-01438: value larger than specified
precision allowed for this column
Status: Assigned
Type: Bug
Package: OCI8 related
Operating System: Windows 7
PHP Version: 5.6.17
Assigned To: sixd
Block user comment: N
Private report: N
New Comment:
I've just verified that it works fine up to PHP/5.6.15 (first affected version is 5.6.16) and
(as already mentioned) PHP/7.0.x is not affected. I'm using latest Oracle Instant Client
release (12.1.0.2.0). My stack is 32-bit.
If there's any specific test I can do please feel free to ask.
Previous Comments:
------------------------------------------------------------------------
[2016-02-09 04:34:25] sixd@php.net
This doesn't reproduce on OS X.
------------------------------------------------------------------------
[2016-01-28 09:47:17] alvaro at demogracia dot com
I've found more broken stuff. I'd say that using SQLT_INT is in general no longer
functional. Switching to SQLT_CHR is not a valid workaround for all situations since certain queries
may fail if they expect a number and receive a string.
CREATE TABLE TEST (
TEST_ID NUMBER(*,0) NOT NULL,
LABEL VARCHAR2(50 CHAR),
CONSTRAINT TEST_PK PRIMARY KEY (TEST_ID)
);
INSERT INTO TEST (TEST_ID, LABEL) VALUES (1, 'Foo');
COMMIT;
SELECT * FROM TEST WHERE TEST_ID=1;
<?php
$conn = oci_connect('test', 'test', '//hera.mina.s/xe');
// Query returns one row
$stmt = oci_parse($conn, 'SELECT LABEL AS RAW_QUERY FROM TEST WHERE TEST_ID=1');
oci_execute($stmt);
while ($row = oci_fetch_array($stmt, OCI_ASSOC+OCI_RETURN_NULLS)) {
var_dump($row);
}
// Bind parameters do not return results...
$stmt = oci_parse($conn, 'SELECT LABEL AS NUMERIC_BIND_PARAMETER FROM TEST WHERE
TEST_ID=:test_id');
$value = 1;
oci_bind_by_name($stmt, ':test_id', $value, -1, SQLT_INT);
oci_execute($stmt);
while ($row = oci_fetch_array($stmt, OCI_ASSOC+OCI_RETURN_NULLS)) {
var_dump($row);
}
// ... unless we stringify them
$stmt = oci_parse($conn, 'SELECT LABEL AS STRING_BIND_PARAMETER FROM TEST WHERE
TEST_ID=:test_id');
$value = 1;
oci_bind_by_name($stmt, ':test_id', $value, -1, SQLT_CHR);
oci_execute($stmt);
while ($row = oci_fetch_array($stmt, OCI_ASSOC+OCI_RETURN_NULLS)) {
var_dump($row);
}
------------------------------------------------------------------------
[2016-01-22 09:09:46] alvaro at demogracia dot com
Related?
Fix bug 68298 (PHP OCI8 OCI int overflow)
https://github.com/php/php-src/commit/3060dfd92e0126e92b1501dba807bfcd44bef53a
------------------------------------------------------------------------
[2016-01-21 11:41:54] alvaro at demogracia dot com
PHP/7 branches are apparently not affected by this regression.
------------------------------------------------------------------------
[2016-01-20 16:46:15] alvaro at demogracia dot com
Description:
------------
After upgrading from PHP/5.6.10 to 5.6.17 it's no longer possible to insert
3 (int) in a NUMBER(1,0) column because now it triggers:
ORA-01438: value larger than specified precision allowed for this column
Test script:
---------------
CREATE TABLE TEST (
FORMATO_IMPORTACION_ID NUMBER(1,0) DEFAULT 1 NOT NULL
);
<?php
$value = 3;
$conn = oci_connect('test', 'test', '//example.com/xe');
$stmt = oci_parse($conn, 'INSERT INTO TEST (FORMATO_IMPORTACION_ID) VALUES
(:formato_importacion_id)');
oci_bind_by_name($stmt, ':formato_importacion_id', $value, -1, SQLT_INT);
oci_execute($stmt);
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=71422&edit=1