prepared statement with subselect with union does not use indices
------------------------------------------------------------------
Key: CORE-5163
URL: http://tracker.firebirdsql.org/browse/CORE-5163
Project: Firebird Core
Issue Type: Bug
Reporter: Reginald Poyau
steps to reproduce:
-- create two tables:
------------------
CREATE TABLE test1 (id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(20));
CREATE TABLE test2 (id INTEGER NOT NULL PRIMARY KEY, name VARCHAR(20));
-- add some indices
----
create index test1_idx ON test1(name);
create index test2_idx ON test2(name);
-- data
insert into test1(id, name) values(1, 'foo');
insert into test1(id, name) values(3, 'food');
insert into test2(id, name) values(2, 'bar');
insert into test2(id, name) values(4, 'barking');
execute following queries using python fdb
*firebird trace configuration trace.conf:
<database /var/db/test.gdb>
enabled true
include_filter %(INSERT|UPDATE|DELETE|SELECT)%
log_statement_finish true
log_procedure_finish true
log_trigger_finish true
print_plan true
print_perf true
time_threshold 0
</database>
run:
fbtracemgr -se service_mgr -user sysdba -password test -start -name "My trace"
-config trace.conf
using python
>>> import fdb
>>> password = 'test'
>>> dsn = 'localhost:/tmp/test.fdb'
>>> user='sysdba'
>>> con = fdb.connect(dsn=dsn, user=user, password=password)
>>> cr = con.cursor()
>>> q1 = """
SELECT t.id, t.name
FROM (
SELECT id, name FROM test1 WHERE name LIKE 'f%'
UNION
SELECT id, name FROM test2 WHERE name LIKE 'b%') AS t
"""
>>> cr.execute(q1).fetchall()
[(1, 'foo'), (2, 'bar'), (3, 'food'), (4, 'barking')]
>>> q2 = """
SELECT t.id, t.name
FROM (
SELECT id, name FROM test1 WHERE name LIKE ?
UNION
SELECT id, name FROM test2 WHERE name LIKE ?) AS t
"""
>>> params = ('f%', 'b%')
>>> cr.execute(q2, params).fetchall()
[(1, 'foo'), (2, 'bar'), (3, 'food'), (4, 'barking')]
Trace output for each queries
q1
------------------------------------------------------------------------------
SELECT t.id, t.name
FROM (
SELECT id, name FROM test1 WHERE name LIKE 'f%'
UNION
SELECT id, name FROM test2 WHERE name LIKE 'b%') AS t
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T TEST1 INDEX (TEST1_IDX))
PLAN (T TEST2 INDEX (TEST2_IDX))
4 records fetched
0 ms, 2 read(s), 12 fetch(es)
Table Natural Index Update Insert
Delete Backout Purge Expunge
***************************************************************************************************************
TEST1 2
TEST2 2
q2
-------------------------------------------------------------------------------
SELECT t.id, t.name
FROM (
SELECT id, name FROM test1 WHERE name LIKE ?
UNION
SELECT id, name FROM test2 WHERE name LIKE ?) AS t
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
PLAN (T TEST1 NATURAL)
PLAN (T TEST2 NATURAL)
param0 = varchar(20), "f%"
param1 = varchar(20), "b%"
4 records fetched
0 ms, 14 fetch(es)
Table Natural Index Update Insert
Delete Backout Purge Expunge
***************************************************************************************************************
TEST1 2
TEST2 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
------------------------------------------------------------------------------
Transform Data into Opportunity.
Accelerate data analysis in your applications with
Intel Data Analytics Acceleration Library.
Click to learn more.
http://pubads.g.doubleclick.net/gampad/clk?id=278785351&iu=/4140
Firebird-Devel mailing list, web interface at
https://lists.sourceforge.net/lists/listinfo/firebird-devel