Re: An extra null row is returned if rowset size is a multiple - Mailing list pgsql-odbc

From Wayne Armstrong
Subject Re: An extra null row is returned if rowset size is a multiple
Date
Msg-id 200304181444.h3IEi7dv014928@mail.bacchus.com.au
Whole thread Raw
In response to An extra null row is returned if rowset size is a multiple of row cache size  ("Wayne Armstrong" <wdarmst@bacchus.com.au>)
List pgsql-odbc
** Reply to message from "Wayne Armstrong" <wdarmst@bacchus.com.au> on Fri, 18
Apr 2003 20:04:02 +1000
Hmm,
 Talking to myself again :)
 Ok the problem seems to be in qresult.c
 QR_next_tuple when it gets an end_of_tupple message from the backend - setups
a pointer to the first cached row and returns true if any rows hae been
retrieved for the query as a whole (rather than for this fetch)
The offending bit of code looks like:-
                               if (self->num_total_rows > 0)

                                {
                                        qlog("    [ fetched %d rows ]\n",
num_rows);
                                        mylog("_next_tuple: 'C' fetch_max &&
fcount = %d\n", self->num_total_rows);

                                        /* set to first row */
                                        self->tupleField =
self->backend_tuples+ (offset * self->num_fields);
                                        return TRUE;
                                }
                                else
                                {
I have changed that to look at if or not it retrieved any rows on this fetch
attempt and the problem goes away.

Regards,
Wayne

> Hi,
>  The odbc driver is returning an extra null filled row when the number of rows
> to be retrieved is a multiple of the row cache size set in the odbc driver. If
> this occurs when issuing a SQLColumns or SQLtables request, the driver will
> return an error trying to convert the null filled row into column or table row
> values.
>  In normal usage, my smalltalk based app, can abend because the final row
> returned has nulls in columns that cannot possibly be null.
>
>  I have had a look at the current cvs source, and cannot determine where the
> problem is (I am not a c progremmer - but can maintain c (with difficulty and
> under protest  :).)
>
> This is a serious problem for us which we are hitting fairly often and need to
> fix real soon. I am continuing to read the odbc driver code - but any pointers
> for what to try/where to look  would be real usefull.
>
>
> My odbc settings are :-
> Recognize unique indexes,
> Use Declare fetch
> Parse statements
> Unknown sizes - longest
> Text a long varchar
> unknown as long varchar
> bools as char
> cache size 25
> updateable cursors
> dissalow premature.
>
> Here is the bit of the odbc log where it goes wrong (I think).
> This is retrieving 50 rows with a cache size of 25.
>
> [848]next_tuple: fetch_count < fcount: returning tuple 24, fcount = 25
> [848]fetch: cols=6, lf=0, opts = 68763272, opts->bindings = 68751064, buffer[]
> = 1658672
> [848]type = 23
> [848]value = '0'
> [848]copy_and_convert: field_type = 23, fctype = 4, value = '0', cbValueMax=4
> [848]copy_and_convert: retval = 0
> [848]fetch: cols=6, lf=1, opts = 68763272, opts->bindings = 68751064, buffer[]
> = 1658680
> [848]type = 1043
> [848]value = 'WB-OST'
> [848]copy_and_convert: field_type = 1043, fctype = 1, value = 'WB-OST',
> cbValueMax=16
> [848]DEFAULT: len = 6, ptr = 'WB-OST'
> [848]    SQL_C_CHAR, default: len = 6, cbValueMax = 16, rgbValueBindRow =
> 'WB-OST'
> [848]copy_and_convert: retval = 0
> [848]fetch: cols=6, lf=2, opts = 68763272, opts->bindings = 68751064, buffer[]
> = 1658700
> [848]type = 1043
> [848]value = 'WHEEL'
> [848]copy_and_convert: field_type = 1043, fctype = 1, value = 'WHEEL',
> cbValueMax=16
> [848]DEFAULT: len = 5, ptr = 'WHEEL'
> [848]    SQL_C_CHAR, default: len = 5, cbValueMax = 16, rgbValueBindRow =
> 'WHEEL'
> [848]copy_and_convert: retval = 0
> [848]fetch: cols=6, lf=3, opts = 68763272, opts->bindings = 68751064, buffer[]
> = 1658720
> [848]type = 1043
> [848]value = 'Wheel Bearing Repack - O/S/T'
> [848]copy_and_convert: field_type = 1043, fctype = 1, value = 'Wheel Bearing
> Repack - O/S/T', cbValueMax=31
> [848]DEFAULT: len = 28, ptr = 'Wheel Bearing Repack - O/S/T'
> [848]    SQL_C_CHAR, default: len = 28, cbValueMax = 31, rgbValueBindRow =
> 'Wheel Bearing Repack - O/S/T'
> [848]copy_and_convert: retval = 0
> [848]fetch: cols=6, lf=4, opts = 68763272, opts->bindings = 68751064, buffer[]
> = 1658755
> [848]type = 1043
> [848]value = 'No'
> [848]copy_and_convert: field_type = 1043, fctype = 1, value = 'No',
> cbValueMax=11
> [848]DEFAULT: len = 2, ptr = 'No'
> [848]    SQL_C_CHAR, default: len = 2, cbValueMax = 11, rgbValueBindRow = 'No'
> [848]copy_and_convert: retval = 0
> [848]fetch: cols=6, lf=5, opts = 68763272, opts->bindings = 68751064, buffer[]
> = 1658770
> [848]type = 1043
> [848]value = 'Service'
> [848]copy_and_convert: field_type = 1043, fctype = 1, value = 'Service',
> cbValueMax=16
> [848]DEFAULT: len = 7, ptr = 'Service'
> [848]    SQL_C_CHAR, default: len = 7, cbValueMax = 16, rgbValueBindRow =
> 'Service'
> [848]copy_and_convert: retval = 0
> [848][SQLExtendedFetch][848]PGAPI_ExtendedFetch: stmt=68763192
> [848]SQL_FETCH_NEXT: num_tuples=50, currtuple=25
> [848]PGAPI_ExtendedFetch: new currTuple = 49
> [848]manual_result = 0, use_declarefetch = 1
> [848]clear obsolete 25 tuples
> [848]next_tuple: sending actual fetch (25) query 'fetch 25 in SQL_CUR04193E38'
> [848]send_query(): conn=18913808, query='fetch 25 in SQL_CUR04193E38'
> [848]send_query: done sending query
> [848]send_query: got id = 'Z'
> [848]read 175, global_socket_buffersize=4096
> [848]send_query: got id = 'P'
> [848]send_query: got id = 'T'
> [848]num_fields = 6
> [848]READING ATTTYPMOD
> [848]CI_read_fields: fieldname='company_id', adtid=23, adtsize=4, atttypmod=-1
> [848]READING ATTTYPMOD
> [848]CI_read_fields: fieldname='service_code', adtid=1043, adtsize=-1,
> atttypmod=15
> [848]READING ATTTYPMOD
> [848]CI_read_fields: fieldname='service_type_code', adtid=1043, adtsize=-1,
> atttypmod=15
> [848]READING ATTTYPMOD
> [848]CI_read_fields: fieldname='service_desc', adtid=1043, adtsize=-1,
> atttypmod=30
> [848]READING ATTTYPMOD
> [848]CI_read_fields: fieldname='print_jobcard', adtid=1043, adtsize=-1,
> atttypmod=10
> [848]READING ATTTYPMOD
> [848]CI_read_fields: fieldname='sheet_type_flag', adtid=1043, adtsize=-1,
> atttypmod=15
> [848]end of tuple list -- setting inUse to false: this = 18913232
> [848]_next_tuple: 'C' fetch_max && fcount = 50
> [848]fetch: cols=6, lf=0, opts = 68763272, opts->bindings = 68751064, buffer[]
> = 1658672
> [848]type = 23
> [848]value = '<NULL>'
> [848]copy_and_convert: field_type = 23, fctype = 4, value = '<NULL>',
> cbValueMax=4
> [848]copy_and_convert: retval = 0
> [848]fetch: cols=6, lf=1, opts = 68763272, opts->bindings = 68751064, buffer[]
> = 1658680
> [848]type = 1043
> [848]value = '<NULL>'
> [848]copy_and_convert: field_type = 1043, fctype = 1, value = '<NULL>',
> cbValueMax=16
> [848]copy_and_convert: retval = 0
> [848]fetch: cols=6, lf=2, opts = 68763272, opts->bindings = 68751064, buffer[]
> = 1658700
> [848]type = 1043
> [848]value = '<NULL>'
> [848]copy_and_convert: field_type = 1043, fctype = 1, value = '<NULL>',
> cbValueMax=16
> [848]copy_and_convert: retval = 0
> [848]fetch: cols=6, lf=3, opts = 68763272, opts->bindings = 68751064, buffer[]
> = 1658720
> [848]type = 1043
> [848]value = '<NULL>'
> [848]copy_and_convert: field_type = 1043, fctype = 1, value = '<NULL>',
> cbValueMax=31
> [848]copy_and_convert: retval = 0
> [848]fetch: cols=6, lf=4, opts = 68763272, opts->bindings = 68751064, buffer[]
> = 1658755
> [848]type = 1043
> [848]value = '<NULL>'
> [848]copy_and_convert: field_type = 1043, fctype = 1, value = '<NULL>',
> cbValueMax=11
> [848]copy_and_convert: retval = 0
> [848]fetch: cols=6, lf=5, opts = 68763272, opts->bindings = 68751064, buffer[]
> = 1658770
> [848]type = 1043
> [848]value = '<NULL>'
> [848]copy_and_convert: field_type = 1043, fctype = 1, value = '<NULL>',
> cbValueMax=16
> [848]copy_and_convert: retval = 0
> [848]manual_result = 0, use_declarefetch = 1
> [848]next_tuple: fcount < CACHE_SIZE: fcount = 0, fetch_count = 1
> [848]**** SC_fetch: end_tuples
> [848][SQLExtendedFetch][848]PGAPI_ExtendedFetch: stmt=68763192
> [848]SQL_FETCH_NEXT: num_tuples=50, currtuple=50
> [848][SQLFreeStmt][848]PGAPI_FreeStmt: entering...hstmt=68763192, fOption=0
>
>
>
> Regards,
> Wayne Armstrong
> Bacchus Management Systems
> http://www.bacchus.com.au
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 6: Have you searched our list archives?
>
> http://archives.postgresql.org


pgsql-odbc by date:

Previous
From: "Wayne Armstrong"
Date:
Subject: An extra null row is returned if rowset size is a multiple of row cache size
Next
From: "Priya G"
Date:
Subject: configure postgres not to write to /tmp dir