Re: Various errors in psqlodbc: SQLGetTypeInfo, SQLTables, bigint, and double vs float - Mailing list pgsql-odbc
From | Adrien de Croy |
---|---|
Subject | Re: Various errors in psqlodbc: SQLGetTypeInfo, SQLTables, bigint, and double vs float |
Date | |
Msg-id | 4CD24723.5020203@qbik.com Whole thread Raw |
In response to | Re: Various errors in psqlodbc: SQLGetTypeInfo, SQLTables, bigint, and double vs float (Hiroshi Inoue <inoue@tpf.co.jp>) |
Responses |
Access violation (0xC0000005) in PSQLODBC35W.DLL when calling SQLDescribeColW
|
List | pgsql-odbc |
Hi again apologies, I did some more research. Looks like SQL_FLOAT and SQL_DOUBLE are used for c double types, and SQL_REAL for c float type. very confusing, but that's not unusual for ODBC. So I've also managed to solve my bigint issue, by falling back to a signed __int64 instead of unsigned. I guess there's no plan to implement unsigned numeric types? Adrien On 3/11/2010 9:36 p.m., Hiroshi Inoue wrote: > Hi, > > (2010/11/03 12:22), Adrien de Croy wrote: >> >> Hi all, >> >> apologies if this is already in the bug tracker (I had a look but didn't >> find it). >> >> We recently did some work to get our product working with PostgreSQL 9.0 >> and the latest ODBC driver. Our code is written to (try to) be >> DBMS-agnostic. So it enumerates reported types, searches for matching >> types etc, and builds CREATE TABLE statements etc from what it finds. >> >> There were a couple of inconsistencies in data returned from the ODBC >> driver. >> >> 1. Data returned from SQLGetTypeInfo uses ODBC2 field names. >> >> The columns reported include >> >> "PRECISION" instead of "COLUMN_SIZE" >> "MONEY" instead of "FIXED_PREC_SCALE" >> "AUTO_INCREMENT" instead of "AUTO_UNIQUE_VALUE" >> >> 2. Data returned from SQLTables uses ODBC2 field names >> >> "TABLE_QUALIFIER" instead of "TABLE_CAT" >> "TABLE_OWNER" instead of "TABLE_SCHEM" >> >> These 2 issues aren't huge problems, since the ordinal column number >> stays the same. >> >> 3. Not all supported types returned by SQLGetTypeInfo >> >> Specifically the types SERIAL and BIGSERIAL are not reported. This means >> we needed to hard-code a hack so if the driver was PostgreSQL and we >> needed an AUTO_UNIQUE_VALUE counter, we used "SERIAL". It works, but if >> SQLGetTypeInfo returned these types, it wouldn't need the hack. >> >> 4. Oddness with bigint fields. >> >> bigint reported as precision of 19, instead of 20. This isn't big enough >> to store an unsigned __int64 > > Because int8 type in PostgreSQL is signed, the precision is 19. > >> 5. Oddness with double precision fields. >> >> We had to use double precision fields to store file size information, >> because bigint couldn't do an __int64 (not sure what actual C type this >> really maps to in reality). However when we get the field data back in a >> query, it is reported as type SQL_FLOAT, even though the DB structure in >> the PostgreSQL manager shows it as double precision. Obviously you don't >> want to truncate double to float, so is this just in the driver (some >> type switch case not supported?) > > SQL_FLOAT means double precision type. What means signle precision type > is SQL_REAL. > >> Once we worked around all these issues, it seems to be working great. >> I'm a bit concerned about losing precision with double vs float though. >> >> Regards >> >> Adrien > >
pgsql-odbc by date: