diff options
author | unknown <bell@sanja.is.com.ua> | 2002-05-07 00:04:16 +0300 |
---|---|---|
committer | unknown <bell@sanja.is.com.ua> | 2002-05-07 00:04:16 +0300 |
commit | 2c62a868a60058a8664dcf3e45cdd86b41635ddd (patch) | |
tree | 28f6bf8b6eba7559f3589a4655aa64349d0b84cc /sql/sql_lex.cc | |
parent | 234dc3a35e8ae7f63aa6d3b7891b72e735728639 (diff) | |
download | mariadb-git-2c62a868a60058a8664dcf3e45cdd86b41635ddd.tar.gz |
new SELECT_LEX structure
mysql-test/r/derived.result:
derived table bug test
mysql-test/t/derived.test:
derived table bug test
sql/mysql_priv.h:
new mysql_new_select call & layout fixing
sql/sql_class.h:
passing unit as parameter of Table_ident constructor
sql/sql_lex.cc:
new SELECT_LEX structure methods
sql/sql_lex.h:
new SELECT_LEX structure definition
sql/table.h:
fixed layout
Diffstat (limited to 'sql/sql_lex.cc')
-rw-r--r-- | sql/sql_lex.cc | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/sql/sql_lex.cc b/sql/sql_lex.cc index 31ec6d1cecc..3b17c8d498a 100644 --- a/sql/sql_lex.cc +++ b/sql/sql_lex.cc @@ -879,3 +879,118 @@ int yylex(void *arg) } } } + +/* + st_select_lex structures initialisations +*/ + +void st_select_lex_node::init_query() +{ + next= master= slave= link_next= 0; + prev= link_prev= 0; +} + +void st_select_lex_node::init_select() +{ + order_list.elements= 0; + order_list.first= 0; + order_list.next= (byte**) &order_list.first; + select_limit= offset_limit= 0; +} + +void st_select_lex_unit::init_query() +{ + st_select_lex_node::init_query(); + global_parameters= this; + select_limit_cnt= offset_limit_cnt= 0; +} + +void st_select_lex::init_query() +{ + st_select_lex_node::init_query(); + table_list.elements= 0; + table_list.first= 0; + table_list.next= (byte**) &table_list.first; + item_list.empty(); +} + +void st_select_lex::init_select() +{ + st_select_lex_node::init_select(); + group_list.elements= 0; + group_list.first= 0; + group_list.next= (byte**) &group_list.first; + options= 0; + where= having= 0; + when_list.empty(); + expr_list.empty(); + interval_list.empty(); + use_index.empty(); + ftfunc_list.empty(); + linkage=UNSPECIFIED_TYPE; +} + +/* + st_select_lex structures linking +*/ + +/* include on level down */ +void st_select_lex_node::include_down(st_select_lex_node *upper) +{ + if ((next= upper->slave)) + next->prev= &next; + prev= &upper->slave; + upper->slave= this; + master= upper; +} + +/* include neighbour (on same level) */ +void st_select_lex_node::include_neighbour(st_select_lex_node *before) +{ + if ((next= before->next)) + next->prev= &next; + prev= &before->next; + before->next= this; + master= before->master; +} + +/* including in global SELECT_LEX list */ +void st_select_lex_node::include_global(st_select_lex_node **plink) +{ + if ((link_next= *plink)) + link_next->link_prev= &link_next; + link_prev= plink; + *plink= this; +} + +//excluding from global list (internal function) +void st_select_lex_node::fast_exclude() +{ + if(link_prev) + { + if ((*link_prev= link_next)) + link_next->link_prev= link_prev; + // Remove slave structure + for (; slave; slave= slave->next) + slave->fast_exclude(); + } +} + +/* + excluding select_lex structure (except first (first select can't be + deleted, because it is most upper select)) +*/ +void st_select_lex_node::exclude() +{ + //exclude from global list + fast_exclude(); + //exclude from other structures + if ((*prev= next)) + next->prev= prev; + /* + We do not need following statements, because prev pointer of first + list element point to master->slave + if (master->slave == this) + master->slave= next; + */ +} |