Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-odbc by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group