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;
1947
my_error(ER_NON_UNIQ_ERROR, MYF(0), name, session->where());
1946
my_error(ER_NON_UNIQ_ERROR, MYF(0), name, session->where);
1950
1949
nj_col= curr_nj_col;
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
2354
2353
if (report_error == REPORT_ALL_ERRORS ||
2355
2354
report_error == IGNORE_EXCEPT_NON_UNIQUE)
2356
2355
my_error(ER_NON_UNIQ_ERROR, MYF(0),
2357
table_name ? item->full_name() : name, session->where());
2356
table_name ? item->full_name() : name, session->where);
2358
2357
return (Field*) 0;
2360
2359
found= cur_field;
2387
2386
strcat(buff, table_name);
2388
2387
table_name=buff;
2390
my_error(ER_UNKNOWN_TABLE, MYF(0), table_name, session->where());
2389
my_error(ER_UNKNOWN_TABLE, MYF(0), table_name, session->where);
2394
2393
if (report_error == REPORT_ALL_ERRORS ||
2395
2394
report_error == REPORT_EXCEPT_NON_UNIQUE)
2396
my_error(ER_BAD_FIELD_ERROR, MYF(0), item->full_name(), session->where());
2395
my_error(ER_BAD_FIELD_ERROR, MYF(0), item->full_name(), session->where);
2398
2397
found= not_found_field;
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;
2521
2520
if (report_error != IGNORE_ERRORS)
2522
2521
my_error(ER_NON_UNIQ_ERROR, MYF(0),
2523
find->full_name(), session->where());
2522
find->full_name(), session->where);
2524
2523
return (Item**) 0;
2526
2525
found_unaliased= li.ref();
2551
2550
continue; // Same field twice
2552
2551
if (report_error != IGNORE_ERRORS)
2553
2552
my_error(ER_NON_UNIQ_ERROR, MYF(0),
2554
find->full_name(), session->where());
2553
find->full_name(), session->where);
2555
2554
return (Item**) 0;
2557
2556
found= li.ref();
2604
2603
if (report_error != IGNORE_ERRORS)
2605
2604
my_error(ER_NON_UNIQ_ERROR, MYF(0),
2606
find->full_name(), session->where());
2605
find->full_name(), session->where);
2607
2606
return (Item **) 0;
2609
2608
if (found_unaliased)
2620
2619
if (report_error == REPORT_ALL_ERRORS)
2621
2620
my_error(ER_BAD_FIELD_ERROR, MYF(0),
2622
find->full_name(), session->where());
2621
find->full_name(), session->where);
2623
2622
return (Item **) 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++))
2790
2789
if (cur_nj_col_2->is_common ||
2791
2790
(found && (!using_fields || is_using_column_1)))
2793
my_error(ER_NON_UNIQ_ERROR, MYF(0), field_name_1, session->where());
2792
my_error(ER_NON_UNIQ_ERROR, MYF(0), field_name_1, session->where);
2794
2793
return(result);
2796
2795
nj_col_2= cur_nj_col_2;
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;
2995
2994
if (!(common_field= it++))
2997
2996
my_error(ER_BAD_FIELD_ERROR, MYF(0), using_field_name_ptr,
2999
2998
return(result);
3001
3000
if (!my_strcasecmp(system_charset_info,
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
3218
3217
List<TableList> *from_clause,
3219
3218
Name_resolution_context *context)
3221
session->setWhere("from clause");
3220
session->where= "from clause";
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;
3342
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;
3340
session->lex->allow_sum_func|= 1 << session->lex->current_select->nest_level;
3341
session->where= Session::DEFAULT_WHERE;
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,
3351
3350
There is other way to solve problem: fill array with pointers to list,
3352
3351
but it will be slower.
3354
TODO-> remove it when (if) we made one list for allfields and ref_pointer_array
3353
TODO: remove it when (if) we made one list for allfields and
3356
3356
if (ref_pointer_array)
3358
3357
memset(ref_pointer_array, 0, sizeof(Item *) * fields.elements);
3361
3359
Item **ref= ref_pointer_array;
3362
session->getLex()->current_select->cur_pos_in_select_list= 0;
3360
session->lex->current_select->cur_pos_in_select_list= 0;
3363
3361
while ((item= it++))
3365
3363
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;
3365
session->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
3366
session->lex->allow_sum_func= save_allow_sum_func;
3369
3367
session->mark_used_columns= save_mark_used_columns;
3376
3374
item->split_sum_func(session, ref_pointer_array, *sum_func_list);
3377
3375
session->used_tables|= item->used_tables();
3378
session->getLex()->current_select->cur_pos_in_select_list++;
3376
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;
3378
session->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
3379
session->lex->current_select->cur_pos_in_select_list= UNDEF_POS;
3383
session->getLex()->allow_sum_func= save_allow_sum_func;
3381
session->lex->allow_sum_func= save_allow_sum_func;
3384
3382
session->mark_used_columns= save_mark_used_columns;
3385
3383
return(test(session->is_error()));
3551
3549
insert_fields(Session *session, Name_resolution_context *context, const char *db_name,
3552
const char *table_name, List<Item>::iterator *it,
3550
const char *table_name, List_iterator<Item> *it,
3555
3553
Field_iterator_table_ref field_iterator;
3656
3654
session->used_tables|= item->used_tables();
3659
session->getLex()->current_select->cur_pos_in_select_list++;
3657
session->lex->current_select->cur_pos_in_select_list++;
3662
3660
In case of stored tables, all fields are considered as used,
3709
3707
int Session::setup_conds(TableList *leaves, COND **conds)
3711
3709
Session *session= this;
3712
Select_Lex *select_lex= session->getLex()->current_select;
3710
Select_Lex *select_lex= session->lex->current_select;
3713
3711
TableList *table= NULL; // For HP compilers
3714
3712
void *save_session_marker= session->session_marker;
3731
3729
session->session_marker= (void*)1;
3734
session->setWhere("where clause");
3732
session->where="where clause";
3735
3733
if ((!(*conds)->fixed && (*conds)->fix_fields(session, conds)) ||
3736
3734
(*conds)->check_cols(1))
3737
3735
goto err_no_arena;
3754
3752
/* Make a join an a expression */
3755
3753
session->session_marker= (void*)embedded;
3756
session->setWhere("on clause");
3754
session->where="on clause";
3757
3755
if ((!embedded->on_expr->fixed && embedded->on_expr->fix_fields(session, &embedded->on_expr)) ||
3758
3756
embedded->on_expr->check_cols(1))
3759
3757
goto err_no_arena;
3768
3766
session->session_marker= save_session_marker;
3770
session->getLex()->current_select->is_item_list_lookup= save_is_item_list_lookup;
3768
session->lex->current_select->is_item_list_lookup= save_is_item_list_lookup;
3771
3769
return(test(session->is_error()));
3806
3804
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());
3806
List_iterator_fast<Item> f(fields),v(values);
3811
3808
Item_field *field;
3872
3869
bool fill_record(Session *session, Field **ptr, List<Item> &values, bool)
3874
List<Item>::iterator v(values.begin());
3871
List_iterator_fast<Item> v(values);
3876
3873
Table *table= 0;