33
#include <drizzled/internal/my_pthread.h>
34
#include <drizzled/internal/thread_var.h>
33
#include "drizzled/internal/my_pthread.h"
34
#include "drizzled/internal/thread_var.h"
36
36
#include <drizzled/sql_select.h>
37
37
#include <drizzled/error.h>
44
44
#include <drizzled/check_stack_overrun.h>
45
45
#include <drizzled/lock.h>
46
46
#include <drizzled/plugin/listen.h>
47
#include <drizzled/cached_directory.h>
47
#include "drizzled/cached_directory.h"
48
48
#include <drizzled/field/epoch.h>
49
49
#include <drizzled/field/null.h>
50
#include <drizzled/sql_table.h>
51
#include <drizzled/global_charset_info.h>
52
#include <drizzled/pthread_globals.h>
53
#include <drizzled/internal/iocache.h>
54
#include <drizzled/drizzled.h>
55
#include <drizzled/plugin/authorization.h>
56
#include <drizzled/table/temporary.h>
57
#include <drizzled/table/placeholder.h>
58
#include <drizzled/table/unused.h>
59
#include <drizzled/plugin/storage_engine.h>
60
#include <drizzled/session.h>
62
#include <drizzled/refresh_version.h>
50
#include "drizzled/sql_table.h"
51
#include "drizzled/global_charset_info.h"
52
#include "drizzled/pthread_globals.h"
53
#include "drizzled/internal/iocache.h"
54
#include "drizzled/drizzled.h"
55
#include "drizzled/plugin/authorization.h"
56
#include "drizzled/table/temporary.h"
57
#include "drizzled/table/placeholder.h"
58
#include "drizzled/table/unused.h"
64
60
using namespace std;
580
577
int Open_tables_state::doGetTableDefinition(const identifier::Table &identifier,
581
message::Table &table_proto)
578
message::Table &table_proto)
583
580
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
954
951
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
956
my_error(ER_TABLE_UNKNOWN, identifier);
953
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->getSchemaName(), table_list->getTableName());
1056
1053
/* Avoid self-deadlocks by detecting self-dependencies. */
1057
1054
if (table->open_placeholder && table->in_use == this)
1056
table::Cache::singleton().mutex().unlock();
1059
1057
my_error(ER_UPDATE_TABLE_USED, MYF(0), table->getShare()->getTableName());
1091
1089
/* wait_for_conditionwill unlock table::Cache::singleton().mutex() for us */
1092
1090
wait_for_condition(table::Cache::singleton().mutex(), COND_refresh);
1093
scopedLock.release();
1097
scopedLock.unlock();
1094
table::Cache::singleton().mutex().unlock();
1101
1097
There is a refresh in progress for this table.
1102
1098
Signal the caller that it has to try again.
1105
1101
*refresh= true;
1113
1107
table::getUnused().unlink(static_cast<table::Concurrent *>(table));
1598
1597
* table/schema information via error messages
1600
1599
identifier::Table the_table(tables->getSchemaName(), tables->getTableName());
1601
if (not plugin::Authorization::isAuthorized(*user(), the_table))
1600
if (not plugin::Authorization::isAuthorized(user(), the_table))
1603
1602
result= -1; // Fatal error
1761
1760
Table **start,**ptr;
1762
1761
uint32_t lock_flag= DRIZZLE_LOCK_NOTIFY_IF_NEED_REOPEN;
1764
if (!(ptr=start=(Table**) session->getMemRoot()->allocate(sizeof(Table*)*count)))
1763
if (!(ptr=start=(Table**) session->alloc(sizeof(Table*)*count)))
1767
1766
for (table= tables; table; table= table->next_global)
1929
1928
const char *name, uint32_t , Item **,
1930
1929
bool, TableList **actual_table)
1932
List<Natural_join_column>::iterator
1933
field_it(table_ref->join_columns->begin());
1931
List_iterator_fast<Natural_join_column>
1932
field_it(*(table_ref->join_columns));
1934
1933
Natural_join_column *nj_col, *curr_nj_col;
1935
1934
Field *found_field;
2298
Select_Lex *current_sel= session->getLex()->current_select;
2297
Select_Lex *current_sel= session->lex->current_select;
2299
2298
Select_Lex *last_select= table_ref->select_lex;
2301
2300
If the field was an outer referencee, mark all selects using this
2444
2443
find_item_error_report_type report_error,
2445
2444
enum_resolution_type *resolution)
2447
List<Item>::iterator li(items.begin());
2446
List_iterator<Item> li(items);
2448
2447
Item **found=0, **found_unaliased= 0, *item;
2449
2448
const char *db_name=0;
2450
2449
const char *field_name=0;
2648
2647
test_if_string_in_list(const char *find, List<String> *str_list)
2650
List<String>::iterator str_list_it(str_list->begin());
2649
List_iterator<String> str_list_it(*str_list);
2651
2650
String *curr_str;
2652
2651
size_t find_length= strlen(find);
2653
2652
while ((curr_str= str_list_it++))
2981
2980
if (using_fields && found_using_fields < using_fields->elements)
2983
2982
String *using_field_name;
2984
List<String>::iterator using_fields_it(using_fields->begin());
2983
List_iterator_fast<String> using_fields_it(*using_fields);
2985
2984
while ((using_field_name= using_fields_it++))
2987
2986
const char *using_field_name_ptr= using_field_name->c_ptr();
2988
List<Natural_join_column>::iterator
2989
it(natural_using_join->join_columns->begin());
2987
List_iterator_fast<Natural_join_column>
2988
it(*(natural_using_join->join_columns));
2990
2989
Natural_join_column *common_field;
3068
3067
/* Call the procedure recursively for each nested table reference. */
3069
3068
if (table_ref->getNestedJoin())
3071
List<TableList>::iterator nested_it(table_ref->getNestedJoin()->join_list.begin());
3070
List_iterator_fast<TableList> nested_it(table_ref->getNestedJoin()->join_list);
3072
3071
TableList *same_level_left_neighbor= nested_it++;
3073
3072
TableList *same_level_right_neighbor= NULL;
3074
3073
/* Left/right-most neighbors, possibly at higher levels in the join tree. */
3123
3122
assert(table_ref->getNestedJoin() &&
3124
3123
table_ref->getNestedJoin()->join_list.elements == 2);
3125
List<TableList>::iterator operand_it(table_ref->getNestedJoin()->join_list.begin());
3124
List_iterator_fast<TableList> operand_it(table_ref->getNestedJoin()->join_list);
3127
3126
Notice that the order of join operands depends on whether table_ref
3128
3127
represents a LEFT or a RIGHT join. In a RIGHT join, the operands are
3222
3221
if (from_clause->elements == 0)
3223
3222
return false; /* We come here in the case of UNIONs. */
3225
List<TableList>::iterator table_ref_it(from_clause->begin());
3224
List_iterator_fast<TableList> table_ref_it(*from_clause);
3226
3225
TableList *table_ref; /* Current table reference. */
3227
3226
/* Table reference to the left of the current. */
3228
3227
TableList *left_neighbor;
3275
List<Item>::iterator it(fields.begin());
3274
List_iterator<Item> it(fields);
3277
session->getLex()->current_select->cur_pos_in_select_list= 0;
3276
session->lex->current_select->cur_pos_in_select_list= 0;
3278
3277
while (wild_num && (item= it++))
3280
3279
if (item->type() == Item::FIELD_ITEM &&
3285
3284
uint32_t elem= fields.elements;
3286
3285
bool any_privileges= ((Item_field *) item)->any_privileges;
3287
Item_subselect *subsel= session->getLex()->current_select->master_unit()->item;
3286
Item_subselect *subsel= session->lex->current_select->master_unit()->item;
3289
3288
subsel->substype() == Item_subselect::EXISTS_SUBS)
3318
session->getLex()->current_select->cur_pos_in_select_list++;
3317
session->lex->current_select->cur_pos_in_select_list++;
3320
session->getLex()->current_select->cur_pos_in_select_list= UNDEF_POS;
3319
session->lex->current_select->cur_pos_in_select_list= UNDEF_POS;
3333
3332
register Item *item;
3334
3333
enum_mark_columns save_mark_used_columns= session->mark_used_columns;
3335
nesting_map save_allow_sum_func= session->getLex()->allow_sum_func;
3336
List<Item>::iterator it(fields.begin());
3334
nesting_map save_allow_sum_func= session->lex->allow_sum_func;
3335
List_iterator<Item> it(fields);
3337
3336
bool save_is_item_list_lookup;
3339
3338
session->mark_used_columns= mark_used_columns;
3340
3339
if (allow_sum_func)
3341
session->getLex()->allow_sum_func|= 1 << session->getLex()->current_select->nest_level;
3340
session->lex->allow_sum_func|= 1 << session->lex->current_select->nest_level;
3342
3341
session->setWhere(Session::DEFAULT_WHERE);
3343
save_is_item_list_lookup= session->getLex()->current_select->is_item_list_lookup;
3344
session->getLex()->current_select->is_item_list_lookup= 0;
3342
save_is_item_list_lookup= session->lex->current_select->is_item_list_lookup;
3343
session->lex->current_select->is_item_list_lookup= 0;
3347
3346
To prevent fail on forward lookup we fill it with zerows,
3361
3360
Item **ref= ref_pointer_array;
3362
session->getLex()->current_select->cur_pos_in_select_list= 0;
3361
session->lex->current_select->cur_pos_in_select_list= 0;
3363
3362
while ((item= it++))
3365
3364
if ((!item->fixed && item->fix_fields(session, it.ref())) || (item= *(it.ref()))->check_cols(1))
3367
session->getLex()->current_select->is_item_list_lookup= save_is_item_list_lookup;
3368
session->getLex()->allow_sum_func= save_allow_sum_func;
3366
session->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
3367
session->lex->allow_sum_func= save_allow_sum_func;
3369
3368
session->mark_used_columns= save_mark_used_columns;
3376
3375
item->split_sum_func(session, ref_pointer_array, *sum_func_list);
3377
3376
session->used_tables|= item->used_tables();
3378
session->getLex()->current_select->cur_pos_in_select_list++;
3377
session->lex->current_select->cur_pos_in_select_list++;
3380
session->getLex()->current_select->is_item_list_lookup= save_is_item_list_lookup;
3381
session->getLex()->current_select->cur_pos_in_select_list= UNDEF_POS;
3379
session->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
3380
session->lex->current_select->cur_pos_in_select_list= UNDEF_POS;
3383
session->getLex()->allow_sum_func= save_allow_sum_func;
3382
session->lex->allow_sum_func= save_allow_sum_func;
3384
3383
session->mark_used_columns= save_mark_used_columns;
3385
3384
return(test(session->is_error()));
3551
3550
insert_fields(Session *session, Name_resolution_context *context, const char *db_name,
3552
const char *table_name, List<Item>::iterator *it,
3551
const char *table_name, List_iterator<Item> *it,
3555
3554
Field_iterator_table_ref field_iterator;
3656
3655
session->used_tables|= item->used_tables();
3659
session->getLex()->current_select->cur_pos_in_select_list++;
3658
session->lex->current_select->cur_pos_in_select_list++;
3662
3661
In case of stored tables, all fields are considered as used,
3709
3708
int Session::setup_conds(TableList *leaves, COND **conds)
3711
3710
Session *session= this;
3712
Select_Lex *select_lex= session->getLex()->current_select;
3711
Select_Lex *select_lex= session->lex->current_select;
3713
3712
TableList *table= NULL; // For HP compilers
3714
3713
void *save_session_marker= session->session_marker;
3768
3767
session->session_marker= save_session_marker;
3770
session->getLex()->current_select->is_item_list_lookup= save_is_item_list_lookup;
3769
session->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
3771
3770
return(test(session->is_error()));
3806
3805
fill_record(Session *session, List<Item> &fields, List<Item> &values, bool ignore_errors)
3808
List<Item>::iterator f(fields.begin());
3809
List<Item>::iterator v(values.begin());
3807
List_iterator_fast<Item> f(fields),v(values);
3811
3809
Item_field *field;
3872
3870
bool fill_record(Session *session, Field **ptr, List<Item> &values, bool)
3874
List<Item>::iterator v(values.begin());
3872
List_iterator_fast<Item> v(values);
3876
3874
Table *table= 0;