Bug #71422 [Com]: Bogus ORA-01438: value larger than specified precision allowed for this column

From: Date: Thu, 28 Jan 2016 09:47:24 +0000
Subject: Bug #71422 [Com]: Bogus ORA-01438: value larger than specified precision allowed for this column
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-198939@lists.php.net to get a copy of this message
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:             Open
 Type:               Bug
 Package:            OCI8 related
 Operating System:   Windows 7
 PHP Version:        5.6.17
 Block user comment: N
 Private report:     N

 New Comment:

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);
}


Previous Comments:
------------------------------------------------------------------------
[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


Thread (10 messages)

« previous php.bugs (#198939) next »