25 #include <drizzled/message/table.pb.h>
26 #include <drizzled/name_resolution_context.h>
27 #include <drizzled/table_list.h>
28 #include <drizzled/function/math/real.h>
29 #include <drizzled/key_part_spec.h>
31 #include <drizzled/optimizer/explain_plan.h>
43 # include <drizzled/sys_var.h>
44 # include <drizzled/item/func.h>
46 # define LEX_YYSTYPE void *
48 # if defined(DRIZZLE_LEX)
49 # include <drizzled/foreign_key.h>
50 # include <drizzled/lex_symbol.h>
51 # include <drizzled/comp_creator.h>
52 # include <drizzled/sql_yacc.hh>
53 # define LEX_YYSTYPE YYSTYPE *
55 # define LEX_YYSTYPE void *
61 #define DESCRIBE_NORMAL 1
62 #define DESCRIBE_EXTENDED 2
66 #define DERIVED_NONE 0
67 #define DERIVED_SUBQUERY 1
72 typedef List<Item> List_item;
87 UNSPECIFIED_OLAP_TYPE,
210 class Select_Lex_Node {
212 Select_Lex_Node *next, **prev,
214 *link_next, **link_prev;
227 std::bitset<8> uncacheable;
228 sub_select_type linkage;
229 bool no_table_names_allowed;
232 static void *
operator new(
size_t size)
234 return memory::sql_alloc(size);
236 static void *
operator new(
size_t size, memory::Root *mem_root)
237 {
return mem_root->alloc(size); }
238 static void operator delete(
void*, size_t)
240 static void operator delete(
void*, memory::Root*)
242 Select_Lex_Node(): linkage(UNSPECIFIED_TYPE) {}
243 virtual ~Select_Lex_Node() {}
244 inline Select_Lex_Node* get_master() {
return master; }
245 virtual void init_query();
246 virtual void init_select();
247 void include_down(Select_Lex_Node *upper);
248 void include_neighbour(Select_Lex_Node *before);
249 void include_standalone(Select_Lex_Node *sel, Select_Lex_Node **ref);
250 void include_global(Select_Lex_Node **plink);
253 virtual Select_Lex_Unit* master_unit()= 0;
254 virtual Select_Lex* outer_select()= 0;
255 virtual Select_Lex* return_after_parsing()= 0;
257 virtual bool set_braces(
bool value);
258 virtual bool inc_in_sum_expr();
259 virtual uint32_t get_in_sum_expr();
260 virtual TableList* get_table_list();
261 virtual List<Item>* get_item_list();
262 virtual TableList *add_table_to_list(Session *session, Table_ident *table,
264 const std::bitset<NUM_OF_TABLE_OPTIONS>& table_options,
265 thr_lock_type flags= TL_UNLOCK,
266 List<Index_hint> *hints= 0,
267 lex_string_t *option= 0);
268 virtual void set_lock_for_tables(thr_lock_type)
271 friend class Select_Lex_Unit;
272 friend bool new_select(LEX *lex,
bool move_down);
281 class Select_Lex_Unit:
public Select_Lex_Node {
283 TableList result_table_list;
284 select_union *union_result;
287 select_result *result;
288 uint64_t found_rows_for_union;
298 List<Item> item_list;
315 Select_Lex *global_parameters;
317 Select_Lex *return_to;
319 ha_rows select_limit_cnt, offset_limit_cnt;
321 Item_subselect *item;
328 Select_Lex *fake_select_lex;
330 Select_Lex *union_distinct;
334 Select_Lex_Unit* master_unit();
335 Select_Lex* outer_select();
336 Select_Lex* first_select()
338 return reinterpret_cast<Select_Lex*
>(slave);
340 Select_Lex_Unit* next_unit()
342 return reinterpret_cast<Select_Lex_Unit*
>(next);
344 Select_Lex* return_after_parsing() {
return return_to; }
345 void exclude_level();
349 bool prepare(Session *session, select_result *result,
350 uint64_t additional_options);
353 inline void unclean() { cleaned= 0; }
354 void reinit_exec_mechanism();
356 void print(String *str);
358 bool add_fake_select_lex(Session *session);
359 void init_prepare_fake_select_lex(Session *session);
360 bool change_result(select_result_interceptor *result,
361 select_result_interceptor *old_result);
362 void set_limit(Select_Lex *values);
363 void set_session(Session *session_arg) { session= session_arg; }
364 inline bool is_union();
366 friend void lex_start(Session*);
368 List<Item> *get_unit_column_types();
374 class Select_Lex :
public Select_Lex_Node
386 olap(UNSPECIFIED_OLAP_TYPE),
391 is_item_list_lookup(false),
398 type(optimizer::ST_PRIMARY),
403 ref_pointer_array(0),
404 select_n_having_items(0),
408 select_n_where_fields(0),
409 parsing_place(NO_MATTER),
414 inner_sum_func_list(0),
420 n_child_sum_items(0),
423 subquery_in_having(0),
425 exclude_from_table_unique_test(0),
427 cur_pos_in_select_list(0),
429 full_group_by_flag(),
430 current_index_hint_type(INDEX_HINT_IGNORE),
431 current_index_hint_clause(),
436 Name_resolution_context context;
443 Item::cond_result cond_value;
444 Item::cond_result having_value;
451 List<Item> item_list;
452 List<String> interval_list;
453 bool is_item_list_lookup;
455 List<TableList> top_join_list;
456 List<TableList> *join_list;
457 TableList *embedding;
458 List<TableList> sj_nests;
464 TableList *leaf_tables;
465 drizzled::optimizer::select_type type;
468 SQL_LIST *gorder_list;
469 Item *select_limit, *offset_limit;
471 Item **ref_pointer_array;
478 uint32_t select_n_having_items;
480 uint32_t between_count;
481 uint32_t max_equal_elems;
486 uint32_t select_n_where_fields;
487 enum_parsing_place parsing_place;
490 uint32_t in_sum_expr;
491 uint32_t select_number;
493 Item_sum *inner_sum_func_list;
497 bool having_fix_field;
499 List<Item_outer_ref> inner_refs_list;
501 uint32_t n_sum_items;
503 uint32_t n_child_sum_items;
515 bool subquery_in_having;
519 bool exclude_from_table_unique_test;
521 List<Item_field> non_agg_fields;
523 int cur_pos_in_select_list;
538 List<String> *prev_join_using;
548 std::bitset<2> full_group_by_flag;
552 Select_Lex_Unit* master_unit();
553 Select_Lex_Unit* first_inner_unit()
555 return (Select_Lex_Unit*) slave;
557 Select_Lex* outer_select();
558 Select_Lex* next_select()
560 return (Select_Lex*) next;
562 Select_Lex* next_select_in_list()
564 return (Select_Lex*) link_next;
566 Select_Lex_Node** next_select_in_list_addr()
570 Select_Lex* return_after_parsing()
572 return master_unit()->return_after_parsing();
577 bool set_braces(
bool value);
578 bool inc_in_sum_expr();
579 uint32_t get_in_sum_expr();
581 void add_item_to_list(Session *session, Item *item);
582 void add_group_to_list(Session *session, Item *item,
bool asc);
583 void add_order_to_list(Session *session, Item *item,
bool asc);
584 TableList* add_table_to_list(Session *session,
587 const std::bitset<NUM_OF_TABLE_OPTIONS>& table_options,
588 thr_lock_type flags= TL_UNLOCK,
589 List<Index_hint> *hints= 0,
590 lex_string_t *option= 0);
591 TableList* get_table_list();
592 void init_nested_join(Session&);
593 TableList *end_nested_join();
594 TableList *nest_last_join(Session*);
595 void add_joined_table(TableList *table);
596 TableList *convert_right_join();
597 List<Item>* get_item_list();
598 void set_lock_for_tables(thr_lock_type lock_type);
599 inline void init_order()
601 order_list.elements= 0;
603 order_list.next= (
unsigned char**) &order_list.first;
617 friend void lex_start(Session*);
618 void make_empty_select()
623 void setup_ref_array(Session *session, uint32_t order_group_num);
624 void print(Session *session, String *str);
625 static void print_order(String *str, Order *order);
627 void print_limit(Session *session, String *str);
628 void fix_prepare_information(Session *session, Item **conds, Item **having_conds);
638 void cleanup_all_joins(
bool full);
640 void set_index_hint_type(index_hint_type type, index_clause_map clause);
646 void add_index_hint(Session*,
const char*);
649 void alloc_index_hints (Session *session);
651 List<Index_hint>* pop_index_hints()
653 List<Index_hint> *hints= index_hints;
658 void clear_index_hints() { index_hints= NULL; }
662 index_hint_type current_index_hint_type;
663 index_clause_map current_index_hint_clause;
665 List<Index_hint> *index_hints;
668 inline bool Select_Lex_Unit::is_union()
670 return first_select()->next_select() && first_select()->next_select()->linkage == UNION_TYPE;
693 class Query_tables_list
697 TableList *query_tables;
699 TableList **query_tables_last;
706 TableList **query_tables_own_last;
709 void reset_query_tables_list(
bool init);
716 void add_to_query_tables(TableList *table)
718 *(table->prev_global= query_tables_last)= table;
719 query_tables_last= &table->next_global;
722 TableList* first_not_own_table()
724 return ( query_tables_own_last ? *query_tables_own_last : 0);
726 void chop_off_not_own_tables()
728 if (query_tables_own_last)
730 *query_tables_own_last= 0;
731 query_tables_last= query_tables_own_last;
732 query_tables_own_last= 0;
740 enum enum_comment_state
765 class LEX :
public Query_tables_list
768 Select_Lex_Unit unit;
769 Select_Lex select_lex;
771 Select_Lex *current_select;
773 Select_Lex *all_selects_list;
789 file_exchange *exchange;
790 select_result *result;
800 unsigned char* yacc_yyss, *yacc_yyvs;
803 const charset_info_st *charset;
804 bool text_string_is_7bit;
806 TableList *leaf_tables_insert;
808 List<Key_part_spec> col_list;
809 List<Key_part_spec> ref_list;
810 List<String> interval_list;
811 List<Lex_Column> columns;
812 List<Item> *insert_list,field_list,value_list,update_list;
813 List<List_item> many_values;
814 SetVarVector var_list;
828 List<Name_resolution_context> context_stack;
830 SQL_LIST auxiliary_table_list;
832 CreateField *last_field;
833 Item_sum *in_sum_func;
834 plugin::Function *udf;
845 nesting_map allow_sum_func;
846 enum_sql_command sql_command;
847 statement::Statement *statement;
854 bool expr_allows_subselect;
856 thr_lock_type lock_option;
857 enum enum_duplicates duplicates;
859 enum ha_rkey_function ha_rkey_mode;
860 enum xa_option_words xa_opt;
862 sql_var_t option_type;
870 uint8_t derived_tables;
881 bool use_only_table_context;
896 TableList *unlink_first_table(
bool *link_to_local);
897 void link_first_table_back(TableList *first,
bool link_to_local);
898 void first_lists_tables_same();
900 void cleanup_after_one_table_open();
902 void push_context(Name_resolution_context *context)
904 context_stack.push_front(context);
912 Name_resolution_context *current_context()
914 return &context_stack.front();
924 bool is_single_level_stmt()
931 if (&select_lex == all_selects_list)
933 assert(!all_selects_list->next_select_in_list());
943 void setCacheable(
bool val)
950 sum_expr_used=
false;
954 void setSumExprUsed()
961 return sum_expr_used;
964 void start(Session *session);
967 message::Table *table()
969 if (not _create_table)
970 _create_table=
new message::Table;
972 return _create_table;
975 message::AlterTable *alter_table();
977 message::Table::Field *field()
979 return _create_field;
982 void setField(message::Table::Field *arg)
1000 message::Table *_create_table;
1001 message::AlterTable *_alter_table;
1002 message::Table::Field *_create_field;
1006 extern void lex_start(Session *session);
void mark_as_dependent(Session *session, Select_Lex *last, Select_Lex *current, Item_ident *resolved_item, Item_ident *mark_item)