Re: SQLBulkOperations Segfault

From: Hiroshi Inoue <inoue(at)tpf(dot)co(dot)jp>
To: Jeremy Faith <jfaith(at)cemsys(dot)com>
Cc: pgsql-odbc(at)postgresql(dot)org
Subject: Re: SQLBulkOperations Segfault
Date: 2008-04-20 03:19:21
Message-ID: 480AB639.2020502@tpf.co.jp
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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

In response to

Responses

Browse pgsql-odbc by date

  From Date Subject
Next Message Jeremy Faith 2008-04-21 10:19:16 Re: SQLBulkOperations Segfault
Previous Message Jeff Crumbley 2008-04-18 20:15:31 32-bit ODBC Linked Server from 64 bit SQL Server