Bob Rossi
Wed, 21 May 2008 07:48:21 -0700
On Wed, May 21, 2008 at 10:13:41AM -0400, Bob Rossi wrote: > On Mon, May 19, 2008 at 09:32:07PM -0400, Bob Rossi wrote: > > On Mon, May 19, 2008 at 08:58:32AM +1000, Bojan Smojver wrote: > > > On Sat, 2008-05-17 at 09:07 -0400, Bob Rossi wrote: > > > > > > > I've been using sqlite3 dbd for some time now. I find that the function > > > > apr_dbd_get_row, > > > > > > > > http://apr.apache.org/docs/apr-util/trunk/group___a_p_r___util___d_b_d.html#gd4cdc5f4e8981b93f5a467a8c8a768f1 > > > > is 1 based. That is, 1 is the first row returned from a query. However, > > > > I just started using postgresql, and I find that apr_dbd_get_row is 0 > > > > based. That is, 0 is the first row returned from the query. > > > > > > This should now be fixed in both the trunk and 1.3.x branch. > > > > > > We really _do_ appreciate your testing and suggestions! > > > > I can confirm that the latest 1.3.x snapshot on linux, for both sqlite3 > > and postgresql use a 1 based row index. I removed my hack, and things > > work great. I'm going to test windows now, could take some time. > > (perhaps get results tomorrow). > > OK, I have confirmed 1 bug. If you pass '0' to apr_dbd_get_row, with > postgresql as the driver, the function returns 0, instead of -1 as it > should. My unit tests happen to test the cases that should fail, that's > how I caught this. With a little more research, I noticed that this is simply an if on an uninitialized variable. 230| if (row == NULL) { 231| row = apr_palloc(pool, sizeof(apr_dbd_row_t)); 232| *rowp = row; 233| row->res = res; 234| if ( sequential ) { 235| row->n = 0; 236| } 237| else { 238| if (rownum > 0) { 239| row->n = --rownum; 240| } 241| } 242| } 243| else { 244| if ( sequential ) { 245| ++row->n; 246| } 247| else { 248| if (rownum > 0) { 249| row->n = --rownum; 250| } 251| } 252| } 253| 254+---> if (res->random) { 255| if (row->n >= res->ntuples) { 256| *rowp = NULL; 257| apr_pool_cleanup_run(pool, res->res, clear_result); 258| res->res = NULL; 259| return -1; 260| } 261| } The execution is, 230, 231, 232, 233, 234, 238, 254, 255. On line, 255 row->n is checked, however, it was never initialized. Hope this helps. Bob Rossi