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
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 |