php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #41917 oci_field_scale returns expected value multiplied by 256
Submitted: 2007-07-06 18:40 UTC Modified: 2007-09-07 15:06 UTC
From: nobleclem+phpbugs at gmail dot com Assigned: tony2001 (profile)
Status: Closed Package: OCI8 related
PHP Version: 5.2.3 OS: Solaris
Private report: No CVE-ID: None
View Add Comment Developer Edit
Anyone can comment on a bug. Have a simpler test case? Does it work for you on a different platform? Let us know!
Just going to say 'Me too!'? Don't clutter the database with that please !
Your email address:
MUST BE VALID
Solve the problem:
19 + 35 = ?
Subscribe to this entry?

 
 [2007-07-06 18:40 UTC] nobleclem+phpbugs at gmail dot com
Description:
------------
When using oci_field_scale to obtain the value stored in all_tab_columns.data_scale in oracle for a field the value returned is that in all_tab_columns.data_scale multiplied by 256.

Reproduce code:
---------------
Assumptions:
- field #2 is of type NUMBER(12,2)
- all_tab_columns.data_precision is 12
- all_tab_columns.data_scale value is 2

Code:
$conn = oci_connect('username', 'password');
$stmt = oci_parse($conn, "SELECT * FROM fees");
oci_execute($stmt);
$field_number = 2;

$scale = oci_field_scale( $stmt, $field_number );

Expected result:
----------------
$scale should be assigned the value of 2.

Actual result:
--------------
$scale is assigned the value of 512.

Patches

Add a Patch

Pull Requests

Add a Pull Request

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2007-07-06 18:53 UTC] tony2001@php.net
PHP/OCI8 returns exactly what it got from OCIAttrGet(.., OCI_DTYPE_PARAM, .., .., OCI_ATTR_SCALE, ).
If Oracle Client returns wrong information, we can't change or fix that.
 [2007-07-06 22:12 UTC] sixd@php.net
Although I can't reproduce the given testcase on Linux there is a bug here that stops other testcases working for me, and may cause a port specific difference in behavior for nobleclem's testcase.

The datatypes of the scale and precision fields in php_oci_out_column (php_oci8_int.h) should be sb1 and s2 respectively. At the moment they are both ub2.  This, for example, prevents the scale for a FLOAT column being displayed as -127.  

See table 6.8 in Oracle's OCI manual: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14250/oci06des.htm#sthref949

@nobleclem, the scale and precision values returned by the OCI8 extension and Oracle's OCI library are the programmatic definitions of scale and precision, which are different to the user-level values given in the all_tab_columns table.

@tony2001, I will commit a new testcase to PHP5 and 6, but will let you evaluate and merge the datatype fix.
 [2007-07-06 23:35 UTC] sixd@php.net
A new test has been merged and old tests updated.  They will cause diffs until Tony merges the code change.

The suggested fix is:
--- php_oci8_int.h	29 Mar 2007 02:33:03 -0700	1.11.2.6.2.18
+++ php_oci8_int.h	06 Jul 2007 15:53:44 -0700	
@@ -215,8 +215,8 @@
 	php_oci_define *define;			/* define handle */
 	int piecewise;					/* column is fetched piece-by-piece */
 	ub4 cb_retlen;					/* */
-	ub2 scale;						/* column scale */
-	ub2 precision;					/* column precision */
+	sb1 scale;						/* column scale */
+	sb2 precision;					/* column precision */
 	ub1 charset_form;				/* charset form, required for NCLOBs */
 	ub2 charset_id;					/* charset ID */
 } php_oci_out_column; /* }}} */

 [2007-07-09 19:02 UTC] tony2001@php.net
This bug has been fixed in CVS.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.


 [2007-09-07 15:05 UTC] nobleclem+phpbugs at gmail dot com
Tested 5.2.4 and the ub# to sb# has resolved the problem and oci_field_precision() is not returning the correct value.

Thank You for your hard work!
 [2007-09-07 15:06 UTC] nobleclem+phpbugs at gmail dot com
Typo in previous comment it should read:

Tested 5.2.4 and the ub# to sb# has resolved the problem and
oci_field_precision() is NOW returning the correct value.

Thank You for your hard work!
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Mar 28 18:01:29 2024 UTC