Query STARTING WITH :Param returns inconsistent result depending upon ORDER BY 
clause
-------------------------------------------------------------------------------------

                 Key: CORE-3452
                 URL: http://tracker.firebirdsql.org/browse/CORE-3452
             Project: Firebird Core
          Issue Type: Bug
          Components: Engine
    Affects Versions: 2.1.4, 2.5.0, 1.5.6, 2.1.3, 2.1.2
         Environment: Using IB Objects on a Win XP machine, thus 32 bit. 
            Reporter: Jason Wharton


I have a query that is shown in the SQL trace below that has an inconsistent 
behavior depending upon what the sort order of the query is.
The problem seems to have to do with the STARTING WITH clause when used with an 
input parameter. When the input is a blank string sometimes you get no records 
and other times you get all records (that aren't null). This material can be 
easily examined via IB Objects because this is one of the sample applications 
that comes with the product. I'd be happy to furnish a copy of it for testing 
purposes to anyone working on this issue. 

Here are the tables I'm working with:

CREATE TABLE DESCRIPTION (
  ID                     INTEGER                NOT NULL
, DBID                   INTEGER DEFAULT 1      NOT NULL
, DESCRIPTION            VARCHAR( 50 )          NOT NULL
, C_CODE                 VARCHAR( 8 ) DEFAULT ''   NOT NULL
, C_DESC                 VARCHAR( 50 ) DEFAULT ''   NOT NULL
, CONSTRAINT PK_DESCRIPTION
    PRIMARY KEY ( ID )
)

CREATE TABLE ITEM (
  ID                     INTEGER                NOT NULL
, DBID                   INTEGER DEFAULT 1      NOT NULL
, ASSETNO                VARCHAR( 20 ) DEFAULT NULL
, SCANCODE               VARCHAR( 20 ) DEFAULT '+'   NOT NULL
, SERIALNO               VARCHAR( 20 ) DEFAULT NULL
, C_HOSTSCAN             VARCHAR( 20 ) DEFAULT NULL
, ID_DESCRIPTION         INTEGER DEFAULT 1      NOT NULL
, CONSTRAINT PK_ITEM
    PRIMARY KEY ( DBID, ID )
)

ALTER TABLE ITEM
  ADD CONSTRAINT RI_ITEM_DESCRIPTION
        FOREIGN KEY ( ID_DESCRIPTION ) 
        REFERENCES DESCRIPTION ( ID )


Here is the base statement that returned results:

SELECT ITEM.ID, ITEM.DBID
FROM ITEM, DESCRIPTION
WHERE DESCRIPTION.ID=ITEM.ID_DESCRIPTION
  AND ITEM.DBID = ? /* P_DBID */ 
  AND ITEM.ASSETNO STARTING WITH ? /* P_SEARCH */ 
  AND ( ITEM.C_HOSTSCAN >= ? /* OLNK_C_HOSTSCAN */  )
ORDER BY ITEM.C_HOSTSCAN ASC
PLAN SORT (JOIN (ITEM INDEX (IX_ITEM_C_HOSTSCAN), DESCRIPTION INDEX 
(PK_DESCRIPTION)))

Here are examples of a query that didn't return results:

SELECT ITEM.ID, ITEM.DBID
FROM ITEM, DESCRIPTION
WHERE DESCRIPTION.ID=ITEM.ID_DESCRIPTION
  AND ITEM.DBID = ? /* P_DBID */ 
  AND ITEM.ASSETNO STARTING WITH ? /* P_SEARCH */ 
  AND ( ITEM.SCANCODE >= ? /* OLNK_SCANCODE */  )
ORDER BY ITEM.SCANCODE ASC
PLAN SORT (JOIN (ITEM INDEX (IX_ITEM_ASSETNO), DESCRIPTION INDEX 
(PK_DESCRIPTION)))

SELECT ITEM.ID, ITEM.DBID
FROM ITEM, DESCRIPTION
WHERE DESCRIPTION.ID=ITEM.ID_DESCRIPTION
  AND ITEM.DBID = ? /* P_DBID */ 
  AND ITEM.ASSETNO STARTING WITH ? /* P_SEARCH */ 
  AND ( DESCRIPTION.DESCRIPTION >= ? /* OLNK_DESCRIPTION */  )
ORDER BY DESCRIPTION.C_CODE ASC
PLAN SORT (JOIN (ITEM INDEX (IX_ITEM_ASSETNO), DESCRIPTION INDEX 
(PK_DESCRIPTION)))

SELECT ITEM.ID, ITEM.DBID
FROM ITEM, DESCRIPTION
WHERE DESCRIPTION.ID=ITEM.ID_DESCRIPTION
  AND ITEM.DBID = ? /* P_DBID */ 
  AND ITEM.ASSETNO STARTING WITH ? /* P_SEARCH */ 
  AND ( DESCRIPTION.C_CODE >= ? /* OLNK_C_CODE */  )
ORDER BY DESCRIPTION.C_DESC ASC
PLAN SORT (JOIN (ITEM INDEX (IX_ITEM_ASSETNO), DESCRIPTION INDEX 
(PK_DESCRIPTION)))


Here is a little more detail showing the trace results.

----------------------------------------------------------
This query has a blank string for the parameter and it returns no records.
----------------------------------------------------------

/*---
PREPARE STATEMENT
TR_HANDLE = 4
STMT_HANDLE = 2

SELECT ITEM.ID, ITEM.DBID
FROM ITEM, DESCRIPTION
WHERE DESCRIPTION.ID=ITEM.ID_DESCRIPTION
AND ITEM.DBID = ? /* P_DBID */
AND ITEM.ASSETNO STARTING WITH ? /* P_SEARCH */ AND ( DESCRIPTION.DESCRIPTION 
>= ? /* OLNK_DESCRIPTION */ ) ORDER BY DESCRIPTION.C_CODE ASC

PLAN SORT (JOIN (ITEM INDEX (IX_ITEM_ASSETNO), DESCRIPTION INDEX
(PK_DESCRIPTION)))

FIELDS = [ Version 1 SQLd 2 SQLn 30
ITEM.ID = <NIL>
ITEM.DBID = <NIL> ]
----*/
/*---
DESCRIBE INPUT
STMT_HANDLE = 2
PARAMS = [ Version 1 SQLd 3 SQLn 3
< SQLType: 496 SQLLen: 4 > = <NIL>
< SQLType: 449 SQLLen: 20 > = <NIL>
< SQLType: 448 SQLLen: 50 > = <NIL> ]
----*/
/*---
EXECUTE STATEMENT
TR_HANDLE = 4
STMT_HANDLE = 2
PARAMS = [ Version 1 SQLd 3 SQLn 3
[P_DBID] = 1
[P_SEARCH] = ''
[OLNK_DESCRIPTION] = '' ]
----*/
/*---
OPEN CURSOR
STMT_HANDLE = 2
NAME = C1218089689013596

----*/
/*---
FETCH
STMT_HANDLE = 2
FIELDS = [ Version 1 SQLd 2 SQLn 2
ITEM.ID = 0
ITEM.DBID = 0 ]

ERRCODE = 100
----*/
/*---
CLOSE CURSOR
STMT_HANDLE = 2
----*/

----------------------------------------------------------
This query has a blank string for the parameter, but it returned records.
----------------------------------------------------------

/*---
PREPARE STATEMENT
TR_HANDLE = 4
STMT_HANDLE = 2

SELECT ITEM.ID, ITEM.DBID
FROM ITEM, DESCRIPTION
WHERE DESCRIPTION.ID=ITEM.ID_DESCRIPTION
AND ITEM.DBID = ? /* P_DBID */
AND ITEM.ASSETNO STARTING WITH ? /* P_SEARCH */ AND ( ITEM.ASSETNO >= ? /* 
OLNK_ASSETNO */ ) ORDER BY ITEM.ASSETNO ASC

PLAN SORT (JOIN (ITEM INDEX (IX_ITEM_ASSETNO), DESCRIPTION INDEX
(PK_DESCRIPTION)))

FIELDS = [ Version 1 SQLd 2 SQLn 30
ITEM.ID = <NIL>
ITEM.DBID = <NIL> ]
----*/
/*---
DESCRIBE INPUT
STMT_HANDLE = 2
PARAMS = [ Version 1 SQLd 3 SQLn 3
< SQLType: 496 SQLLen: 4 > = <NIL>
< SQLType: 449 SQLLen: 20 > = <NIL>
< SQLType: 449 SQLLen: 20 > = <NIL> ]
----*/
/*---
EXECUTE STATEMENT
TR_HANDLE = 4
STMT_HANDLE = 2
PARAMS = [ Version 1 SQLd 3 SQLn 3
[P_DBID] = 1
[P_SEARCH] = ''
[OLNK_ASSETNO] = '' ]

SECONDS = 0.016
----*/
/*---
OPEN CURSOR
STMT_HANDLE = 2
NAME = C1218089689013596

----*/
/*---
FETCH
STMT_HANDLE = 2
FIELDS = [ Version 1 SQLd 2 SQLn 2
ITEM.ID = 1001
ITEM.DBID = 1 ]
----*/

000000000000 Lots of fetches removed 00000000000000

/*---
FETCH
STMT_HANDLE = 2
FIELDS = [ Version 1 SQLd 2 SQLn 2
ITEM.ID = 1001
ITEM.DBID = 1 ]

ERRCODE = 100
----*/
/*---
CLOSE CURSOR
STMT_HANDLE = 2
----*/



-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

------------------------------------------------------------------------------
WhatsUp Gold - Download Free Network Management Software
The most intuitive, comprehensive, and cost-effective network 
management toolset available today.  Delivers lowest initial 
acquisition cost and overall TCO of any competing solution.
http://p.sf.net/sfu/whatsupgold-sd
Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to