On 14/08/12 19:05, Jeff Tate wrote:
I am trying to build a private perl with ODBC connection to a
Teradata database on SUSE-Linux. Perl build with no errors, DBI
installed clean, DBD::ODBC compiles seemingly cleanly, but fails
almost all the tests. So, help will be gratefully accepted.

The attached shows:

·Relevant environment

Out of interest, why did you choose to use the ODBC driver manager in 
/opt//teradata/client/ODBC_64 instead of unixODBC installed from a suse package?

·Results of ODBC adhoc connect test

oSuccessful

oDeliberately not successful, as it shows driver identification tags

·cpan results

oget

omake

otest

I installed CPAN::Reporter, so I expect (though am not sure as this
is new to me) that reports have been posted.

Thanx in advance for any and all insights (per the admonition, I
looked for a README.linux to review, but there wasn’t one)

Jeff Tate

So running make test results in a segfault. You have a 64 bit machine and from 
the names of the dirs where teradata is installed I'm guessing it too is 64 bit 
shared objects. However, there is nothing in the c compilation which sets the 
size of SQLLEN and SQLULEN which are /usually/ 64 bits on 64 bit linux and 32 
bits on 32 bit linux. If DBD::ODBC was built with 32 bit SQLLEN/SQLULEN and 
teradata and the driver manager were built with 64 bit SQLLEN/SQLULEN I can 
well imagine it would end up seg faulting - this is my guess.

Does the /opt/teradata tree contain an odbcinst binary? If it does run 
/path/odbcinst -j and post the output. If it does not, compile and run the 
following C code and post the output:

put the following in x.c file:

#include <stdio.h>
#include <sql.h>

main() {
    printf("size of SQLLEN is %d\n", sizeof(SQLLEN));
}

compile with:

cc -I/opt/teradata/client/ODBC_64/include x.c

run with ./a.out

What does it output?

The background is that MS changed the ODBC spec when they released 64 bit 
windows and changed some ODBC APIs to use SQLLEN/SQLULEN when before they used 
SQLINTEGER/SQLUINTEGER. The former are 32/64 bit depending on architecture and 
the later are always 32 bit. Before they did this 64 bit Unix existed for ages 
and stuck to the existing API which was using SQLINTEGERs. This led to 
confusion and situations like I expect you've hit.

Basically, DBD::ODBC needs to know the size of SQLLEN and it normally does this 
by running:

odbc_config --cflags
-DHAVE_UNISTD_H -DHAVE_PWD_H -DHAVE_SYS_TYPES_H -DHAVE_LONG_LONG 
-DSIZEOF_LONG_INT=4 -I/home/martin/unixODBC-2.3.1/include

and adding those flags to the cc line (note the above came from a 32bit 
machine). However, I cannot know you are really using unixODBC as I've no idea 
what came with teradata in those dirs.

Martin
--
Martin J. Evans
Easysoft Limited
http://www.easysoft.com

Reply via email to