2 Replies Latest reply on Apr 11, 2013 3:22 PM by Laurenfoutz-Oracle

    Close join cursor cause BDB0059 assert failure in debug library

      I join 3 cursors in transaction mode. I manually start and and commit transaction in the database, but I need to set DB_AUTO_COMMIT flag when I open index (secondary) databases used in thees 3 cursors. If not, I can not join cursors because I got error "not transactional".

      I read join cursor, close opened join cursors with no errors.

      Then I close join cursor itself.

      In case of using debug library BDB 5.3.21 I got BDB0059 assert failure: ..\..\src\db\db_join.c/267: "((ip)->dbth_state == THREAD_ACTIVE || (ip)->dbth_state == THREAD_FAILCHK)"

      in the __db_join_close_pp(dbc).

      Release version of the BDB library do not assert.

      I checked join cursor just combines joined cursors using correct transaction, of course join cursor points to NULL transaction itself.


           if (r = mdbs->dbenvp->txn_begin(mdbs->dbenvp, NULL, &txn, 0))
                return r;
           // get join or ordinal cursor
           cursorp = getCatalogCursor(mdbs, txn, (DBC ***) &joincursors,

           // get records
           if (joincursor_count == 0) {
                if (search_criteria.id) {
                     LONG64 catid = *search_criteria.id;     // ordinal cursor
                     cflags = DB_SET;
                     key.data = &catid;
                     key.size = sizeof(LONG64);
                } else
                     cflags = DB_NEXT;     // join cursor
           } else
                cflags = 0;
                r = cursorp->get(cursorp, &key, &data, cflags);

           // close all cursors in join if exists
           close_joined_cursors(mdbs, (DBC***)&joincursors, &joincursor_count);
           // close join or ordinal cursor
           if (cursorp != NULL)
                cursorp->close(cursorp);     // ASSERTION in debug BDB
           r = txn->commit(txn, 0);
      What I doing wrong?