Re: SQLBulkOperations Segfault - Mailing list pgsql-odbc

From Hiroshi Inoue
Subject Re: SQLBulkOperations Segfault
Date
Msg-id 480AB639.2020502@tpf.co.jp
Whole thread Raw
In response to SQLBulkOperations Segfault  (Jeremy Faith <jfaith@cemsys.com>)
Responses Re: SQLBulkOperations Segfault  (Jeremy Faith <jfaith@cemsys.com>)
List pgsql-odbc
Jeremy Faith wrote:
> Hi,
>
> I have been experimenting with SQLBulkOperations to see if it is faster
> at inserting rows than using individual insert statements.
> But when I run the attached(bo.c) example program it segfaults(note,
> this program works correctly with an Oracle ODBC connection).
>
> The program requires the following table.
>  create table customer
>  (
>    cust_num integer not null,
>    first_name char(20),
>    last_name char(20)
>  );
>
> Also the odb_db_open function call uses a hard coded DSN=pg_cdc_w,
> username=username and password=password.
>
> I am using the latest versions of pgsql+postgres on Linux i.e.
>  psqlodbc-08.03.0100
>  postgresql-8.3.1
>
> I turned on the ODBC debug log and added some log output to the driver
> and found that the segfault is occurring in the results.c:SC_pos_add
> function.
>
> In particular the log shows
>  POS ADD fi=(nil) ti=(nil)
>
> and the segfault occurs on this line:-
>                        if (*used != SQL_IGNORE && fi[i]->updatable)
> So fi is NULL but is being referenced.
>
> I did a bit more checking and found that parse_statement sets up
> stmt->ird->irdopts.fi i.e.
>        if (SC_update_not_ready(stmt))
>                parse_statement(s.stmt, TRUE);  /* not preferable */
> so adding
>  fi=stmt->ird->irdopts.fi;
> after parse_statement gets past this segfault.
>
> But then another segfault occurs in the results.c:positioned_load
> function as stmt->load_stmt is NULL
>  so strlen(stmt->load_stmt) segfaults.
>
> The code is complicated and I have not been able to determine how to fix
> this, it seems likely to me that even the fi fix may be covering up an
> earlier problem somewhere else in the code.

Before calling SQLExecDirect(), please set the SQL_ATTR_CURSOR_TYPE
to SQL_CURSOR_STATIC or SQL_CURSOR_KEYSET_DRIVER and also set the
SQL_ATTR_CONCURRENCY to SQL_CONCUR_ROWVER.

regards,
Hiroshi Inoue

pgsql-odbc by date:

Previous
From: "Jeff Crumbley"
Date:
Subject: 32-bit ODBC Linked Server from 64 bit SQL Server
Next
From: Jeremy Faith
Date:
Subject: Re: SQLBulkOperations Segfault