Our applications heavy rely on metadata. Unfortunately,
we encountered a problem with numeric datatypes.
For an Oracle NUMBER, the following statement handle
attributes are returned:
TYPE 3 (NUMBER)
PRECISION 38
SCALE 0
The same attributes are returned for NUMBER( 38, 0 ).
We found the relevant code in oci8.c, line 707:
case 2: /* NUMBER */
if (!fbh->prec) /* is 0 for FLOATing point */
fbh->prec = 38; /* max prec */
fbh->disize = 130+3; /* worst case! 1**-130 */
avg_width = 4; /* > approx +/- 1_000_000 ? */
break;
and in oci7.c, line 243:
else if (fbh->dbtype == 2 && fbh->prec == 0) {
fbh->prec = 38;
}
The question is: What should be returned for a NUMBER?
We collected some alternatives:
# TYPE PREC SCALE Remarks
- ---- ----- -----
------------------------------------------------------
1 3 38 0 the current solution, ambiguous!
2 3 0 0 the Oracle way
3 3 38 undef better, but possible confusion with NUMBER(38)
4 6 126 undef FLOAT, binary precision
5 6 undef undef FLOAT, default prec. is 126 binary in Oracle
6 8 126 undef DOUBLE PRECISION, binary precision
7 8 undef undef DOUBLE PRECISION, prec. is always 126 binary in
Oracle
Our favourite solution is #6, if the driver should reflect the standard.
However, if the driver should support vendor specific peculiarities,
#2 is the way to go.
We expect, that the patches are simple. However, we don't know
how to provide the 'undef'. Is
fbh->scale = PL_sv_undef;
the correct way?
BTW: Cases 4 and 5 (FLOAT) show, that the type_info LoL is incomplete.
Also note, that type_info defines a COLUMN_SIZE of 15 for DOUBLE.
Steffen Göldner
Olga Voronova