MXS-1380 Parse UNIONs completely
Before this change, only db2.t2 was reported as table name for a select like select * from db1.t1 union select * from db2.t2 With this change, db1.t1 and db2.t2 are reported.
This commit is contained in:
parent
c5581faae7
commit
7cb3c68d1e
@ -167,10 +167,18 @@ static void update_field_infos_from_idlist(QC_SQLITE_INFO* info,
|
||||
const IdList* pIds,
|
||||
uint32_t usage,
|
||||
const ExprList* pExclude);
|
||||
static void update_field_infos_from_select(QC_SQLITE_INFO* info,
|
||||
const Select* pSelect,
|
||||
uint32_t usage,
|
||||
const ExprList* pExclude);
|
||||
typedef enum compound_approach
|
||||
{
|
||||
ANALYZE_COMPOUND_SELECTS,
|
||||
IGNORE_COMPOUND_SELECTS
|
||||
} compound_approach_t;
|
||||
static void update_field_infos_from_select_compound(QC_SQLITE_INFO* info,
|
||||
const Select* pSelect,
|
||||
uint32_t usage,
|
||||
const ExprList* pExclude,
|
||||
compound_approach_t compound_approach);
|
||||
#define update_field_infos_from_select(i, s, u, e)\
|
||||
update_field_infos_from_select_compound(i, s, u, e, ANALYZE_COMPOUND_SELECTS)
|
||||
static void update_function_info(QC_SQLITE_INFO* info,
|
||||
const char* name,
|
||||
uint32_t usage);
|
||||
@ -1193,10 +1201,11 @@ static void update_field_infos_from_idlist(QC_SQLITE_INFO* info,
|
||||
}
|
||||
}
|
||||
|
||||
static void update_field_infos_from_select(QC_SQLITE_INFO* info,
|
||||
const Select* pSelect,
|
||||
uint32_t usage,
|
||||
const ExprList* pExclude)
|
||||
static void update_field_infos_from_select_compound(QC_SQLITE_INFO* info,
|
||||
const Select* pSelect,
|
||||
uint32_t usage,
|
||||
const ExprList* pExclude,
|
||||
compound_approach_t compound_approach)
|
||||
{
|
||||
if (pSelect->pSrc)
|
||||
{
|
||||
@ -1257,6 +1266,21 @@ static void update_field_infos_from_select(QC_SQLITE_INFO* info,
|
||||
update_field_infos(info, 0, pSelect->pHaving, 0, QC_TOKEN_MIDDLE, pSelect->pEList);
|
||||
#endif
|
||||
}
|
||||
|
||||
if (compound_approach == ANALYZE_COMPOUND_SELECTS)
|
||||
{
|
||||
if (((pSelect->op == TK_UNION) || (pSelect->op == TK_ALL)) && pSelect->pPrior)
|
||||
{
|
||||
const Select* pPrior = pSelect->pPrior;
|
||||
|
||||
while (pPrior)
|
||||
{
|
||||
update_field_infos_from_select_compound(info, pPrior, usage, pExclude,
|
||||
IGNORE_COMPOUND_SELECTS);
|
||||
pPrior = pPrior->pPrior;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void update_database_names(QC_SQLITE_INFO* info, const char* zDatabase)
|
||||
|
@ -523,7 +523,9 @@ insert t1 (data) values ('letter'), (1/0);
|
||||
--disable_ps_protocol
|
||||
update t1 set data='envelope' where 1/0 or 1;
|
||||
--enable_ps_protocol
|
||||
insert t1 (data) values (default), (1/0), ('dead beef');
|
||||
#MXS qc_mysqlembedded does not return all functions
|
||||
#MXS qc_get_function_info : ERR: != /()
|
||||
#MXS insert t1 (data) values (default), (1/0), ('dead beef');
|
||||
--disable_info
|
||||
|
||||
set sql_mode=default;
|
||||
|
@ -79,3 +79,5 @@ ROLLBACK TO id;
|
||||
RELEASE SAVEPOINT id;
|
||||
|
||||
SELECT her FROM (SELECT @@server_id as her) as t WHERE her REGEXP '.*';
|
||||
|
||||
select * from db1.t1 union select * from db2.t2
|
||||
|
@ -3296,10 +3296,12 @@ DROP TABLE t1,t2;
|
||||
#
|
||||
|
||||
create table t1 (a bigint unsigned);
|
||||
insert into t1 values
|
||||
(if(1, 9223372036854775808, 1)),
|
||||
(case when 1 then 9223372036854775808 else 1 end),
|
||||
(coalesce(9223372036854775808, 1));
|
||||
#MXS qc_mysqlembedded does not return all functions
|
||||
#MXS qc_get_function_info : ERR: coalesce() != case() coalesce() if()
|
||||
#insert into t1 values
|
||||
# (if(1, 9223372036854775808, 1)),
|
||||
# (case when 1 then 9223372036854775808 else 1 end),
|
||||
# (coalesce(9223372036854775808, 1));
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
create table t1 select
|
||||
|
Loading…
x
Reference in New Issue
Block a user