The world's most popular open source database
#include "mysql_priv.h"#include "sql_repl.h"#include "rpl_filter.h"#include "repl_failsafe.h"#include <m_ctype.h>#include <myisam.h>#include <my_dir.h>#include "sp_head.h"#include "sp.h"#include "sp_cache.h"#include "events.h"#include "event_timed.h"Include dependency graph for sql_parse.cc:

Go to the source code of this file.
Defines | |
| #define | MYSQL_LEX 1 |
| #define | MIN_HANDSHAKE_SIZE 6 |
| #define | SP_TYPE_STRING(LP) ((LP)->sphead->m_type == TYPE_ENUM_FUNCTION ? "FUNCTION" : "PROCEDURE") |
| #define | SP_COM_STRING(LP) |
| #define | used_stack(A, B) (long) (B - A) |
| #define | MY_YACC_INIT 1000 |
| #define | MY_YACC_MAX 32000 |
Functions | |
| static void | time_out_user_resource_limits (THD *thd, USER_CONN *uc) |
| static int | check_for_max_user_connections (THD *thd, USER_CONN *uc) |
| static void | decrease_user_connections (USER_CONN *uc) |
| static bool | check_multi_update_lock (THD *thd) |
| static void | remove_escape (char *name) |
| static bool | execute_sqlcom_select (THD *thd, TABLE_LIST *all_tables) |
| static void | unlock_locked_tables (THD *thd) |
| bool | end_active_trans (THD *thd) |
| bool | begin_trans (THD *thd) |
| static bool | some_non_temp_table_to_be_updated (THD *thd, TABLE_LIST *tables) |
| static int | get_or_create_user_conn (THD *thd, const char *user, const char *host, USER_RESOURCES *mqh) |
| int | check_user (THD *thd, enum enum_server_command command, const char *passwd, uint passwd_len, const char *db, bool check_count) |
| byte * | get_key_conn (user_conn *buff, uint *length, my_bool not_used __attribute__((unused))) |
| void | free_user (struct user_conn *uc) |
| void | init_max_user_conn (void) |
| void | free_max_user_conn (void) |
| void | init_update_queries (void) |
| bool | is_update_query (enum enum_sql_command command) |
| static bool | check_mqh (THD *thd, uint check_command) |
| static void | reset_mqh (LEX_USER *lu, bool get_them=0) |
| void | thd_init_client_charset (THD *thd, uint cs_number) |
| static int | check_connection (THD *thd) |
| void | execute_init_command (THD *thd, sys_var_str *init_command_var, rw_lock_t *var_mutex) |
| pthread_handler_t | handle_one_connection (void *arg) |
| pthread_handler_t | handle_bootstrap (void *arg) |
| void | free_items (Item *item) |
| void | cleanup_items (Item *item) |
| static int | mysql_table_dump (THD *thd, char *db, char *tbl_name) |
| int | end_trans (THD *thd, enum enum_mysql_completiontype completion) |
| bool | do_command (THD *thd) |
| bool | dispatch_command (enum enum_server_command command, THD *thd, char *packet, uint packet_length) |
| void | log_slow_statement (THD *thd) |
| int | prepare_schema_table (THD *thd, LEX *lex, Table_ident *table_ident, enum enum_schema_tables schema_table_idx) |
| bool | alloc_query (THD *thd, const char *packet, uint packet_length) |
| static void | reset_one_shot_variables (THD *thd) |
| bool | mysql_execute_command (THD *thd) |
| bool | check_single_table_access (THD *thd, ulong privilege, TABLE_LIST *all_tables) |
| bool | check_one_table_access (THD *thd, ulong privilege, TABLE_LIST *all_tables) |
| bool | check_access (THD *thd, ulong want_access, const char *db, ulong *save_priv, bool dont_check_global_grants, bool no_errors, bool schema_db) |
| bool | check_global_access (THD *thd, ulong want_access) |
| bool | check_table_access (THD *thd, ulong want_access, TABLE_LIST *tables, bool no_errors) |
| bool | check_routine_access (THD *thd, ulong want_access, char *db, char *name, bool is_proc, bool no_errors) |
| bool | check_some_routine_access (THD *thd, const char *db, const char *name, bool is_proc) |
| bool | check_some_access (THD *thd, ulong want_access, TABLE_LIST *table) |
| bool | check_merge_table_access (THD *thd, char *db, TABLE_LIST *table_list) |
| bool | check_stack_overrun (THD *thd, long margin, char *buf __attribute__((unused))) |
| bool | my_yyoverflow (short **yyss, YYSTYPE **yyvs, ulong *yystacksize) |
| void | mysql_init_query (THD *thd, uchar *buf, uint length) |
| void | mysql_reset_thd_for_next_command (THD *thd) |
| void | mysql_init_select (LEX *lex) |
| bool | mysql_new_select (LEX *lex, bool move_down) |
| void | create_select_for_variable (const char *var_name) |
| void | mysql_init_multi_delete (LEX *lex) |
| void | mysql_parse (THD *thd, char *inBuf, uint length) |
| bool | add_field_to_list (THD *thd, char *field_name, enum_field_types type, char *length, char *decimals, uint type_modifier, Item *default_value, Item *on_update_value, LEX_STRING *comment, char *change, List< String > *interval_list, CHARSET_INFO *cs, uint uint_geom_type) |
| void | store_position_for_column (const char *name) |
| bool | add_proc_to_list (THD *thd, Item *item) |
| bool | add_to_list (THD *thd, SQL_LIST &list, Item *item, bool asc) |
| bool | push_new_name_resolution_context (THD *thd, TABLE_LIST *left_op, TABLE_LIST *right_op) |
| void | add_join_on (TABLE_LIST *b, Item *expr) |
| void | add_join_natural (TABLE_LIST *a, TABLE_LIST *b, List< String > *using_fields) |
| bool | reload_acl_and_cache (THD *thd, ulong options, TABLE_LIST *tables, bool *write_to_binlog) |
| uint | kill_one_thread (THD *thd, ulong id, bool only_kill_query) |
| void | sql_kill (THD *thd, ulong id, bool only_kill_query) |
| bool | append_file_to_dir (THD *thd, const char **filename_ptr, const char *table_name) |
| bool | check_simple_select () |
| Comp_creator * | comp_eq_creator (bool invert) |
| Comp_creator * | comp_ge_creator (bool invert) |
| Comp_creator * | comp_gt_creator (bool invert) |
| Comp_creator * | comp_le_creator (bool invert) |
| Comp_creator * | comp_lt_creator (bool invert) |
| Comp_creator * | comp_ne_creator (bool invert) |
| Item * | all_any_subquery_creator (Item *left_expr, chooser_compare_func_creator cmp, bool all, SELECT_LEX *select_lex) |
| bool | mysql_create_index (THD *thd, TABLE_LIST *table_list, List< Key > &keys) |
| bool | mysql_drop_index (THD *thd, TABLE_LIST *table_list, ALTER_INFO *alter_info) |
| bool | multi_update_precheck (THD *thd, TABLE_LIST *tables) |
| bool | multi_delete_precheck (THD *thd, TABLE_LIST *tables) |
| bool | multi_delete_set_locks_and_link_aux_tables (LEX *lex) |
| bool | update_precheck (THD *thd, TABLE_LIST *tables) |
| bool | delete_precheck (THD *thd, TABLE_LIST *tables) |
| bool | insert_precheck (THD *thd, TABLE_LIST *tables) |
| bool | create_table_precheck (THD *thd, TABLE_LIST *tables, TABLE_LIST *create_table) |
| Item * | negate_expression (THD *thd, Item *expr) |
| void | get_default_definer (THD *thd, LEX_USER *definer) |
| LEX_USER * | create_default_definer (THD *thd) |
| LEX_USER * | create_definer (THD *thd, LEX_STRING *user_name, LEX_STRING *host_name) |
| LEX_USER * | get_current_user (THD *thd, LEX_USER *user) |
Variables | |
| const char * | any_db = "*any*" |
| const LEX_STRING | command_name [] |
| const char * | xa_state_names [] |
| static HASH | hash_user_connections |
| uint | sql_command_flags [SQLCOM_END+1] |
| long | max_stack_used |
| #define MIN_HANDSHAKE_SIZE 6 |
Definition at line 47 of file sql_parse.cc.
Referenced by check_connection(), and Mysql_connection_thread::check_connection().
| #define MY_YACC_INIT 1000 |
| #define MY_YACC_MAX 32000 |
| #define MYSQL_LEX 1 |
Definition at line 17 of file sql_parse.cc.
| #define SP_COM_STRING | ( | LP | ) |
Value:
((LP)->sql_command == SQLCOM_CREATE_SPFUNCTION || \ (LP)->sql_command == SQLCOM_ALTER_FUNCTION || \ (LP)->sql_command == SQLCOM_SHOW_CREATE_FUNC || \ (LP)->sql_command == SQLCOM_DROP_FUNCTION ? \ "FUNCTION" : "PROCEDURE")
Definition at line 53 of file sql_parse.cc.
Referenced by mysql_execute_command().
| #define SP_TYPE_STRING | ( | LP | ) | ((LP)->sphead->m_type == TYPE_ENUM_FUNCTION ? "FUNCTION" : "PROCEDURE") |
| bool add_field_to_list | ( | THD * | thd, | |
| char * | field_name, | |||
| enum_field_types | type, | |||
| char * | length, | |||
| char * | decimals, | |||
| uint | type_modifier, | |||
| Item * | default_value, | |||
| Item * | on_update_value, | |||
| LEX_STRING * | comment, | |||
| char * | change, | |||
| List< String > * | interval_list, | |||
| CHARSET_INFO * | cs, | |||
| uint | uint_geom_type | |||
| ) |
Definition at line 6156 of file sql_parse.cc.
References AUTO_INCREMENT_FLAG, buf, comment, DBUG_ENTER, DBUG_RETURN, default_key_create_info, ER_INVALID_DEFAULT, ER_INVALID_ON_UPDATE, ER_TOO_LONG_IDENT, FIELD_TYPE_TIMESTAMP, Item::FUNC_ITEM, create_field::init(), my_error(), my_snprintf(), MYF, NAME_LEN, NOT_NULL_FLAG, Item_func::NOW_FUNC, Item::NULL_ITEM, NullS, PRI_KEY_FLAG, Key::PRIMARY, strlen(), Item::type(), Key::UNIQUE, UNIQUE_FLAG, UNIQUE_KEY_FLAG, and WARN_DEPRECATED.
06164 { 06165 register create_field *new_field; 06166 LEX *lex= thd->lex; 06167 DBUG_ENTER("add_field_to_list"); 06168 06169 if (strlen(field_name) > NAME_LEN) 06170 { 06171 my_error(ER_TOO_LONG_IDENT, MYF(0), field_name); /* purecov: inspected */ 06172 DBUG_RETURN(1); /* purecov: inspected */ 06173 } 06174 if (type_modifier & PRI_KEY_FLAG) 06175 { 06176 lex->col_list.push_back(new key_part_spec(field_name,0)); 06177 lex->key_list.push_back(new Key(Key::PRIMARY, NullS, 06178 &default_key_create_info, 06179 0, lex->col_list)); 06180 lex->col_list.empty(); 06181 } 06182 if (type_modifier & (UNIQUE_FLAG | UNIQUE_KEY_FLAG)) 06183 { 06184 lex->col_list.push_back(new key_part_spec(field_name,0)); 06185 lex->key_list.push_back(new Key(Key::UNIQUE, NullS, 06186 &default_key_create_info, 0, 06187 lex->col_list)); 06188 lex->col_list.empty(); 06189 } 06190 06191 if (default_value) 06192 { 06193 /* 06194 Default value should be literal => basic constants => 06195 no need fix_fields() 06196 06197 We allow only one function as part of default value - 06198 NOW() as default for TIMESTAMP type. 06199 */ 06200 if (default_value->type() == Item::FUNC_ITEM && 06201 !(((Item_func*)default_value)->functype() == Item_func::NOW_FUNC && 06202 type == FIELD_TYPE_TIMESTAMP)) 06203 { 06204 my_error(ER_INVALID_DEFAULT, MYF(0), field_name); 06205 DBUG_RETURN(1); 06206 } 06207 else if (default_value->type() == Item::NULL_ITEM) 06208 { 06209 default_value= 0; 06210 if ((type_modifier & (NOT_NULL_FLAG | AUTO_INCREMENT_FLAG)) == 06211 NOT_NULL_FLAG) 06212 { 06213 my_error(ER_INVALID_DEFAULT, MYF(0), field_name); 06214 DBUG_RETURN(1); 06215 } 06216 } 06217 else if (type_modifier & AUTO_INCREMENT_FLAG) 06218 { 06219 my_error(ER_INVALID_DEFAULT, MYF(0), field_name); 06220 DBUG_RETURN(1); 06221 } 06222 } 06223 06224 if (on_update_value && type != FIELD_TYPE_TIMESTAMP) 06225 { 06226 my_error(ER_INVALID_ON_UPDATE, MYF(0), field_name); 06227 DBUG_RETURN(1); 06228 } 06229 06230 if (type == FIELD_TYPE_TIMESTAMP && length) 06231 { 06232 /* Display widths are no longer supported for TIMSTAMP as of MySQL 4.1. 06233 In other words, for declarations such as TIMESTAMP(2), TIMESTAMP(4), 06234 and so on, the display width is ignored. 06235 */ 06236 char buf[32]; 06237 my_snprintf(buf, sizeof(buf), "TIMESTAMP(%s)", length); 06238 WARN_DEPRECATED(thd, "5.2", buf, "'TIMESTAMP'"); 06239 } 06240 06241 if (!(new_field= new create_field()) || 06242 new_field->init(thd, field_name, type, length, decimals, type_modifier, 06243 default_value, on_update_value, comment, change, 06244 interval_list, cs, uint_geom_type)) 06245 DBUG_RETURN(1); 06246 06247 lex->create_list.push_back(new_field); 06248 lex->last_field=new_field; 06249 DBUG_RETURN(0); 06250 }
Here is the call graph for this function:

| void add_join_natural | ( | TABLE_LIST * | a, | |
| TABLE_LIST * | b, | |||
| List< String > * | using_fields | |||
| ) |
Definition at line 6912 of file sql_parse.cc.
References st_table_list::join_using_fields, and st_table_list::natural_join.
06913 { 06914 b->natural_join= a; 06915 b->join_using_fields= using_fields; 06916 }
| void add_join_on | ( | TABLE_LIST * | b, | |
| Item * | expr | |||
| ) |
Definition at line 6855 of file sql_parse.cc.
References st_table_list::on_expr, and Item::top_level_item().
Referenced by mark_common_columns().
06856 { 06857 if (expr) 06858 { 06859 if (!b->on_expr) 06860 b->on_expr= expr; 06861 else 06862 { 06863 /* 06864 If called from the parser, this happens if you have both a 06865 right and left join. If called later, it happens if we add more 06866 than one condition to the ON clause. 06867 */ 06868 b->on_expr= new Item_cond_and(b->on_expr,expr); 06869 } 06870 b->on_expr->top_level_item(); 06871 } 06872 }
Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 6261 of file sql_parse.cc.
References order.
06262 { 06263 ORDER *order; 06264 Item **item_ptr; 06265 06266 if (!(order = (ORDER *) thd->alloc(sizeof(ORDER)+sizeof(Item*)))) 06267 return 1; 06268 item_ptr = (Item**) (order+1); 06269 *item_ptr= item; 06270 order->item=item_ptr; 06271 order->free_me=0; 06272 thd->lex->proc_list.link_in_list((byte*) order,(byte**) &order->next); 06273 return 0; 06274 }
Definition at line 6312 of file sql_parse.cc.
References DBUG_ENTER, DBUG_RETURN, list(), and order.
Referenced by trx_undo_mem_create_at_db_start().
06313 { 06314 ORDER *order; 06315 DBUG_ENTER("add_to_list"); 06316 if (!(order = (ORDER *) thd->alloc(sizeof(ORDER)))) 06317 DBUG_RETURN(1); 06318 order->item_ptr= item; 06319 order->item= &order->item_ptr; 06320 order->asc = asc; 06321 order->free_me=0; 06322 order->used=0; 06323 order->counter_used= 0; 06324 list.link_in_list((byte*) order,(byte**) &order->next); 06325 DBUG_RETURN(0); 06326 }
Here is the call graph for this function:

Here is the caller graph for this function:

| Item* all_any_subquery_creator | ( | Item * | left_expr, | |
| chooser_compare_func_creator | cmp, | |||
| bool | all, | |||
| SELECT_LEX * | select_lex | |||
| ) |
Definition at line 7282 of file sql_parse.cc.
References comp_eq_creator(), comp_ne_creator(), and Item_in_subselect::upper_item.
07286 { 07287 if ((cmp == &comp_eq_creator) && !all) // = ANY <=> IN 07288 return new Item_in_subselect(left_expr, select_lex); 07289 07290 if ((cmp == &comp_ne_creator) && all) // <> ALL <=> NOT IN 07291 return new Item_func_not(new Item_in_subselect(left_expr, select_lex)); 07292 07293 Item_allany_subselect *it= 07294 new Item_allany_subselect(left_expr, cmp, select_lex, all); 07295 if (all) 07296 return it->upper_item= new Item_func_not_all(it); /* ALL */ 07297 07298 return it->upper_item= new Item_func_nop_all(it); /* ANY/SOME */ 07299 }
Here is the call graph for this function:

Definition at line 2397 of file sql_parse.cc.
References FALSE, my_isspace, pos(), and TRUE.
Referenced by dispatch_command(), Prepared_statement::execute(), sp_instr_stmt::execute(), and Prepared_statement::prepare().
02398 { 02399 packet_length--; // Remove end null 02400 /* Remove garbage at start and end of query */ 02401 while (my_isspace(thd->charset(),packet[0]) && packet_length > 0) 02402 { 02403 packet++; 02404 packet_length--; 02405 } 02406 const char *pos= packet + packet_length; // Point at end null 02407 while (packet_length > 0 && 02408 (pos[-1] == ';' || my_isspace(thd->charset() ,pos[-1]))) 02409 { 02410 pos--; 02411 packet_length--; 02412 } 02413 /* We must allocate some extra memory for query cache */ 02414 thd->query_length= 0; // Extra safety: Avoid races 02415 if (!(thd->query= (char*) thd->memdup_w_gap((gptr) (packet), 02416 packet_length, 02417 thd->db_length+ 1 + 02418 QUERY_CACHE_FLAGS_SIZE))) 02419 return TRUE; 02420 thd->query[packet_length]=0; 02421 thd->query_length= packet_length; 02422 02423 /* Reclaim some memory */ 02424 thd->packet.shrink(thd->variables.net_buffer_length); 02425 thd->convert_buffer.shrink(thd->variables.net_buffer_length); 02426 02427 return FALSE; 02428 }
Here is the call graph for this function:

Here is the caller graph for this function:

| bool append_file_to_dir | ( | THD * | thd, | |
| const char ** | filename_ptr, | |||
| const char * | table_name | |||
| ) |
Definition at line 7181 of file sql_parse.cc.
References convert_dirname(), ER_WRONG_TABLE_NAME, FN_REFLEN, my_error(), MYF, NullS, strlen(), strmov(), strxmov(), and test_if_hard_path().
Referenced by mysql_execute_command().
07183 { 07184 char buff[FN_REFLEN],*ptr, *end; 07185 if (!*filename_ptr) 07186 return 0; // nothing to do 07187 07188 /* Check that the filename is not too long and it's a hard path */ 07189 if (strlen(*filename_ptr)+strlen(table_name) >= FN_REFLEN-1 || 07190 !test_if_hard_path(*filename_ptr)) 07191 { 07192 my_error(ER_WRONG_TABLE_NAME, MYF(0), *filename_ptr); 07193 return 1; 07194 } 07195 /* Fix is using unix filename format on dos */ 07196 strmov(buff,*filename_ptr); 07197 end=convert_dirname(buff, *filename_ptr, NullS); 07198 if (!(ptr=thd->alloc((uint) (end-buff)+(uint) strlen(table_name)+1))) 07199 return 1; // End of memory 07200 *filename_ptr=ptr; 07201 strxmov(ptr,buff,table_name,NullS); 07202 return 0; 07203 }
Here is the call graph for this function:

Here is the caller graph for this function:

| bool begin_trans | ( | THD * | thd | ) |
Definition at line 170 of file sql_parse.cc.
References close_thread_tables(), end_active_trans(), ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, error, ha_start_consistent_snapshot(), my_error(), MYF, MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT, OPTION_BEGIN, SERVER_STATUS_IN_TRANS, and unlikely.
00171 { 00172 int error=0; 00173 if (unlikely(thd->in_sub_stmt)) 00174 { 00175 my_error(ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG, MYF(0)); 00176 return 1; 00177 } 00178 if (thd->locked_tables) 00179 { 00180 thd->lock=thd->locked_tables; 00181 thd->locked_tables=0; // Will be automatically closed 00182 close_thread_tables(thd); // Free tables 00183 } 00184 if (end_active_trans(thd)) 00185 error= -1; 00186 else 00187 { 00188 LEX *lex= thd->lex; 00189 thd->options|= OPTION_BEGIN; 00190 thd->server_status|= SERVER_STATUS_IN_TRANS; 00191 if (lex->start_transaction_opt & MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT) 00192 error= ha_start_consistent_snapshot(thd); 00193 } 00194 return error; 00195 }
Here is the call graph for this function:

| bool check_access | ( | THD * | thd, | |
| ulong | want_access, | |||
| const char * | db, | |||
| ulong * | save_priv, | |||
| bool | dont_check_global_grants, | |||
| bool | no_errors, | |||
| bool | schema_db | |||
| ) |
Definition at line 5387 of file sql_parse.cc.
References acl_get(), any_db, DB_ACLS, DBUG_ENTER, DBUG_PRINT, DBUG_RETURN, ER, ER_ACCESS_DENIED_ERROR, ER_DBACCESS_DENIED_ERROR, ER_NO, ER_NO_DB_ERROR, ER_YES, EXTRA_ACL, FALSE, GRANT_ACL, grant_option, my_error(), my_message(), MYF, PROC_ACLS, SELECT_ACL, strcmp(), TABLE_ACLS, test, and TRUE.
Referenced by check_change_password(), check_routine_access(), check_single_table_access(), check_some_access(), check_some_routine_access(), check_table_access(), copy_event_to_schema_table(), create_table_precheck(), dispatch_command(), Event_timed::execute(), fill_schema_column_privileges(), fill_schema_events(), fill_schema_schema_privileges(), fill_schema_table_privileges(), fill_schema_user_privileges(), get_all_tables(), get_schema_column_record(), multi_update_precheck(), mysql_create_view(), mysql_execute_command(), mysql_test_select(), and prepare_schema_table().
05389 { 05390 Security_context *sctx= thd->security_ctx; 05391 #ifndef NO_EMBEDDED_ACCESS_CHECKS 05392 ulong db_access; 05393 bool db_is_pattern= test(want_access & GRANT_ACL); 05394 #endif 05395 ulong dummy; 05396 DBUG_ENTER("check_access"); 05397 DBUG_PRINT("enter",("db: %s want_access: %lu master_access: %lu", 05398 db ? db : "", want_access, sctx->master_access)); 05399 if (save_priv) 05400 *save_priv=0; 05401 else 05402 save_priv= &dummy; 05403 05404 if ((!db || !db[0]) && !thd->db && !dont_check_global_grants) 05405 { 05406 DBUG_PRINT("error",("No database")); 05407 if (!no_errors) 05408 my_message(ER_NO_DB_ERROR, ER(ER_NO_DB_ERROR), 05409 MYF(0)); /* purecov: tested */ 05410 DBUG_RETURN(TRUE); /* purecov: tested */ 05411 } 05412 05413 if (schema_db) 05414 { 05415 if (want_access & ~(SELECT_ACL | EXTRA_ACL)) 05416 { 05417 if (!no_errors) 05418 { 05419 const char *db_name= db ? db : thd->db; 05420 my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), 05421 sctx->priv_user, sctx->priv_host, db_name); 05422 } 05423 DBUG_RETURN(TRUE); 05424 } 05425 else 05426 { 05427 *save_priv= SELECT_ACL; 05428 DBUG_RETURN(FALSE); 05429 } 05430 } 05431 05432 #ifdef NO_EMBEDDED_ACCESS_CHECKS 05433 DBUG_RETURN(0); 05434 #else 05435 if ((sctx->master_access & want_access) == want_access) 05436 { 05437 /* 05438 If we don't have a global SELECT privilege, we have to get the database 05439 specific access rights to be able to handle queries of type 05440 UPDATE t1 SET a=1 WHERE b > 0 05441 */ 05442 db_access= sctx->db_access; 05443 if (!(sctx->master_access & SELECT_ACL) && 05444 (

