sql_parse.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:167k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1.     if (unit->select_limit_cnt < select_lex->select_limit)
  2.       unit->select_limit_cnt= HA_POS_ERROR; // No limit
  3.     if (find_real_table_in_list(tables->next, tables->db, tables->real_name))
  4.     {
  5.       /* Using same table for INSERT and SELECT */
  6.       select_lex->options |= OPTION_BUFFER_RESULT;
  7.     }
  8.     if ((res= open_and_lock_tables(thd, tables)))
  9.       break;
  10.       
  11.     insert_table= tables->table;
  12.     /* Skip first table, which is the table we are inserting in */
  13.     select_lex->table_list.first= (byte*) first_local_table->next;
  14.     tables= (TABLE_LIST *) select_lex->table_list.first;
  15.     dup_tables= *first_local_table;
  16.     first_local_table->next= 0;
  17.     if (select_lex->group_list.elements != 0)
  18.     {
  19.       /*
  20.         When we are using GROUP BY we can't refere to other tables in the
  21.         ON DUPLICATE KEY part
  22.       */         
  23.       dup_tables.next= 0;
  24.     }
  25.     if (!(res= mysql_prepare_insert(thd, tables, first_local_table,
  26.     &dup_tables, insert_table,
  27.                                     lex->field_list, 0,
  28.     lex->update_list, lex->value_list,
  29.     lex->duplicates)) &&
  30.         (result= new select_insert(insert_table, first_local_table,
  31.    &dup_tables, &lex->field_list,
  32.    &lex->update_list, &lex->value_list,
  33.                                    lex->duplicates, lex->ignore)))
  34.     {
  35.       /*
  36.         insert/replace from SELECT give its SELECT_LEX for SELECT,
  37.         and item_list belong to SELECT
  38.       */
  39.       lex->select_lex.resolve_mode= SELECT_LEX::SELECT_MODE;
  40.       res= handle_select(thd, lex, result);
  41.       /* revert changes for SP */
  42.       lex->select_lex.resolve_mode= SELECT_LEX::INSERT_MODE;
  43.       delete result;
  44.       if (thd->net.report_error)
  45.         res= -1;
  46.     }
  47.     else
  48.       res= -1;
  49.     insert_table->insert_values= 0;        // Set by mysql_prepare_insert()
  50.     first_local_table->next= tables;
  51.     lex->select_lex.table_list.first= (byte*) first_local_table;
  52.     break;
  53.   }
  54.   case SQLCOM_TRUNCATE:
  55.     if (end_active_trans(thd))
  56.     {
  57.       res= -1;
  58.       break;
  59.     }
  60.     if (check_one_table_access(thd, DELETE_ACL, tables))
  61.       goto error;
  62.     /*
  63.       Don't allow this within a transaction because we want to use
  64.       re-generate table
  65.     */
  66.     if (thd->locked_tables || thd->active_transaction())
  67.     {
  68.       send_error(thd,ER_LOCK_OR_ACTIVE_TRANSACTION,NullS);
  69.       goto error;
  70.     }
  71.     res=mysql_truncate(thd, tables, 0);
  72.     break;
  73.   case SQLCOM_DELETE:
  74.   {
  75.     if ((res= delete_precheck(thd, tables)))
  76.       break;
  77.     res = mysql_delete(thd,tables, select_lex->where,
  78.                        &select_lex->order_list,
  79.                        select_lex->select_limit, select_lex->options);
  80.     if (thd->net.report_error)
  81.       res= -1;
  82.     break;
  83.   }
  84.   case SQLCOM_DELETE_MULTI:
  85.   {
  86.     TABLE_LIST *aux_tables=
  87.       (TABLE_LIST *)thd->lex->auxilliary_table_list.first;
  88.     TABLE_LIST *target_tbl;
  89.     uint table_count;
  90.     multi_delete *result;
  91.     if ((res= multi_delete_precheck(thd, tables, &table_count)))
  92.       break;
  93.     /* condition will be TRUE on SP re-excuting */
  94.     if (select_lex->item_list.elements != 0)
  95.       select_lex->item_list.empty();
  96.     if (add_item_to_list(thd, new Item_null()))
  97.     {
  98.       res= -1;
  99.       break;
  100.     }
  101.     thd->proc_info="init";
  102.     if ((res=open_and_lock_tables(thd,tables)))
  103.       break;
  104.     /* Fix tables-to-be-deleted-from list to point at opened tables */
  105.     for (target_tbl= (TABLE_LIST*) aux_tables;
  106.  target_tbl;
  107.  target_tbl= target_tbl->next)
  108.     {
  109.       TABLE_LIST *orig= target_tbl->table_list;
  110.       target_tbl->table= orig->table;
  111.       /*
  112.  Multi-delete can't be constructed over-union => we always have
  113.  single SELECT on top and have to check underlying SELECTs of it
  114.       */
  115.       if (lex->select_lex.check_updateable_in_subqueries(orig->db,
  116.                                                          orig->real_name))
  117.       {
  118.         my_error(ER_UPDATE_TABLE_USED, MYF(0),
  119.                  orig->real_name);
  120.         res= -1;
  121.         break;
  122.       }
  123.     }
  124.     if (!thd->is_fatal_error && (result= new multi_delete(thd,aux_tables,
  125.   table_count)))
  126.     {
  127.       res= mysql_select(thd, &select_lex->ref_pointer_array,
  128. select_lex->get_table_list(),
  129. select_lex->with_wild,
  130. select_lex->item_list,
  131. select_lex->where,
  132. 0, (ORDER *)NULL, (ORDER *)NULL, (Item *)NULL,
  133. (ORDER *)NULL,
  134. select_lex->options | thd->options |
  135. SELECT_NO_JOIN_CACHE | SELECT_NO_UNLOCK,
  136. result, unit, select_lex);
  137.       if (thd->net.report_error)
  138. res= -1;
  139.       delete result;
  140.     }
  141.     else
  142.       res= -1; // Error is not sent
  143.     close_thread_tables(thd);
  144.     break;
  145.   }
  146.   case SQLCOM_DROP_TABLE:
  147.   {
  148.     if (!lex->drop_temporary)
  149.     {
  150.       if (check_table_access(thd,DROP_ACL,tables,0))
  151. goto error; /* purecov: inspected */
  152.       if (end_active_trans(thd))
  153.       {
  154. res= -1;
  155. break;
  156.       }
  157.     }
  158.     else
  159.     {
  160.       /*
  161. If this is a slave thread, we may sometimes execute some 
  162. DROP / * 40005 TEMPORARY * / TABLE
  163. that come from parts of binlogs (likely if we use RESET SLAVE or CHANGE
  164. MASTER TO), while the temporary table has already been dropped.
  165. To not generate such irrelevant "table does not exist errors",
  166. we silently add IF EXISTS if TEMPORARY was used.
  167.       */
  168.       if (thd->slave_thread)
  169. lex->drop_if_exists= 1;
  170.       /* So that DROP TEMPORARY TABLE gets to binlog at commit/rollback */
  171.       thd->options|= OPTION_STATUS_NO_TRANS_UPDATE;
  172.     }
  173.     res= mysql_rm_table(thd,tables,lex->drop_if_exists, lex->drop_temporary);
  174.   }
  175.   break;
  176.   case SQLCOM_DROP_INDEX:
  177.     if (check_one_table_access(thd, INDEX_ACL, tables))
  178.       goto error; /* purecov: inspected */
  179.     if (end_active_trans(thd))
  180.       res= -1;
  181.     else
  182.       res = mysql_drop_index(thd, tables, &lex->alter_info);
  183.     break;
  184.   case SQLCOM_SHOW_DATABASES:
  185. #if defined(DONT_ALLOW_SHOW_COMMANDS)
  186.     send_error(thd,ER_NOT_ALLOWED_COMMAND);   /* purecov: inspected */
  187.     DBUG_VOID_RETURN;
  188. #else
  189.     if ((specialflag & SPECIAL_SKIP_SHOW_DB) &&
  190. check_global_access(thd, SHOW_DB_ACL))
  191.       goto error;
  192.     res= mysqld_show_dbs(thd, (lex->wild ? lex->wild->ptr() : NullS));
  193.     break;
  194. #endif
  195.   case SQLCOM_SHOW_PROCESSLIST:
  196.     if (!thd->priv_user[0] && check_global_access(thd,PROCESS_ACL))
  197.       break;
  198.     mysqld_list_processes(thd,
  199.   thd->master_access & PROCESS_ACL ? NullS :
  200.   thd->priv_user,lex->verbose);
  201.     break;
  202.   case SQLCOM_SHOW_STORAGE_ENGINES:
  203.     res= mysqld_show_storage_engines(thd);
  204.     break;
  205.   case SQLCOM_SHOW_PRIVILEGES:
  206.     res= mysqld_show_privileges(thd);
  207.     break;
  208.   case SQLCOM_SHOW_COLUMN_TYPES:
  209.     res= mysqld_show_column_types(thd);
  210.     break;
  211.   case SQLCOM_SHOW_STATUS:
  212.     res= mysqld_show(thd,(lex->wild ? lex->wild->ptr() : NullS),status_vars,
  213.      OPT_GLOBAL, &LOCK_status);
  214.     break;
  215.   case SQLCOM_SHOW_VARIABLES:
  216.     res= mysqld_show(thd, (lex->wild ? lex->wild->ptr() : NullS),
  217.      init_vars, lex->option_type,
  218.      &LOCK_global_system_variables);
  219.     break;
  220.   case SQLCOM_SHOW_LOGS:
  221. #ifdef DONT_ALLOW_SHOW_COMMANDS
  222.     send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */
  223.     DBUG_VOID_RETURN;
  224. #else
  225.     {
  226.       if (grant_option && check_access(thd, FILE_ACL, any_db,0,0,0))
  227. goto error;
  228.       res= mysqld_show_logs(thd);
  229.       break;
  230.     }
  231. #endif
  232.   case SQLCOM_SHOW_TABLES:
  233.     /* FALL THROUGH */
  234. #ifdef DONT_ALLOW_SHOW_COMMANDS
  235.     send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */
  236.     DBUG_VOID_RETURN;
  237. #else
  238.     {
  239.       char *db=select_lex->db ? select_lex->db : thd->db;
  240.       if (!db)
  241.       {
  242. send_error(thd,ER_NO_DB_ERROR); /* purecov: inspected */
  243. goto error; /* purecov: inspected */
  244.       }
  245.       remove_escape(db); // Fix escaped '_'
  246.       if (check_db_name(db))
  247.       {
  248.         net_printf(thd,ER_WRONG_DB_NAME, db);
  249.         goto error;
  250.       }
  251.       if (check_access(thd,SELECT_ACL,db,&thd->col_access,0,0))
  252. goto error; /* purecov: inspected */
  253.       if (!thd->col_access && check_grant_db(thd,db))
  254.       {
  255. net_printf(thd, ER_DBACCESS_DENIED_ERROR,
  256.    thd->priv_user,
  257.    thd->priv_host,
  258.    db);
  259. goto error;
  260.       }
  261.       /* grant is checked in mysqld_show_tables */
  262.       if (lex->describe)
  263.         res= mysqld_extend_show_tables(thd,db,
  264.        (lex->wild ? lex->wild->ptr() : NullS));
  265.       else
  266. res= mysqld_show_tables(thd,db,
  267. (lex->wild ? lex->wild->ptr() : NullS));
  268.       break;
  269.     }
  270. #endif
  271.   case SQLCOM_SHOW_OPEN_TABLES:
  272.     res= mysqld_show_open_tables(thd,(lex->wild ? lex->wild->ptr() : NullS));
  273.     break;
  274.   case SQLCOM_SHOW_CHARSETS:
  275.     res= mysqld_show_charsets(thd,(lex->wild ? lex->wild->ptr() : NullS));
  276.     break;
  277.   case SQLCOM_SHOW_COLLATIONS:
  278.     res= mysqld_show_collations(thd,(lex->wild ? lex->wild->ptr() : NullS));
  279.     break;
  280.   case SQLCOM_SHOW_FIELDS:
  281. #ifdef DONT_ALLOW_SHOW_COMMANDS
  282.     send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */
  283.     DBUG_VOID_RETURN;
  284. #else
  285.     {
  286.       char *db=tables->db;
  287.       remove_escape(db); // Fix escaped '_'
  288.       remove_escape(tables->real_name);
  289.       if (check_access(thd,SELECT_ACL | EXTRA_ACL,db,
  290.        &tables->grant.privilege, 0, 0))
  291. goto error; /* purecov: inspected */
  292.       if (grant_option && check_grant(thd, SELECT_ACL, tables, 2, UINT_MAX, 0))
  293. goto error;
  294.       res= mysqld_show_fields(thd,tables,
  295.       (lex->wild ? lex->wild->ptr() : NullS),
  296.       lex->verbose);
  297.       break;
  298.     }
  299. #endif
  300.   case SQLCOM_SHOW_KEYS:
  301. #ifdef DONT_ALLOW_SHOW_COMMANDS
  302.     send_error(thd,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */
  303.     DBUG_VOID_RETURN;
  304. #else
  305.     {
  306.       char *db=tables->db;
  307.       remove_escape(db); // Fix escaped '_'
  308.       remove_escape(tables->real_name);
  309.       if (check_access(thd,SELECT_ACL | EXTRA_ACL,db,
  310.        &tables->grant.privilege, 0, 0))
  311. goto error; /* purecov: inspected */
  312.       if (grant_option && check_grant(thd, SELECT_ACL, tables, 2, UINT_MAX, 0))
  313. goto error;
  314.       res= mysqld_show_keys(thd,tables);
  315.       break;
  316.     }
  317. #endif
  318.   case SQLCOM_CHANGE_DB:
  319.     mysql_change_db(thd,select_lex->db);
  320.     break;
  321.   case SQLCOM_LOAD:
  322.   {
  323.     uint privilege= (lex->duplicates == DUP_REPLACE ?
  324.      INSERT_ACL | DELETE_ACL : INSERT_ACL);
  325.     if (!lex->local_file)
  326.     {
  327.       if (check_access(thd,privilege | FILE_ACL,tables->db,0,0,0))
  328. goto error;
  329.     }
  330.     else
  331.     {
  332.       if (!(thd->client_capabilities & CLIENT_LOCAL_FILES) ||
  333.   ! opt_local_infile)
  334.       {
  335. send_error(thd,ER_NOT_ALLOWED_COMMAND);
  336. goto error;
  337.       }
  338.       if (check_one_table_access(thd, privilege, tables))
  339. goto error;
  340.     }
  341.     res=mysql_load(thd, lex->exchange, tables, lex->field_list,
  342.    lex->duplicates, lex->ignore, (bool) lex->local_file, lex->lock_option);
  343.     break;
  344.   }
  345.   case SQLCOM_SET_OPTION:
  346.   {
  347.     List<set_var_base> *lex_var_list= &lex->var_list;
  348.     if (tables && ((res= check_table_access(thd, SELECT_ACL, tables,0)) ||
  349.    (res= open_and_lock_tables(thd,tables))))
  350.       break;
  351.     if (lex->one_shot_set && not_all_support_one_shot(lex_var_list))
  352.     {
  353.       my_printf_error(0, "The SET ONE_SHOT syntax is reserved for 
  354. purposes internal to the MySQL server", MYF(0));
  355.       res= -1;
  356.       break;
  357.     }
  358.     if (!(res= sql_set_variables(thd, lex_var_list)))
  359.     {
  360.       /*
  361.         If the previous command was a SET ONE_SHOT, we don't want to forget
  362.         about the ONE_SHOT property of that SET. So we use a |= instead of = .
  363.       */
  364.       thd->one_shot_set|= lex->one_shot_set;
  365.       send_ok(thd);
  366.     }
  367.     if (thd->net.report_error)
  368.       res= -1;
  369.     break;
  370.   }
  371.   case SQLCOM_UNLOCK_TABLES:
  372.     /*
  373.       It is critical for mysqldump --single-transaction --master-data that
  374.       UNLOCK TABLES does not implicitely commit a connection which has only
  375.       done FLUSH TABLES WITH READ LOCK + BEGIN. If this assumption becomes
  376.       false, mysqldump will not work.
  377.     */
  378.     unlock_locked_tables(thd);
  379.     if (thd->options & OPTION_TABLE_LOCK)
  380.     {
  381.       end_active_trans(thd);
  382.       thd->options&= ~(ulong) (OPTION_TABLE_LOCK);
  383.     }
  384.     if (thd->global_read_lock)
  385.       unlock_global_read_lock(thd);
  386.     send_ok(thd);
  387.     break;
  388.   case SQLCOM_LOCK_TABLES:
  389.     unlock_locked_tables(thd);
  390.     if (check_db_used(thd,tables) || end_active_trans(thd))
  391.       goto error;
  392.     if (check_table_access(thd, LOCK_TABLES_ACL | SELECT_ACL, tables,0))
  393.       goto error;
  394.     thd->in_lock_tables=1;
  395.     thd->options|= OPTION_TABLE_LOCK;
  396.     if (!(res= open_and_lock_tables(thd, tables)))
  397.     {
  398. #ifdef HAVE_QUERY_CACHE
  399.       if (thd->variables.query_cache_wlock_invalidate)
  400. query_cache.invalidate_locked_for_write(tables);
  401. #endif /*HAVE_QUERY_CACHE*/
  402.       thd->locked_tables=thd->lock;
  403.       thd->lock=0;
  404.       send_ok(thd);
  405.     }
  406.     else
  407.       thd->options&= ~(ulong) (OPTION_TABLE_LOCK);
  408.     thd->in_lock_tables=0;
  409.     break;
  410.   case SQLCOM_CREATE_DB:
  411.   {
  412.     if (end_active_trans(thd))
  413.     {
  414.       res= -1;
  415.       break;
  416.     }
  417.     char *alias;
  418.     if (!(alias=thd->strdup(lex->name)) || check_db_name(lex->name))
  419.     {
  420.       net_printf(thd,ER_WRONG_DB_NAME, lex->name);
  421.       break;
  422.     }
  423.     /*
  424.       If in a slave thread :
  425.       CREATE DATABASE DB was certainly not preceded by USE DB.
  426.       For that reason, db_ok() in sql/slave.cc did not check the 
  427.       do_db/ignore_db. And as this query involves no tables, tables_ok()
  428.       above was not called. So we have to check rules again here.
  429.     */
  430. #ifdef HAVE_REPLICATION
  431.     if (thd->slave_thread && 
  432. (!db_ok(lex->name, replicate_do_db, replicate_ignore_db) ||
  433.  !db_ok_with_wild_table(lex->name)))
  434.     {
  435.       my_error(ER_SLAVE_IGNORED_TABLE, MYF(0));
  436.       break;
  437.     }
  438. #endif
  439.     if (check_access(thd,CREATE_ACL,lex->name,0,1,0))
  440.       break;
  441.     res= mysql_create_db(thd,(lower_case_table_names == 2 ? alias : lex->name),
  442.  &lex->create_info, 0);
  443.     break;
  444.   }
  445.   case SQLCOM_DROP_DB:
  446.   {
  447.     if (end_active_trans(thd))
  448.     {
  449.       res= -1;
  450.       break;
  451.     }
  452.     char *alias;
  453.     if (!(alias=thd->strdup(lex->name)) || check_db_name(lex->name))
  454.     {
  455.       net_printf(thd, ER_WRONG_DB_NAME, lex->name);
  456.       break;
  457.     }
  458.     /*
  459.       If in a slave thread :
  460.       DROP DATABASE DB may not be preceded by USE DB.
  461.       For that reason, maybe db_ok() in sql/slave.cc did not check the 
  462.       do_db/ignore_db. And as this query involves no tables, tables_ok()
  463.       above was not called. So we have to check rules again here.
  464.     */
  465. #ifdef HAVE_REPLICATION
  466.     if (thd->slave_thread && 
  467. (!db_ok(lex->name, replicate_do_db, replicate_ignore_db) ||
  468.  !db_ok_with_wild_table(lex->name)))
  469.     {
  470.       my_error(ER_SLAVE_IGNORED_TABLE, MYF(0));
  471.       break;
  472.     }
  473. #endif
  474.     if (check_access(thd,DROP_ACL,lex->name,0,1,0))
  475.       break;
  476.     if (thd->locked_tables || thd->active_transaction())
  477.     {
  478.       send_error(thd,ER_LOCK_OR_ACTIVE_TRANSACTION);
  479.       goto error;
  480.     }
  481.     res=mysql_rm_db(thd, (lower_case_table_names == 2 ? alias : lex->name),
  482.                     lex->drop_if_exists, 0);
  483.     break;
  484.   }
  485.   case SQLCOM_ALTER_DB:
  486.   {
  487.     char *db= lex->name ? lex->name : thd->db;
  488.     if (!db)
  489.     {
  490.       send_error(thd, ER_NO_DB_ERROR);
  491.       goto error;
  492.     }
  493.     if (!strip_sp(db) || check_db_name(db))
  494.     {
  495.       net_printf(thd, ER_WRONG_DB_NAME, db);
  496.       break;
  497.     }
  498.     /*
  499.       If in a slave thread :
  500.       ALTER DATABASE DB may not be preceded by USE DB.
  501.       For that reason, maybe db_ok() in sql/slave.cc did not check the
  502.       do_db/ignore_db. And as this query involves no tables, tables_ok()
  503.       above was not called. So we have to check rules again here.
  504.     */
  505. #ifdef HAVE_REPLICATION
  506.     if (thd->slave_thread &&
  507. (!db_ok(db, replicate_do_db, replicate_ignore_db) ||
  508.  !db_ok_with_wild_table(db)))
  509.     {
  510.       my_error(ER_SLAVE_IGNORED_TABLE, MYF(0));
  511.       break;
  512.     }
  513. #endif
  514.     if (check_access(thd, ALTER_ACL, db, 0, 1, 0))
  515.       break;
  516.     if (thd->locked_tables || thd->active_transaction())
  517.     {
  518.       send_error(thd,ER_LOCK_OR_ACTIVE_TRANSACTION);
  519.       goto error;
  520.     }
  521.     res= mysql_alter_db(thd, db, &lex->create_info);
  522.     break;
  523.   }
  524.   case SQLCOM_SHOW_CREATE_DB:
  525.   {
  526.     if (!strip_sp(lex->name) || check_db_name(lex->name))
  527.     {
  528.       net_printf(thd,ER_WRONG_DB_NAME, lex->name);
  529.       break;
  530.     }
  531.     if (check_access(thd,SELECT_ACL,lex->name,0,1,0))
  532.       break;
  533.     res=mysqld_show_create_db(thd,lex->name,&lex->create_info);
  534.     break;
  535.   }
  536.   case SQLCOM_CREATE_FUNCTION:
  537.     if (check_access(thd,INSERT_ACL,"mysql",0,1,0))
  538.       break;
  539. #ifdef HAVE_DLOPEN
  540.     if (!(res = mysql_create_function(thd,&lex->udf)))
  541.       send_ok(thd);
  542. #else
  543.     net_printf(thd, ER_CANT_OPEN_LIBRARY, lex->udf.dl, 0, "feature disabled");
  544.     res= -1;
  545. #endif
  546.     break;
  547.   case SQLCOM_DROP_FUNCTION:
  548.     if (check_access(thd,DELETE_ACL,"mysql",0,1,0))
  549.       break;
  550. #ifdef HAVE_DLOPEN
  551.     if (!(res = mysql_drop_function(thd,&lex->udf.name)))
  552.       send_ok(thd);
  553. #else
  554.     res= -1;
  555. #endif
  556.     break;
  557. #ifndef NO_EMBEDDED_ACCESS_CHECKS
  558.   case SQLCOM_DROP_USER:
  559.   {
  560.     if (check_access(thd, GRANT_ACL,"mysql",0,1,0))
  561.       break;
  562.     if (!(res= mysql_drop_user(thd, lex->users_list)))
  563.     {
  564.       mysql_update_log.write(thd, thd->query, thd->query_length);
  565.       if (mysql_bin_log.is_open())
  566.       {
  567. Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
  568. mysql_bin_log.write(&qinfo);
  569.       }
  570.       send_ok(thd);
  571.     }
  572.     break;
  573.   }
  574.   case SQLCOM_REVOKE_ALL:
  575.   {
  576.     if (check_access(thd, GRANT_ACL ,"mysql",0,1,0))
  577.       break;
  578.     if (!(res = mysql_revoke_all(thd, lex->users_list)))
  579.     {
  580.       mysql_update_log.write(thd, thd->query, thd->query_length);
  581.       if (mysql_bin_log.is_open())
  582.       {
  583. Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
  584. mysql_bin_log.write(&qinfo);
  585.       }
  586.       send_ok(thd);
  587.     }
  588.     break;
  589.   }
  590.   case SQLCOM_REVOKE:
  591.   case SQLCOM_GRANT:
  592.   {
  593.     if (check_access(thd, lex->grant | lex->grant_tot_col | GRANT_ACL,
  594.      tables ? tables->db : select_lex->db,
  595.      tables ? &tables->grant.privilege : 0,
  596.      tables ? 0 : 1, 0))
  597.       goto error;
  598.     /*
  599.       Check that the user isn't trying to change a password for another
  600.       user if he doesn't have UPDATE privilege to the MySQL database
  601.     */
  602.     if (thd->user) // If not replication
  603.     {
  604.       LEX_USER *user;
  605.       List_iterator <LEX_USER> user_list(lex->users_list);
  606.       while ((user=user_list++))
  607.       {
  608. if (user->password.str &&
  609.     (strcmp(thd->user,user->user.str) ||
  610.      user->host.str &&
  611.      my_strcasecmp(&my_charset_latin1,
  612.                            user->host.str, thd->host_or_ip)))
  613. {
  614.   if (check_access(thd, UPDATE_ACL, "mysql", 0, 1, 1))
  615.   {
  616.     send_error(thd, ER_PASSWORD_NOT_ALLOWED);
  617.     goto error;
  618.   }
  619.   break;   // We are allowed to do global changes
  620. }
  621.       }
  622.     }
  623.     if (specialflag & SPECIAL_NO_RESOLVE)
  624.     {
  625.       LEX_USER *user;
  626.       List_iterator <LEX_USER> user_list(lex->users_list);
  627.       while ((user=user_list++))
  628.       {
  629. if (hostname_requires_resolving(user->host.str))
  630.   push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
  631.       ER_WARN_HOSTNAME_WONT_WORK,
  632.       ER(ER_WARN_HOSTNAME_WONT_WORK),
  633.       user->host.str);
  634.       }
  635.     }
  636.     if (tables)
  637.     {
  638.       if (grant_option && check_grant(thd,
  639.       (lex->grant | lex->grant_tot_col |
  640.        GRANT_ACL),
  641.       tables, 0, UINT_MAX, 0))
  642. goto error;
  643.       if (!(res = mysql_table_grant(thd,tables,lex->users_list, lex->columns,
  644.     lex->grant,
  645.     lex->sql_command == SQLCOM_REVOKE)))
  646.       {
  647. mysql_update_log.write(thd, thd->query, thd->query_length);
  648. if (mysql_bin_log.is_open())
  649. {
  650.           thd->clear_error();
  651.   Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
  652.   mysql_bin_log.write(&qinfo);
  653. }
  654.       }
  655.     }
  656.     else
  657.     {
  658.       if (lex->columns.elements)
  659.       {
  660. send_error(thd,ER_ILLEGAL_GRANT_FOR_TABLE);
  661. res=1;
  662.       }
  663.       else
  664. res = mysql_grant(thd, select_lex->db, lex->users_list, lex->grant,
  665.   lex->sql_command == SQLCOM_REVOKE);
  666.       if (!res)
  667.       {
  668. mysql_update_log.write(thd, thd->query, thd->query_length);
  669. if (mysql_bin_log.is_open())
  670. {
  671.           thd->clear_error();
  672.   Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
  673.   mysql_bin_log.write(&qinfo);
  674. }
  675. if (mqh_used && lex->sql_command == SQLCOM_GRANT)
  676. {
  677.   List_iterator <LEX_USER> str_list(lex->users_list);
  678.   LEX_USER *user;
  679.   while ((user=str_list++))
  680.     reset_mqh(thd,user);
  681. }
  682.       }
  683.     }
  684.     break;
  685.   }
  686. #endif /*!NO_EMBEDDED_ACCESS_CHECKS*/
  687.   case SQLCOM_RESET:
  688.     /* 
  689.        RESET commands are never written to the binary log, so we have to
  690.        initialize this variable because RESET shares the same code as FLUSH
  691.     */
  692.     lex->no_write_to_binlog= 1;
  693.   case SQLCOM_FLUSH:
  694.   {
  695.     if (check_global_access(thd,RELOAD_ACL) || check_db_used(thd, tables))
  696.       goto error;
  697.     /*
  698.       reload_acl_and_cache() will tell us if we are allowed to write to the
  699.       binlog or not.
  700.     */
  701.     bool write_to_binlog;
  702.     if (reload_acl_and_cache(thd, lex->type, tables, &write_to_binlog))
  703.       send_error(thd, 0);
  704.     else
  705.     {
  706.       /*
  707.         We WANT to write and we CAN write.
  708.         ! we write after unlocking the table.
  709.       */
  710.       if (!lex->no_write_to_binlog && write_to_binlog)
  711.       {
  712.         mysql_update_log.write(thd, thd->query, thd->query_length);
  713.         if (mysql_bin_log.is_open())
  714.         {
  715.           Query_log_event qinfo(thd, thd->query, thd->query_length, 0, FALSE);
  716.           mysql_bin_log.write(&qinfo);
  717.         }
  718.       }
  719.       send_ok(thd);
  720.     }
  721.     break;
  722.   }
  723.   case SQLCOM_KILL:
  724.     kill_one_thread(thd,lex->thread_id);
  725.     break;
  726. #ifndef NO_EMBEDDED_ACCESS_CHECKS
  727.   case SQLCOM_SHOW_GRANTS:
  728.     res=0;
  729.     if ((thd->priv_user &&
  730.  !strcmp(thd->priv_user,lex->grant_user->user.str)) ||
  731. !check_access(thd, SELECT_ACL, "mysql",0,1,0))
  732.     {
  733.       res = mysql_show_grants(thd,lex->grant_user);
  734.     }
  735.     break;
  736. #endif
  737.   case SQLCOM_HA_OPEN:
  738.     if (check_db_used(thd,tables) ||
  739. check_table_access(thd,SELECT_ACL, tables,0))
  740.       goto error;
  741.     res = mysql_ha_open(thd, tables);
  742.     break;
  743.   case SQLCOM_HA_CLOSE:
  744.     if (check_db_used(thd,tables))
  745.       goto error;
  746.     res = mysql_ha_close(thd, tables);
  747.     break;
  748.   case SQLCOM_HA_READ:
  749.     /*
  750.       There is no need to check for table permissions here, because
  751.       if a user has no permissions to read a table, he won't be
  752.       able to open it (with SQLCOM_HA_OPEN) in the first place.
  753.     */
  754.     if (check_db_used(thd,tables))
  755.       goto error;
  756.     res = mysql_ha_read(thd, tables, lex->ha_read_mode, lex->backup_dir,
  757. lex->insert_list, lex->ha_rkey_mode, select_lex->where,
  758. select_lex->select_limit, select_lex->offset_limit);
  759.     break;
  760.   case SQLCOM_BEGIN:
  761.     if (thd->locked_tables)
  762.     {
  763.       thd->lock=thd->locked_tables;
  764.       thd->locked_tables=0; // Will be automaticly closed
  765.       close_thread_tables(thd); // Free tables
  766.     }
  767.     if (end_active_trans(thd))
  768.     {
  769.       res= -1;
  770.     }
  771.     else
  772.     {
  773.       thd->options= ((thd->options & (ulong) ~(OPTION_STATUS_NO_TRANS_UPDATE)) |
  774.      OPTION_BEGIN);
  775.       thd->server_status|= SERVER_STATUS_IN_TRANS;
  776.       if (!(lex->start_transaction_opt & MYSQL_START_TRANS_OPT_WITH_CONS_SNAPSHOT) ||
  777.           !(res= ha_start_consistent_snapshot(thd)))
  778.         send_ok(thd);
  779.     }
  780.     break;
  781.   case SQLCOM_COMMIT:
  782.     /*
  783.       We don't use end_active_trans() here to ensure that this works
  784.       even if there is a problem with the OPTION_AUTO_COMMIT flag
  785.       (Which of course should never happen...)
  786.     */
  787.   {
  788.     thd->options&= ~(ulong) (OPTION_BEGIN | OPTION_STATUS_NO_TRANS_UPDATE);
  789.     thd->server_status&= ~SERVER_STATUS_IN_TRANS;
  790.     if (!ha_commit(thd))
  791.     {
  792.       send_ok(thd);
  793.     }
  794.     else
  795.       res= -1;
  796.     break;
  797.   }
  798.   case SQLCOM_ROLLBACK:
  799.     thd->server_status&= ~SERVER_STATUS_IN_TRANS;
  800.     if (!ha_rollback(thd))
  801.     {
  802.       /*
  803.         If a non-transactional table was updated, warn; don't warn if this is a
  804.         slave thread (because when a slave thread executes a ROLLBACK, it has
  805.         been read from the binary log, so it's 100% sure and normal to produce
  806.         error ER_WARNING_NOT_COMPLETE_ROLLBACK. If we sent the warning to the
  807.         slave SQL thread, it would not stop the thread but just be printed in
  808.         the error log; but we don't want users to wonder why they have this
  809.         message in the error log, so we don't send it.
  810.       */
  811.       if ((thd->options & OPTION_STATUS_NO_TRANS_UPDATE) && !thd->slave_thread)
  812. send_warning(thd,ER_WARNING_NOT_COMPLETE_ROLLBACK,0);
  813.       else
  814. send_ok(thd);
  815.     }
  816.     else
  817.       res= -1;
  818.     thd->options&= ~(ulong) (OPTION_BEGIN | OPTION_STATUS_NO_TRANS_UPDATE);
  819.     break;
  820.   case SQLCOM_ROLLBACK_TO_SAVEPOINT:
  821.     if (!ha_rollback_to_savepoint(thd, lex->savepoint_name))
  822.     {
  823.       if ((thd->options & OPTION_STATUS_NO_TRANS_UPDATE) && !thd->slave_thread)
  824. send_warning(thd, ER_WARNING_NOT_COMPLETE_ROLLBACK, 0);
  825.       else
  826. send_ok(thd);
  827.     }
  828.     else
  829.       res= -1;
  830.     break;
  831.   case SQLCOM_SAVEPOINT:
  832.     if (!ha_savepoint(thd, lex->savepoint_name))
  833.       send_ok(thd);
  834.     else
  835.       res= -1;
  836.     break;
  837.   default: /* Impossible */
  838.     send_ok(thd);
  839.     break;
  840.   }
  841.   thd->proc_info="query end"; // QQ
  842.   /*
  843.     Reset system variables temporarily modified by SET ONE SHOT.
  844.     Exception: If this is a SET, do nothing. This is to allow
  845.     mysqlbinlog to print many SET commands (in this case we want the
  846.     charset temp setting to live until the real query). This is also
  847.     needed so that SET CHARACTER_SET_CLIENT... does not cancel itself
  848.     immediately.
  849.   */
  850.   if (thd->one_shot_set && lex->sql_command != SQLCOM_SET_OPTION)
  851.     reset_one_shot_variables(thd);
  852.   if (res < 0)
  853.     send_error(thd,thd->killed ? ER_SERVER_SHUTDOWN : 0);
  854. error:
  855.   DBUG_VOID_RETURN;
  856. }
  857. /*
  858.   Check grants for commands which work only with one table and all other
  859.   tables belonging to subselects or implicitly opened tables.
  860.   SYNOPSIS
  861.     check_one_table_access()
  862.     thd Thread handler
  863.     privilege requested privelage
  864.     tables table list of command
  865.   RETURN
  866.     0 - OK
  867.     1 - access denied, error is sent to client
  868. */
  869. int check_one_table_access(THD *thd, ulong privilege, TABLE_LIST *tables)
  870. {
  871.   if (check_access(thd, privilege, tables->db, &tables->grant.privilege,0,0))
  872.     return 1;
  873.   /* Show only 1 table for check_grant */
  874.   if (grant_option && check_grant(thd, privilege, tables, 0, 1, 0))
  875.     return 1;
  876.   /* Check rights on tables of subselects and implictly opened tables */
  877.   TABLE_LIST *subselects_tables;
  878.   if ((subselects_tables= tables->next))
  879.   {
  880.     if ((check_table_access(thd, SELECT_ACL, subselects_tables,0)))
  881.       return 1;
  882.   }
  883.   return 0;
  884. }
  885. /****************************************************************************
  886.   Get the user (global) and database privileges for all used tables
  887.   NOTES
  888.     The idea of EXTRA_ACL is that one will be granted access to the table if
  889.     one has the asked privilege on any column combination of the table; For
  890.     example to be able to check a table one needs to have SELECT privilege on
  891.     any column of the table.
  892.   RETURN
  893.     0  ok
  894.     1  If we can't get the privileges and we don't use table/column grants.
  895.     save_priv In this we store global and db level grants for the table
  896. Note that we don't store db level grants if the global grants
  897.                 is enough to satisfy the request and the global grants contains
  898.                 a SELECT grant.
  899. ****************************************************************************/
  900. bool
  901. check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
  902.      bool dont_check_global_grants, bool no_errors)
  903. {
  904.   DBUG_ENTER("check_access");
  905.   DBUG_PRINT("enter",("db: '%s'  want_access: %lu  master_access: %lu",
  906.                       db ? db : "", want_access, thd->master_access));
  907. #ifndef NO_EMBEDDED_ACCESS_CHECKS
  908.   ulong db_access;
  909.   bool  db_is_pattern= test(want_access & GRANT_ACL);
  910. #endif
  911.   ulong dummy;
  912.   if (save_priv)
  913.     *save_priv=0;
  914.   else
  915.     save_priv= &dummy;
  916.   if ((!db || !db[0]) && !thd->db && !dont_check_global_grants)
  917.   {
  918.     if (!no_errors)
  919.       send_error(thd,ER_NO_DB_ERROR); /* purecov: tested */
  920.     DBUG_RETURN(TRUE); /* purecov: tested */
  921.   }
  922. #ifdef NO_EMBEDDED_ACCESS_CHECKS
  923.   DBUG_RETURN(0);
  924. #else
  925.   if ((thd->master_access & want_access) == want_access)
  926.   {
  927.     /*
  928.       If we don't have a global SELECT privilege, we have to get the database
  929.       specific access rights to be able to handle queries of type
  930.       UPDATE t1 SET a=1 WHERE b > 0
  931.     */
  932.     db_access= thd->db_access;
  933.     if (!(thd->master_access & SELECT_ACL) &&
  934. (db && (!thd->db || db_is_pattern || strcmp(db,thd->db))))
  935.       db_access=acl_get(thd->host, thd->ip, thd->priv_user, db, db_is_pattern);
  936.     *save_priv=thd->master_access | db_access;
  937.     DBUG_RETURN(FALSE);
  938.   }
  939.   if (((want_access & ~thd->master_access) & ~(DB_ACLS | EXTRA_ACL)) ||
  940.       ! db && dont_check_global_grants)
  941.   { // We can never grant this
  942.     if (!no_errors)
  943.       net_printf(thd,ER_ACCESS_DENIED_ERROR,
  944.  thd->priv_user,
  945.  thd->priv_host,
  946.  thd->password ? ER(ER_YES) : ER(ER_NO));/* purecov: tested */
  947.     DBUG_RETURN(TRUE); /* purecov: tested */
  948.   }
  949.   if (db == any_db)
  950.     DBUG_RETURN(FALSE); // Allow select on anything
  951.   if (db && (!thd->db || db_is_pattern || strcmp(db,thd->db)))
  952.     db_access=acl_get(thd->host, thd->ip, thd->priv_user, db, db_is_pattern);
  953.   else
  954.     db_access=thd->db_access;
  955.   DBUG_PRINT("info",("db_access: %lu", db_access));
  956.   /* Remove SHOW attribute and access rights we already have */
  957.   want_access &= ~(thd->master_access | EXTRA_ACL);
  958.   db_access= ((*save_priv=(db_access | thd->master_access)) & want_access);
  959.   /* grant_option is set if there exists a single table or column grant */
  960.   if (db_access == want_access ||
  961.       ((grant_option && !dont_check_global_grants) &&
  962.        !(want_access & ~(db_access | TABLE_ACLS))))
  963.     DBUG_RETURN(FALSE); /* Ok */
  964.   if (!no_errors)
  965.     net_printf(thd,ER_DBACCESS_DENIED_ERROR,
  966.        thd->priv_user,
  967.        thd->priv_host,
  968.        db ? db : thd->db ? thd->db : "unknown"); /* purecov: tested */
  969.   DBUG_RETURN(TRUE); /* purecov: tested */
  970. #endif /* NO_EMBEDDED_ACCESS_CHECKS */
  971. }
  972. /*
  973.   check for global access and give descriptive error message if it fails
  974.   SYNOPSIS
  975.     check_global_access()
  976.     thd Thread handler
  977.     want_access Use should have any of these global rights
  978.   WARNING
  979.     One gets access rigth if one has ANY of the rights in want_access
  980.     This is useful as one in most cases only need one global right,
  981.     but in some case we want to check if the user has SUPER or
  982.     REPL_CLIENT_ACL rights.
  983.   RETURN
  984.     0 ok
  985.     1 Access denied.  In this case an error is sent to the client
  986. */
  987. bool check_global_access(THD *thd, ulong want_access)
  988. {
  989. #ifdef NO_EMBEDDED_ACCESS_CHECKS
  990.   return 0;
  991. #else
  992.   char command[128];
  993.   if ((thd->master_access & want_access))
  994.     return 0;
  995.   get_privilege_desc(command, sizeof(command), want_access);
  996.   net_printf(thd,ER_SPECIFIC_ACCESS_DENIED_ERROR,
  997.      command);
  998.   return 1;
  999. #endif /* NO_EMBEDDED_ACCESS_CHECKS */
  1000. }
  1001. /*
  1002.   Check the privilege for all used tables.  Table privileges are cached
  1003.   in the table list for GRANT checking
  1004. */
  1005. bool
  1006. check_table_access(THD *thd, ulong want_access,TABLE_LIST *tables,
  1007.    bool no_errors)
  1008. {
  1009.   uint found=0;
  1010.   ulong found_access=0;
  1011.   TABLE_LIST *org_tables=tables;
  1012.   for (; tables ; tables=tables->next)
  1013.   {
  1014.     if (tables->derived ||
  1015.         (tables->table && (int)tables->table->tmp_table) ||
  1016.         my_tz_check_n_skip_implicit_tables(&tables,
  1017.                                            thd->lex->time_zone_tables_used))
  1018.       continue;
  1019.     if ((thd->master_access & want_access) == (want_access & ~EXTRA_ACL) &&
  1020. thd->db)
  1021.       tables->grant.privilege= want_access;
  1022.     else if (tables->db && tables->db == thd->db)
  1023.     {
  1024.       if (found && !grant_option) // db already checked
  1025. tables->grant.privilege=found_access;
  1026.       else
  1027.       {
  1028. if (check_access(thd,want_access,tables->db,&tables->grant.privilege,
  1029.  0, no_errors))
  1030.   return TRUE; // Access denied
  1031. found_access=tables->grant.privilege;
  1032. found=1;
  1033.       }
  1034.     }
  1035.     else if (check_access(thd,want_access,tables->db,&tables->grant.privilege,
  1036.   0, no_errors))
  1037.       return TRUE;
  1038.   }
  1039.   if (grant_option)
  1040.     return check_grant(thd,want_access & ~EXTRA_ACL,org_tables,
  1041.        test(want_access & EXTRA_ACL), UINT_MAX, no_errors);
  1042.   return FALSE;
  1043. }
  1044. bool check_merge_table_access(THD *thd, char *db,
  1045.       TABLE_LIST *table_list)
  1046. {
  1047.   int error=0;
  1048.   if (table_list)
  1049.   {
  1050.     /* Check that all tables use the current database */
  1051.     TABLE_LIST *tmp;
  1052.     for (tmp=table_list; tmp ; tmp=tmp->next)
  1053.     {
  1054.       if (!tmp->db || !tmp->db[0])
  1055. tmp->db=db;
  1056.     }
  1057.     error=check_table_access(thd, SELECT_ACL | UPDATE_ACL | DELETE_ACL,
  1058.      table_list,0);
  1059.   }
  1060.   return error;
  1061. }
  1062. static bool check_db_used(THD *thd,TABLE_LIST *tables)
  1063. {
  1064.   for (; tables ; tables=tables->next)
  1065.   {
  1066.     if (!tables->db)
  1067.     {
  1068.       if (!(tables->db=thd->db))
  1069.       {
  1070. send_error(thd,ER_NO_DB_ERROR); /* purecov: tested */
  1071. return TRUE; /* purecov: tested */
  1072.       }
  1073.     }
  1074.   }
  1075.   return FALSE;
  1076. }
  1077. /****************************************************************************
  1078. Check stack size; Send error if there isn't enough stack to continue
  1079. ****************************************************************************/
  1080. #if STACK_DIRECTION < 0
  1081. #define used_stack(A,B) (long) (A - B)
  1082. #else
  1083. #define used_stack(A,B) (long) (B - A)
  1084. #endif
  1085. #ifndef DBUG_OFF
  1086. long max_stack_used;
  1087. #endif
  1088. #ifndef EMBEDDED_LIBRARY
  1089. bool check_stack_overrun(THD *thd,char *buf __attribute__((unused)))
  1090. {
  1091.   long stack_used;
  1092.   if ((stack_used=used_stack(thd->thread_stack,(char*) &stack_used)) >=
  1093.       (long) thread_stack_min)
  1094.   {
  1095.     sprintf(errbuff[0],ER(ER_STACK_OVERRUN),stack_used,thread_stack);
  1096.     my_message(ER_STACK_OVERRUN,errbuff[0],MYF(0));
  1097.     thd->fatal_error();
  1098.     return 1;
  1099.   }
  1100. #ifndef DBUG_OFF
  1101.   max_stack_used= max(max_stack_used, stack_used);
  1102. #endif
  1103.   return 0;
  1104. }
  1105. #endif /* EMBEDDED_LIBRARY */
  1106. #define MY_YACC_INIT 1000 // Start with big alloc
  1107. #define MY_YACC_MAX  32000 // Because of 'short'
  1108. bool my_yyoverflow(short **yyss, YYSTYPE **yyvs, ulong *yystacksize)
  1109. {
  1110.   LEX *lex=current_lex;
  1111.   ulong old_info=0;
  1112.   if ((uint) *yystacksize >= MY_YACC_MAX)
  1113.     return 1;
  1114.   if (!lex->yacc_yyvs)
  1115.     old_info= *yystacksize;
  1116.   *yystacksize= set_zone((*yystacksize)*2,MY_YACC_INIT,MY_YACC_MAX);
  1117.   if (!(lex->yacc_yyvs= (char*)
  1118. my_realloc((gptr) lex->yacc_yyvs,
  1119.    *yystacksize*sizeof(**yyvs),
  1120.    MYF(MY_ALLOW_ZERO_PTR | MY_FREE_ON_ERROR))) ||
  1121.       !(lex->yacc_yyss= (char*)
  1122. my_realloc((gptr) lex->yacc_yyss,
  1123.    *yystacksize*sizeof(**yyss),
  1124.    MYF(MY_ALLOW_ZERO_PTR | MY_FREE_ON_ERROR))))
  1125.     return 1;
  1126.   if (old_info)
  1127.   { // Copy old info from stack
  1128.     memcpy(lex->yacc_yyss, (gptr) *yyss, old_info*sizeof(**yyss));
  1129.     memcpy(lex->yacc_yyvs, (gptr) *yyvs, old_info*sizeof(**yyvs));
  1130.   }
  1131.   *yyss=(short*) lex->yacc_yyss;
  1132.   *yyvs=(YYSTYPE*) lex->yacc_yyvs;
  1133.   return 0;
  1134. }
  1135. /****************************************************************************
  1136.   Initialize global thd variables needed for query
  1137. ****************************************************************************/
  1138. void
  1139. mysql_init_query(THD *thd, uchar *buf, uint length)
  1140. {
  1141.   DBUG_ENTER("mysql_init_query");
  1142.   lex_start(thd, buf, length);
  1143.   mysql_reset_thd_for_next_command(thd);
  1144.   DBUG_VOID_RETURN;
  1145. }
  1146. /*
  1147.  Reset THD part responsible for command processing state.
  1148.  DESCRIPTION
  1149.    This needs to be called before execution of every statement
  1150.    (prepared or conventional).
  1151.  TODO
  1152.    Make it a method of THD and align its name with the rest of
  1153.    reset/end/start/init methods.
  1154.    Call it after we use THD for queries, not before.
  1155. */
  1156. void mysql_reset_thd_for_next_command(THD *thd)
  1157. {
  1158.   DBUG_ENTER("mysql_reset_thd_for_next_command");
  1159.   thd->free_list= 0;
  1160.   thd->select_number= 1;
  1161.   thd->total_warn_count= 0;                     // Warnings for this query
  1162.   thd->last_insert_id_used= thd->query_start_used= thd->insert_id_used=0;
  1163.   thd->sent_row_count= thd->examined_row_count= 0;
  1164.   thd->is_fatal_error= thd->rand_used= thd->time_zone_used= 0;
  1165.   thd->server_status&= ~ (SERVER_MORE_RESULTS_EXISTS | 
  1166.   SERVER_QUERY_NO_INDEX_USED |
  1167.   SERVER_QUERY_NO_GOOD_INDEX_USED);
  1168.   thd->tmp_table_used= 0;
  1169.   if (opt_bin_log)
  1170.     reset_dynamic(&thd->user_var_events);
  1171.   thd->clear_error();
  1172.   DBUG_VOID_RETURN;
  1173. }
  1174. void
  1175. mysql_init_select(LEX *lex)
  1176. {
  1177.   SELECT_LEX *select_lex= lex->current_select;
  1178.   select_lex->init_select();
  1179.   select_lex->select_limit= HA_POS_ERROR;
  1180.   if (select_lex == &lex->select_lex)
  1181.   {
  1182.     DBUG_ASSERT(lex->result == 0);
  1183.     lex->exchange= 0;
  1184.   }
  1185. }
  1186. bool
  1187. mysql_new_select(LEX *lex, bool move_down)
  1188. {
  1189.   SELECT_LEX *select_lex;
  1190.   if (!(select_lex= new(lex->thd->mem_root) SELECT_LEX()))
  1191.     return 1;
  1192.   select_lex->select_number= ++lex->thd->select_number;
  1193.   select_lex->init_query();
  1194.   select_lex->init_select();
  1195.   /*
  1196.     Don't evaluate this subquery during statement prepare even if
  1197.     it's a constant one. The flag is switched off in the end of
  1198.     mysql_stmt_prepare.
  1199.   */
  1200.   if (lex->thd->current_arena->is_stmt_prepare())
  1201.     select_lex->uncacheable|= UNCACHEABLE_PREPARE;
  1202.   if (move_down)
  1203.   {
  1204.     lex->subqueries= TRUE;
  1205.     /* first select_lex of subselect or derived table */
  1206.     SELECT_LEX_UNIT *unit;
  1207.     if (!(unit= new(lex->thd->mem_root) SELECT_LEX_UNIT()))
  1208.       return 1;
  1209.     unit->init_query();
  1210.     unit->init_select();
  1211.     unit->thd= lex->thd;
  1212.     unit->include_down(lex->current_select);
  1213.     unit->link_next= 0;
  1214.     unit->link_prev= 0;
  1215.     unit->return_to= lex->current_select;
  1216.     select_lex->include_down(unit);
  1217.     // TODO: assign resolve_mode for fake subquery after merging with new tree
  1218.   }
  1219.   else
  1220.   {
  1221.     select_lex->include_neighbour(lex->current_select);
  1222.     SELECT_LEX_UNIT *unit= select_lex->master_unit();
  1223.     SELECT_LEX *fake= unit->fake_select_lex;
  1224.     if (!fake)
  1225.     {
  1226.       /*
  1227. as far as we included SELECT_LEX for UNION unit should have
  1228. fake SELECT_LEX for UNION processing
  1229.       */
  1230.       if (!(fake= unit->fake_select_lex= new(lex->thd->mem_root) SELECT_LEX()))
  1231.         return 1;
  1232.       fake->include_standalone(unit,
  1233.        (SELECT_LEX_NODE**)&unit->fake_select_lex);
  1234.       fake->select_number= INT_MAX;
  1235.       fake->make_empty_select();
  1236.       fake->linkage= GLOBAL_OPTIONS_TYPE;
  1237.       fake->select_limit= HA_POS_ERROR;
  1238.     }
  1239.   }
  1240.   select_lex->master_unit()->global_parameters= select_lex;
  1241.   select_lex->include_global((st_select_lex_node**)&lex->all_selects_list);
  1242.   lex->current_select= select_lex;
  1243.   select_lex->resolve_mode= SELECT_LEX::SELECT_MODE;
  1244.   return 0;
  1245. }
  1246. /*
  1247.   Create a select to return the same output as 'SELECT @@var_name'.
  1248.   SYNOPSIS
  1249.     create_select_for_variable()
  1250.     var_name Variable name
  1251.   DESCRIPTION
  1252.     Used for SHOW COUNT(*) [ WARNINGS | ERROR]
  1253.     This will crash with a core dump if the variable doesn't exists
  1254. */
  1255. void create_select_for_variable(const char *var_name)
  1256. {
  1257.   THD *thd;
  1258.   LEX *lex;
  1259.   LEX_STRING tmp, null_lex_string;
  1260.   Item *var;
  1261.   char buff[MAX_SYS_VAR_LENGTH*2+4+8], *end;
  1262.   DBUG_ENTER("create_select_for_variable");
  1263.   thd= current_thd;
  1264.   lex= thd->lex;
  1265.   mysql_init_select(lex);
  1266.   lex->sql_command= SQLCOM_SELECT;
  1267.   tmp.str= (char*) var_name;
  1268.   tmp.length=strlen(var_name);
  1269.   bzero((char*) &null_lex_string.str, sizeof(null_lex_string));
  1270.   /*
  1271.     We set the name of Item to @@session.var_name because that then is used
  1272.     as the column name in the output.
  1273.   */
  1274.   if ((var= get_system_var(thd, OPT_SESSION, tmp, null_lex_string)))
  1275.   {
  1276.     end= strxmov(buff, "@@session.", var_name, NullS);
  1277.     var->set_name(buff, end-buff, system_charset_info);
  1278.     add_item_to_list(thd, var);
  1279.   }
  1280.   DBUG_VOID_RETURN;
  1281. }
  1282. static TABLE_LIST* get_table_by_alias(TABLE_LIST* tl, const char* db,
  1283.   const char* alias)
  1284. {
  1285.   for (;tl;tl= tl->next)
  1286.   {
  1287.     if (!strcmp(db,tl->db) &&
  1288.         tl->alias && !my_strcasecmp(table_alias_charset,tl->alias,alias))
  1289.       return tl;
  1290.   }
  1291.   
  1292.   return 0;
  1293. }     
  1294. /* Sets up lex->auxilliary_table_list */
  1295. void fix_multi_delete_lex(LEX* lex)
  1296. {
  1297.   TABLE_LIST *tl;
  1298.   TABLE_LIST *good_list= (TABLE_LIST*)lex->select_lex.table_list.first;
  1299.   
  1300.   for (tl= (TABLE_LIST*)lex->auxilliary_table_list.first; tl; tl= tl->next)
  1301.   {
  1302.     TABLE_LIST* good_table= get_table_by_alias(good_list,tl->db,tl->alias);
  1303.     if (good_table && !good_table->derived)
  1304.     {
  1305.       /* 
  1306.           real_name points to a member of Table_ident which is
  1307.           allocated via thd->strmake() from THD memroot 
  1308.        */
  1309.       tl->real_name= good_table->real_name;
  1310.       tl->real_name_length= good_table->real_name_length;
  1311.       good_table->updating= tl->updating;
  1312.     }
  1313.   }
  1314. }  
  1315. void mysql_init_multi_delete(LEX *lex)
  1316. {
  1317.   lex->sql_command=  SQLCOM_DELETE_MULTI;
  1318.   mysql_init_select(lex);
  1319.   lex->select_lex.select_limit= lex->unit.select_limit_cnt=
  1320.     HA_POS_ERROR;
  1321.   lex->select_lex.table_list.save_and_clear(&lex->auxilliary_table_list);
  1322.   lex->lock_option= using_update_log ? TL_READ_NO_INSERT : TL_READ;
  1323. }
  1324. /*
  1325.   When you modify mysql_parse(), you may need to mofify
  1326.   mysql_test_parse_for_slave() in this same file.
  1327. */
  1328. void mysql_parse(THD *thd, char *inBuf, uint length)
  1329. {
  1330.   DBUG_ENTER("mysql_parse");
  1331.   mysql_init_query(thd, (uchar*) inBuf, length);
  1332.   if (query_cache_send_result_to_client(thd, inBuf, length) <= 0)
  1333.   {
  1334.     LEX *lex= thd->lex;
  1335.     if (!yyparse((void *)thd) && ! thd->is_fatal_error)
  1336.     {
  1337. #ifndef NO_EMBEDDED_ACCESS_CHECKS
  1338.       if (mqh_used && thd->user_connect &&
  1339.   check_mqh(thd, lex->sql_command))
  1340.       {
  1341. thd->net.error = 0;
  1342.       }
  1343.       else
  1344. #endif
  1345.       {
  1346. if (thd->net.report_error)
  1347.   send_error(thd, 0, NullS);
  1348. else
  1349. {
  1350.           /*
  1351.             Binlog logs a string starting from thd->query and having length
  1352.             thd->query_length; so we set thd->query_length correctly (to not
  1353.             log several statements in one event, when we executed only first).
  1354.             We set it to not see the ';' (otherwise it would get into binlog
  1355.             and Query_log_event::print() would give ';;' output).
  1356.             This also helps display only the current query in SHOW
  1357.             PROCESSLIST.
  1358.             Note that we don't need LOCK_thread_count to modify query_length.
  1359.           */
  1360.           if (lex->found_colon &&
  1361.               (thd->query_length= (ulong)(lex->found_colon - thd->query)))
  1362.             thd->query_length--;
  1363.           /* Actually execute the query */
  1364.   mysql_execute_command(thd);
  1365.   query_cache_end_of_result(thd);
  1366. }
  1367.       }
  1368.     }
  1369.     else
  1370.     {
  1371.       DBUG_PRINT("info",("Command aborted. Fatal_error: %d",
  1372.  thd->is_fatal_error));
  1373.       query_cache_abort(&thd->net);
  1374.     }
  1375.     thd->proc_info="freeing items";
  1376.     thd->end_statement();
  1377.     DBUG_ASSERT(thd->change_list.is_empty());
  1378.   }
  1379.   DBUG_VOID_RETURN;
  1380. }
  1381. #ifdef HAVE_REPLICATION
  1382. /*
  1383.   Usable by the replication SQL thread only: just parse a query to know if it
  1384.   can be ignored because of replicate-*-table rules.
  1385.   RETURN VALUES
  1386.     0 cannot be ignored
  1387.     1 can be ignored
  1388. */
  1389. bool mysql_test_parse_for_slave(THD *thd, char *inBuf, uint length)
  1390. {
  1391.   LEX *lex= thd->lex;
  1392.   bool error= 0;
  1393.   mysql_init_query(thd, (uchar*) inBuf, length);
  1394.   if (!yyparse((void*) thd) && ! thd->is_fatal_error &&
  1395.       all_tables_not_ok(thd,(TABLE_LIST*) lex->select_lex.table_list.first))
  1396.     error= 1;                /* Ignore question */
  1397.   thd->end_statement();
  1398.   return error;
  1399. }
  1400. #endif
  1401. /*****************************************************************************
  1402. ** Store field definition for create
  1403. ** Return 0 if ok
  1404. ******************************************************************************/
  1405. bool add_field_to_list(THD *thd, char *field_name, enum_field_types type,
  1406.        char *length, char *decimals,
  1407.        uint type_modifier,
  1408.        Item *default_value, Item *on_update_value,
  1409.                        LEX_STRING *comment,
  1410.        char *change,
  1411.                        List<String> *interval_list, CHARSET_INFO *cs,
  1412.        uint uint_geom_type)
  1413. {
  1414.   register create_field *new_field;
  1415.   LEX  *lex= thd->lex;
  1416.   uint allowed_type_modifier=0;
  1417.   char warn_buff[MYSQL_ERRMSG_SIZE];
  1418.   DBUG_ENTER("add_field_to_list");
  1419.   if (strlen(field_name) > NAME_LEN)
  1420.   {
  1421.     net_printf(thd, ER_TOO_LONG_IDENT, field_name); /* purecov: inspected */
  1422.     DBUG_RETURN(1); /* purecov: inspected */
  1423.   }
  1424.   if (type_modifier & PRI_KEY_FLAG)
  1425.   {
  1426.     lex->col_list.push_back(new key_part_spec(field_name,0));
  1427.     lex->key_list.push_back(new Key(Key::PRIMARY, NullS, HA_KEY_ALG_UNDEF,
  1428.     0, lex->col_list));
  1429.     lex->col_list.empty();
  1430.   }
  1431.   if (type_modifier & (UNIQUE_FLAG | UNIQUE_KEY_FLAG))
  1432.   {
  1433.     lex->col_list.push_back(new key_part_spec(field_name,0));
  1434.     lex->key_list.push_back(new Key(Key::UNIQUE, NullS, HA_KEY_ALG_UNDEF, 0,
  1435.     lex->col_list));
  1436.     lex->col_list.empty();
  1437.   }
  1438.   if (default_value)
  1439.   {
  1440.     /* 
  1441.       Default value should be literal => basic constants =>
  1442.       no need fix_fields()
  1443.       
  1444.       We allow only one function as part of default value - 
  1445.       NOW() as default for TIMESTAMP type.
  1446.     */
  1447.     if (default_value->type() == Item::FUNC_ITEM && 
  1448.         !(((Item_func*)default_value)->functype() == Item_func::NOW_FUNC &&
  1449.          type == FIELD_TYPE_TIMESTAMP))
  1450.     {
  1451.       net_printf(thd, ER_INVALID_DEFAULT, field_name);
  1452.       DBUG_RETURN(1);
  1453.     }
  1454.     else if (default_value->type() == Item::NULL_ITEM)
  1455.     {
  1456.       default_value= 0;
  1457.       if ((type_modifier & (NOT_NULL_FLAG | AUTO_INCREMENT_FLAG)) ==
  1458.   NOT_NULL_FLAG)
  1459.       {
  1460. net_printf(thd,ER_INVALID_DEFAULT,field_name);
  1461. DBUG_RETURN(1);
  1462.       }
  1463.     }
  1464.     else if (type_modifier & AUTO_INCREMENT_FLAG)
  1465.     {
  1466.       net_printf(thd, ER_INVALID_DEFAULT, field_name);
  1467.       DBUG_RETURN(1);
  1468.     }
  1469.   }
  1470.   if (on_update_value && type != FIELD_TYPE_TIMESTAMP)
  1471.   {
  1472.     net_printf(thd, ER_INVALID_ON_UPDATE, field_name);
  1473.     DBUG_RETURN(1);
  1474.   }
  1475.     
  1476.   if (!(new_field=new create_field()))
  1477.     DBUG_RETURN(1);
  1478.   new_field->field=0;
  1479.   new_field->field_name=field_name;
  1480.   new_field->def= default_value;
  1481.   new_field->flags= type_modifier;
  1482.   new_field->unireg_check= (type_modifier & AUTO_INCREMENT_FLAG ?
  1483.     Field::NEXT_NUMBER : Field::NONE);
  1484.   new_field->decimals= decimals ? (uint) set_zone(atoi(decimals),0,
  1485.   NOT_FIXED_DEC-1) : 0;
  1486.   new_field->sql_type=type;
  1487.   new_field->length=0;
  1488.   new_field->change=change;
  1489.   new_field->interval=0;
  1490.   new_field->pack_length=0;
  1491.   new_field->charset=cs;
  1492.   new_field->geom_type= (Field::geometry_type) uint_geom_type;
  1493.   if (!comment)
  1494.   {
  1495.     new_field->comment.str=0;
  1496.     new_field->comment.length=0;
  1497.   }
  1498.   else
  1499.   {
  1500.     /* In this case comment is always of type Item_string */
  1501.     new_field->comment.str=   (char*) comment->str;
  1502.     new_field->comment.length=comment->length;
  1503.   }
  1504.   if (length && !(new_field->length= (uint) atoi(length)))
  1505.     length=0; /* purecov: inspected */
  1506.   uint sign_len=type_modifier & UNSIGNED_FLAG ? 0 : 1;
  1507.   if (new_field->length && new_field->decimals &&
  1508.       new_field->length < new_field->decimals+1 &&
  1509.       new_field->decimals != NOT_FIXED_DEC)
  1510.     new_field->length=new_field->decimals+1; /* purecov: inspected */
  1511.   switch (type) {
  1512.   case FIELD_TYPE_TINY:
  1513.     if (!length) new_field->length=MAX_TINYINT_WIDTH+sign_len;
  1514.     allowed_type_modifier= AUTO_INCREMENT_FLAG;
  1515.     break;
  1516.   case FIELD_TYPE_SHORT:
  1517.     if (!length) new_field->length=MAX_SMALLINT_WIDTH+sign_len;
  1518.     allowed_type_modifier= AUTO_INCREMENT_FLAG;
  1519.     break;
  1520.   case FIELD_TYPE_INT24:
  1521.     if (!length) new_field->length=MAX_MEDIUMINT_WIDTH+sign_len;
  1522.     allowed_type_modifier= AUTO_INCREMENT_FLAG;
  1523.     break;
  1524.   case FIELD_TYPE_LONG:
  1525.     if (!length) new_field->length=MAX_INT_WIDTH+sign_len;
  1526.     allowed_type_modifier= AUTO_INCREMENT_FLAG;
  1527.     break;
  1528.   case FIELD_TYPE_LONGLONG:
  1529.     if (!length) new_field->length=MAX_BIGINT_WIDTH;
  1530.     allowed_type_modifier= AUTO_INCREMENT_FLAG;
  1531.     break;
  1532.   case FIELD_TYPE_NULL:
  1533.     break;
  1534.   case FIELD_TYPE_DECIMAL:
  1535.     if (!length)
  1536.     {
  1537.       if ((new_field->length= new_field->decimals))
  1538.         new_field->length++;
  1539.       else
  1540.         new_field->length= 10;                  // Default length for DECIMAL
  1541.     }
  1542.     if (new_field->length < MAX_FIELD_WIDTH) // Skip wrong argument
  1543.     {
  1544.       new_field->length+=sign_len;
  1545.       if (new_field->decimals)
  1546. new_field->length++;
  1547.     }
  1548.     break;
  1549.   case FIELD_TYPE_STRING:
  1550.   case FIELD_TYPE_VAR_STRING:
  1551.     if (new_field->length <= MAX_FIELD_CHARLENGTH || default_value)
  1552.       break;
  1553.     /* Convert long CHAR() and VARCHAR columns to TEXT or BLOB */
  1554.     new_field->sql_type= FIELD_TYPE_BLOB;
  1555.     sprintf(warn_buff, ER(ER_AUTO_CONVERT), field_name, "CHAR",
  1556.     (cs == &my_charset_bin) ? "BLOB" : "TEXT");
  1557.     push_warning(thd, MYSQL_ERROR::WARN_LEVEL_WARN, ER_AUTO_CONVERT,
  1558.  warn_buff);
  1559.     /* fall through */
  1560.   case FIELD_TYPE_BLOB:
  1561.   case FIELD_TYPE_TINY_BLOB:
  1562.   case FIELD_TYPE_LONG_BLOB:
  1563.   case FIELD_TYPE_MEDIUM_BLOB:
  1564.   case FIELD_TYPE_GEOMETRY:
  1565.     if (new_field->length)
  1566.     {
  1567.       /* The user has given a length to the blob column */
  1568.       if (new_field->length < 256)
  1569. type= FIELD_TYPE_TINY_BLOB;
  1570.       else if (new_field->length < 65536)
  1571. type= FIELD_TYPE_BLOB;
  1572.       else if (new_field->length < 256L*256L*256L)
  1573. type= FIELD_TYPE_MEDIUM_BLOB;
  1574.       else
  1575. type= FIELD_TYPE_LONG_BLOB;
  1576.       new_field->length= 0;
  1577.     }
  1578.     new_field->sql_type= type;
  1579.     if (default_value) // Allow empty as default value
  1580.     {
  1581.       String str,*res;
  1582.       res=default_value->val_str(&str);
  1583.       if (res->length())
  1584.       {
  1585. net_printf(thd,ER_BLOB_CANT_HAVE_DEFAULT,field_name); /* purecov: inspected */
  1586. DBUG_RETURN(1); /* purecov: inspected */
  1587.       }
  1588.       new_field->def=0;
  1589.     }
  1590.     new_field->flags|=BLOB_FLAG;
  1591.     break;
  1592.   case FIELD_TYPE_YEAR:
  1593.     if (!length || new_field->length != 2)
  1594.       new_field->length=4; // Default length
  1595.     new_field->flags|= ZEROFILL_FLAG | UNSIGNED_FLAG;
  1596.     break;
  1597.   case FIELD_TYPE_FLOAT:
  1598.     /* change FLOAT(precision) to FLOAT or DOUBLE */
  1599.     allowed_type_modifier= AUTO_INCREMENT_FLAG;
  1600.     if (length && !decimals)
  1601.     {
  1602.       uint tmp_length=new_field->length;
  1603.       if (tmp_length > PRECISION_FOR_DOUBLE)
  1604.       {
  1605. net_printf(thd,ER_WRONG_FIELD_SPEC,field_name);
  1606. DBUG_RETURN(1);
  1607.       }
  1608.       else if (tmp_length > PRECISION_FOR_FLOAT)
  1609.       {
  1610. new_field->sql_type=FIELD_TYPE_DOUBLE;
  1611. new_field->length=DBL_DIG+7; // -[digits].E+###
  1612.       }
  1613.       else
  1614. new_field->length=FLT_DIG+6; // -[digits].E+##
  1615.       new_field->decimals= NOT_FIXED_DEC;
  1616.       break;
  1617.     }
  1618.     if (!length)
  1619.     {
  1620.       new_field->length =  FLT_DIG+6;
  1621.       new_field->decimals= NOT_FIXED_DEC;
  1622.     }
  1623.     break;
  1624.   case FIELD_TYPE_DOUBLE:
  1625.     allowed_type_modifier= AUTO_INCREMENT_FLAG;
  1626.     if (!length)
  1627.     {
  1628.       new_field->length = DBL_DIG+7;
  1629.       new_field->decimals=NOT_FIXED_DEC;
  1630.     }
  1631.     break;
  1632.   case FIELD_TYPE_TIMESTAMP:
  1633.     if (!length)
  1634.       new_field->length= 14; // Full date YYYYMMDDHHMMSS
  1635.     else if (new_field->length != 19)
  1636.     {
  1637.       /*
  1638.         We support only even TIMESTAMP lengths less or equal than 14
  1639.         and 19 as length of 4.1 compatible representation.
  1640.       */
  1641.       new_field->length=((new_field->length+1)/2)*2; /* purecov: inspected */
  1642.       new_field->length= min(new_field->length,14); /* purecov: inspected */
  1643.     }
  1644.     new_field->flags|= ZEROFILL_FLAG | UNSIGNED_FLAG;
  1645.     if (default_value)
  1646.     {
  1647.       /* Grammar allows only NOW() value for ON UPDATE clause */
  1648.       if (default_value->type() == Item::FUNC_ITEM && 
  1649.           ((Item_func*)default_value)->functype() == Item_func::NOW_FUNC)
  1650.       {
  1651.         new_field->unireg_check= (on_update_value?Field::TIMESTAMP_DNUN_FIELD:
  1652.                                                   Field::TIMESTAMP_DN_FIELD);
  1653.         /*
  1654.           We don't need default value any longer moreover it is dangerous.
  1655.           Everything handled by unireg_check further.
  1656.         */
  1657.         new_field->def= 0;
  1658.       }
  1659.       else
  1660.         new_field->unireg_check= (on_update_value?Field::TIMESTAMP_UN_FIELD:
  1661.                                                   Field::NONE);
  1662.     }
  1663.     else
  1664.     {
  1665.       /*
  1666.         If we have default TIMESTAMP NOT NULL column without explicit DEFAULT
  1667.         or ON UPDATE values then for the sake of compatiblity we should treat
  1668.         this column as having DEFAULT NOW() ON UPDATE NOW() (when we don't
  1669.         have another TIMESTAMP column with auto-set option before this one)
  1670.         or DEFAULT 0 (in other cases).
  1671.         So here we are setting TIMESTAMP_OLD_FIELD only temporary, and will
  1672.         replace this value by TIMESTAMP_DNUN_FIELD or NONE later when
  1673.         information about all TIMESTAMP fields in table will be availiable.
  1674.         If we have TIMESTAMP NULL column without explicit DEFAULT value
  1675.         we treat it as having DEFAULT NULL attribute.
  1676.       */
  1677.       new_field->unireg_check= on_update_value ?
  1678.                                Field::TIMESTAMP_UN_FIELD :
  1679.                                (new_field->flags & NOT_NULL_FLAG ?
  1680.                                 Field::TIMESTAMP_OLD_FIELD:
  1681.                                 Field::NONE);
  1682.     }
  1683.     break;
  1684.   case FIELD_TYPE_DATE: // Old date type
  1685.     if (protocol_version != PROTOCOL_VERSION-1)
  1686.       new_field->sql_type=FIELD_TYPE_NEWDATE;
  1687.     /* fall trough */
  1688.   case FIELD_TYPE_NEWDATE:
  1689.     new_field->length=10;
  1690.     break;
  1691.   case FIELD_TYPE_TIME:
  1692.     new_field->length=10;
  1693.     break;
  1694.   case FIELD_TYPE_DATETIME:
  1695.     new_field->length=19;
  1696.     break;
  1697.   case FIELD_TYPE_SET:
  1698.     {
  1699.       if (interval_list->elements > sizeof(longlong)*8)
  1700.       {
  1701.         net_printf(thd,ER_TOO_BIG_SET,field_name); /* purecov: inspected */
  1702.         DBUG_RETURN(1); /* purecov: inspected */
  1703.       }
  1704.       new_field->pack_length= get_set_pack_length(interval_list->elements);
  1705.       List_iterator<String> it(*interval_list);
  1706.       String *tmp;
  1707.       while ((tmp= it++))
  1708.         new_field->interval_list.push_back(tmp);
  1709.       /*
  1710.         Set fake length to 1 to pass the below conditions.
  1711.         Real length will be set in mysql_prepare_table()
  1712.         when we know the character set of the column
  1713.       */
  1714.       new_field->length= 1;
  1715.     }
  1716.     break;
  1717.   case FIELD_TYPE_ENUM:
  1718.     {
  1719.       // Should be safe
  1720.       new_field->pack_length= get_enum_pack_length(interval_list->elements);
  1721.       List_iterator<String> it(*interval_list);
  1722.       String *tmp;
  1723.       while ((tmp= it++))
  1724.         new_field->interval_list.push_back(tmp);
  1725.       new_field->length= 1; // See comment for FIELD_TYPE_SET above.
  1726.     }
  1727.     break;
  1728.   }
  1729.   if ((new_field->length > MAX_FIELD_CHARLENGTH && type != FIELD_TYPE_SET && 
  1730.        type != FIELD_TYPE_ENUM) ||
  1731.       (!new_field->length && !(new_field->flags & BLOB_FLAG) &&
  1732.        type != FIELD_TYPE_STRING &&
  1733.        type != FIELD_TYPE_VAR_STRING && type != FIELD_TYPE_GEOMETRY))
  1734.   {
  1735.     net_printf(thd,ER_TOO_BIG_FIELDLENGTH,field_name,
  1736.        MAX_FIELD_CHARLENGTH); /* purecov: inspected */
  1737.     DBUG_RETURN(1); /* purecov: inspected */
  1738.   }
  1739.   type_modifier&= AUTO_INCREMENT_FLAG;
  1740.   if ((~allowed_type_modifier) & type_modifier)
  1741.   {
  1742.     net_printf(thd,ER_WRONG_FIELD_SPEC,field_name);
  1743.     DBUG_RETURN(1);
  1744.   }
  1745.   if (!new_field->pack_length)
  1746.     new_field->pack_length=calc_pack_length(new_field->sql_type ==
  1747.     FIELD_TYPE_VAR_STRING ?
  1748.     FIELD_TYPE_STRING :
  1749.     new_field->sql_type,
  1750.     new_field->length);
  1751.   lex->create_list.push_back(new_field);
  1752.   lex->last_field=new_field;
  1753.   DBUG_RETURN(0);
  1754. }
  1755. /* Store position for column in ALTER TABLE .. ADD column */
  1756. void store_position_for_column(const char *name)
  1757. {
  1758.   current_lex->last_field->after=my_const_cast(char*) (name);
  1759. }
  1760. bool
  1761. add_proc_to_list(THD* thd, Item *item)
  1762. {
  1763.   ORDER *order;
  1764.   Item **item_ptr;
  1765.   if (!(order = (ORDER *) thd->alloc(sizeof(ORDER)+sizeof(Item*))))
  1766.     return 1;
  1767.   item_ptr = (Item**) (order+1);
  1768.   *item_ptr= item;
  1769.   order->item=item_ptr;
  1770.   order->free_me=0;
  1771.   thd->lex->proc_list.link_in_list((byte*) order,(byte**) &order->next);
  1772.   return 0;
  1773. }
  1774. /* Fix escaping of _, % and  in database and table names (for ODBC) */
  1775. static void remove_escape(char *name)
  1776. {
  1777.   if (!*name) // For empty DB names
  1778.     return;
  1779.   char *to;
  1780. #ifdef USE_MB
  1781.   char *strend=name+(uint) strlen(name);
  1782. #endif
  1783.   for (to=name; *name ; name++)
  1784.   {
  1785. #ifdef USE_MB
  1786.     int l;
  1787. /*    if ((l = ismbchar(name, name+MBMAXLEN))) { Wei He: I think it's wrong */
  1788.     if (use_mb(system_charset_info) &&
  1789.         (l = my_ismbchar(system_charset_info, name, strend)))
  1790.     {
  1791. while (l--)
  1792.     *to++ = *name++;
  1793. name--;
  1794. continue;
  1795.     }
  1796. #endif
  1797.     if (*name == '\' && name[1])
  1798.       name++; // Skip '\'
  1799.     *to++= *name;
  1800.   }
  1801.   *to=0;
  1802. }
  1803. /****************************************************************************
  1804. ** save order by and tables in own lists
  1805. ****************************************************************************/
  1806. bool add_to_list(THD *thd, SQL_LIST &list,Item *item,bool asc)
  1807. {
  1808.   ORDER *order;
  1809.   DBUG_ENTER("add_to_list");
  1810.   if (!(order = (ORDER *) thd->alloc(sizeof(ORDER))))
  1811.     DBUG_RETURN(1);
  1812.   order->item_ptr= item;
  1813.   order->item= &order->item_ptr;
  1814.   order->asc = asc;
  1815.   order->free_me=0;
  1816.   order->used=0;
  1817.   list.link_in_list((byte*) order,(byte**) &order->next);
  1818.   DBUG_RETURN(0);
  1819. }
  1820. /*
  1821.   Add a table to list of used tables
  1822.   SYNOPSIS
  1823.     add_table_to_list()
  1824.     table Table to add
  1825.     alias alias for table (or null if no alias)
  1826.     table_options A set of the following bits:
  1827. TL_OPTION_UPDATING Table will be updated
  1828. TL_OPTION_FORCE_INDEX Force usage of index
  1829.     lock_type How table should be locked
  1830.     use_index List of indexed used in USE INDEX
  1831.     ignore_index List of indexed used in IGNORE INDEX
  1832.     RETURN
  1833.       0 Error
  1834.       # Pointer to TABLE_LIST element added to the total table list
  1835. */
  1836. TABLE_LIST *st_select_lex::add_table_to_list(THD *thd,
  1837.      Table_ident *table,
  1838.      LEX_STRING *alias,
  1839.      ulong table_options,
  1840.      thr_lock_type lock_type,
  1841.      List<String> *use_index_arg,
  1842.      List<String> *ignore_index_arg,
  1843.                                              LEX_STRING *option)
  1844. {
  1845.   register TABLE_LIST *ptr;
  1846.   char *alias_str;
  1847.   DBUG_ENTER("add_table_to_list");
  1848.   if (!table)
  1849.     DBUG_RETURN(0); // End of memory
  1850.   alias_str= alias ? alias->str : table->table.str;
  1851.   if (check_table_name(table->table.str,table->table.length) ||
  1852.       table->db.str && check_db_name(table->db.str))
  1853.   {
  1854.     net_printf(thd, ER_WRONG_TABLE_NAME, table->table.str);
  1855.     DBUG_RETURN(0);
  1856.   }
  1857.   if (!alias) /* Alias is case sensitive */
  1858.   {
  1859.     if (table->sel)
  1860.     {
  1861.       net_printf(thd,ER_DERIVED_MUST_HAVE_ALIAS);
  1862.       DBUG_RETURN(0);
  1863.     }
  1864.     if (!(alias_str=thd->memdup(alias_str,table->table.length+1)))
  1865.       DBUG_RETURN(0);
  1866.   }
  1867.   if (!(ptr = (TABLE_LIST *) thd->calloc(sizeof(TABLE_LIST))))
  1868.     DBUG_RETURN(0); /* purecov: inspected */
  1869.   if (table->db.str)
  1870.   {
  1871.     ptr->db= table->db.str;
  1872.     ptr->db_length= table->db.length;
  1873.   }
  1874.   else if (thd->db)
  1875.   {
  1876.     ptr->db= thd->db;
  1877.     ptr->db_length= thd->db_length;
  1878.   }
  1879.   else
  1880.   {
  1881.     /* The following can't be "" as we may do 'casedn_str()' on it */
  1882.     ptr->db= empty_c_string;
  1883.     ptr->db_length= 0;
  1884.   }
  1885.   if (thd->current_arena->is_stmt_prepare())
  1886.     ptr->db= thd->strdup(ptr->db);
  1887.   ptr->alias= alias_str;
  1888.   if (lower_case_table_names && table->table.length)
  1889.     my_casedn_str(files_charset_info, table->table.str);
  1890.   ptr->real_name=table->table.str;
  1891.   ptr->real_name_length=table->table.length;
  1892.   ptr->lock_type=   lock_type;
  1893.   ptr->updating=    test(table_options & TL_OPTION_UPDATING);
  1894.   ptr->force_index= test(table_options & TL_OPTION_FORCE_INDEX);
  1895.   ptr->ignore_leaves= test(table_options & TL_OPTION_IGNORE_LEAVES);
  1896.   ptr->derived=     table->sel;
  1897.   ptr->cacheable_table= 1;
  1898.   if (use_index_arg)
  1899.     ptr->use_index=(List<String> *) thd->memdup((gptr) use_index_arg,
  1900. sizeof(*use_index_arg));
  1901.   if (ignore_index_arg)
  1902.     ptr->ignore_index=(List<String> *) thd->memdup((gptr) ignore_index_arg,
  1903.    sizeof(*ignore_index_arg));
  1904.   ptr->option= option ? option->str : 0;
  1905.   /* check that used name is unique */
  1906.   if (lock_type != TL_IGNORE)
  1907.   {
  1908.     for (TABLE_LIST *tables=(TABLE_LIST*) table_list.first ;
  1909.  tables ;
  1910.  tables=tables->next)
  1911.     {
  1912.       if (!my_strcasecmp(table_alias_charset, alias_str, tables->alias) &&
  1913.   !strcmp(ptr->db, tables->db))
  1914.       {
  1915. net_printf(thd,ER_NONUNIQ_TABLE,alias_str); /* purecov: tested */
  1916. DBUG_RETURN(0); /* purecov: tested */
  1917.       }
  1918.     }
  1919.   }
  1920.   table_list.link_in_list((byte*) ptr, (byte**) &ptr->next);
  1921.   DBUG_RETURN(ptr);
  1922. }
  1923. /*
  1924.   Set lock for all tables in current select level
  1925.   SYNOPSIS:
  1926.     set_lock_for_tables()
  1927.     lock_type Lock to set for tables
  1928.   NOTE:
  1929.     If lock is a write lock, then tables->updating is set 1
  1930.     This is to get tables_ok to know that the table is updated by the
  1931.     query
  1932. */
  1933. void st_select_lex::set_lock_for_tables(thr_lock_type lock_type)
  1934. {
  1935.   bool for_update= lock_type >= TL_READ_NO_INSERT;
  1936.   DBUG_ENTER("set_lock_for_tables");
  1937.   DBUG_PRINT("enter", ("lock_type: %d  for_update: %d", lock_type,
  1938.        for_update));
  1939.   for (TABLE_LIST *tables= (TABLE_LIST*) table_list.first ;
  1940.        tables ;
  1941.        tables=tables->next)
  1942.   {
  1943.     tables->lock_type= lock_type;
  1944.     tables->updating=  for_update;
  1945.   }
  1946.   DBUG_VOID_RETURN;
  1947. }
  1948. void add_join_on(TABLE_LIST *b,Item *expr)
  1949. {
  1950.   if (expr)
  1951.   {
  1952.     if (!b->on_expr)
  1953.       b->on_expr=expr;
  1954.     else
  1955.     {
  1956.       // This only happens if you have both a right and left join
  1957.       b->on_expr=new Item_cond_and(b->on_expr,expr);
  1958.     }
  1959.     b->on_expr->top_level_item();
  1960.   }
  1961. }
  1962. /*
  1963.   Mark that we have a NATURAL JOIN between two tables
  1964.   SYNOPSIS
  1965.     add_join_natural()
  1966.     a Table to do normal join with
  1967.     b Do normal join with this table
  1968.   
  1969.   IMPLEMENTATION
  1970.     This function just marks that table b should be joined with a.
  1971.     The function setup_cond() will create in b->on_expr a list
  1972.     of equal condition between all fields of the same name.
  1973.     SELECT * FROM t1 NATURAL LEFT JOIN t2
  1974.      <=>
  1975.     SELECT * FROM t1 LEFT JOIN t2 ON (t1.i=t2.i and t1.j=t2.j ... )
  1976. */
  1977. void add_join_natural(TABLE_LIST *a,TABLE_LIST *b)
  1978. {
  1979.   b->natural_join=a;
  1980. }
  1981. /*
  1982.   Reload/resets privileges and the different caches.
  1983.   SYNOPSIS
  1984.     reload_acl_and_cache()
  1985.     thd Thread handler
  1986.     options             What should be reset/reloaded (tables, privileges,
  1987.     slave...)
  1988.     tables              Tables to flush (if any)
  1989.     write_to_binlog     Depending on 'options', it may be very bad to write the
  1990.                         query to the binlog (e.g. FLUSH SLAVE); this is a
  1991.                         pointer where, if it is not NULL, reload_acl_and_cache()
  1992.                         will put 0 if it thinks we really should not write to
  1993.                         the binlog. Otherwise it will put 1.
  1994.   RETURN
  1995.     0  ok
  1996.     !=0  error
  1997. */
  1998. bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
  1999.                           bool *write_to_binlog)
  2000. {
  2001.   bool result=0;
  2002.   select_errors=0; /* Write if more errors */
  2003.   bool tmp_write_to_binlog= 1;
  2004. #ifndef NO_EMBEDDED_ACCESS_CHECKS
  2005.   if (options & REFRESH_GRANT)
  2006.   {
  2007.     THD *tmp_thd= 0;
  2008.     /*
  2009.       If reload_acl_and_cache() is called from SIGHUP handler we have to
  2010.       allocate temporary THD for execution of acl_reload()/grant_reload().
  2011.     */
  2012.     if (!thd && (thd= (tmp_thd= new THD)))
  2013.       thd->store_globals();
  2014.     if (thd)
  2015.     {
  2016.       (void)acl_reload(thd);
  2017.       (void)grant_reload(thd);
  2018.       if (mqh_used)
  2019.         reset_mqh(thd, (LEX_USER *) NULL, TRUE);
  2020.     }
  2021.     if (tmp_thd)
  2022.     {
  2023.       delete tmp_thd;
  2024.       /* Remember that we don't have a THD */
  2025.       my_pthread_setspecific_ptr(THR_THD,  0);
  2026.       thd= 0;
  2027.     }
  2028.   }
  2029. #endif
  2030.   if (options & REFRESH_LOG)
  2031.   {
  2032.     /*
  2033.       Flush the normal query log, the update log, the binary log,
  2034.       the slow query log, and the relay log (if it exists).
  2035.     */
  2036.     /*
  2037.       Writing this command to the binlog may result in infinite loops when
  2038.       doing mysqlbinlog|mysql, and anyway it does not really make sense to
  2039.       log it automatically (would cause more trouble to users than it would
  2040.       help them)
  2041.     */
  2042.     tmp_write_to_binlog= 0;
  2043.     mysql_log.new_file(1);
  2044.     mysql_update_log.new_file(1);
  2045.     mysql_bin_log.new_file(1);
  2046.     mysql_slow_log.new_file(1);
  2047. #ifdef HAVE_REPLICATION
  2048.     if (mysql_bin_log.is_open() && expire_logs_days)
  2049.     {
  2050.       long purge_time= time(0) - expire_logs_days*24*60*60;
  2051.       if (purge_time >= 0)
  2052. mysql_bin_log.purge_logs_before_date(purge_time);
  2053.     }
  2054.     pthread_mutex_lock(&LOCK_active_mi);
  2055.     rotate_relay_log(active_mi);
  2056.     pthread_mutex_unlock(&LOCK_active_mi);
  2057. #endif
  2058.     if (ha_flush_logs())
  2059.       result=1;
  2060.     if (flush_error_log())
  2061.       result=1;
  2062.   }
  2063. #ifdef HAVE_QUERY_CACHE
  2064.   if (options & REFRESH_QUERY_CACHE_FREE)
  2065.   {
  2066.     query_cache.pack(); // FLUSH QUERY CACHE
  2067.     options &= ~REFRESH_QUERY_CACHE; //don't flush all cache, just free memory
  2068.   }
  2069.   if (options & (REFRESH_TABLES | REFRESH_QUERY_CACHE))
  2070.   {
  2071.     query_cache.flush(); // RESET QUERY CACHE
  2072.   }
  2073. #endif /*HAVE_QUERY_CACHE*/
  2074.   /*
  2075.     Note that if REFRESH_READ_LOCK bit is set then REFRESH_TABLES is set too
  2076.     (see sql_yacc.yy)
  2077.   */
  2078.   if (options & (REFRESH_TABLES | REFRESH_READ_LOCK)) 
  2079.   {
  2080.     if ((options & REFRESH_READ_LOCK) && thd)
  2081.     {
  2082.       /*
  2083.         We must not try to aspire a global read lock if we have a write
  2084.         locked table. This would lead to a deadlock when trying to
  2085.         reopen (and re-lock) the table after the flush.
  2086.       */
  2087.       if (thd->locked_tables)
  2088.       {
  2089.         THR_LOCK_DATA **lock_p= thd->locked_tables->locks;
  2090.         THR_LOCK_DATA **end_p= lock_p + thd->locked_tables->lock_count;
  2091.         for (; lock_p < end_p; lock_p++)
  2092.         {
  2093.           if ((*lock_p)->type == TL_WRITE)
  2094.           {
  2095.             my_error(ER_LOCK_OR_ACTIVE_TRANSACTION, MYF(0));
  2096.             return 1;
  2097.           }
  2098.         }
  2099.       }
  2100.       /*
  2101. Writing to the binlog could cause deadlocks, as we don't log
  2102. UNLOCK TABLES
  2103.       */
  2104.       tmp_write_to_binlog= 0;
  2105.       if (lock_global_read_lock(thd))
  2106. return 1;
  2107.       result=close_cached_tables(thd,(options & REFRESH_FAST) ? 0 : 1,
  2108.                                  tables);
  2109.       make_global_read_lock_block_commit(thd);
  2110.     }
  2111.     else
  2112.       result=close_cached_tables(thd,(options & REFRESH_FAST) ? 0 : 1, tables);
  2113.     my_dbopt_cleanup();
  2114.   }
  2115.   if (options & REFRESH_HOSTS)
  2116.     hostname_cache_refresh();
  2117.   if (options & REFRESH_STATUS)
  2118.     refresh_status();
  2119.   if (options & REFRESH_THREADS)
  2120.     flush_thread_cache();
  2121. #ifdef HAVE_REPLICATION
  2122.   if (options & REFRESH_MASTER)
  2123.   {
  2124.     tmp_write_to_binlog= 0;
  2125.     if (reset_master(thd))
  2126.       result=1;
  2127.   }
  2128. #endif
  2129. #ifdef OPENSSL
  2130.    if (options & REFRESH_DES_KEY_FILE)
  2131.    {
  2132.      if (des_key_file)
  2133.        result=load_des_key_file(des_key_file);
  2134.    }
  2135. #endif
  2136. #ifdef HAVE_REPLICATION
  2137.  if (options & REFRESH_SLAVE)
  2138.  {
  2139.    tmp_write_to_binlog= 0;
  2140.    pthread_mutex_lock(&LOCK_active_mi);
  2141.    if (reset_slave(thd, active_mi))
  2142.      result=1;
  2143.    pthread_mutex_unlock(&LOCK_active_mi);
  2144.  }
  2145. #endif
  2146.  if (options & REFRESH_USER_RESOURCES)
  2147.    reset_mqh(thd,(LEX_USER *) NULL);
  2148.  if (write_to_binlog)
  2149.    *write_to_binlog= tmp_write_to_binlog;
  2150.  return result;
  2151. }
  2152. /*
  2153.   kill on thread
  2154.   SYNOPSIS
  2155.     kill_one_thread()
  2156.     thd Thread class
  2157.     id Thread id
  2158.   NOTES
  2159.     This is written such that we have a short lock on LOCK_thread_count
  2160. */
  2161. void kill_one_thread(THD *thd, ulong id)
  2162. {
  2163.   THD *tmp;
  2164.   uint error=ER_NO_SUCH_THREAD;
  2165.   VOID(pthread_mutex_lock(&LOCK_thread_count)); // For unlink from list
  2166.   I_List_iterator<THD> it(threads);
  2167.   while ((tmp=it++))
  2168.   {
  2169.     if (tmp->thread_id == id)
  2170.     {
  2171.       pthread_mutex_lock(&tmp->LOCK_delete); // Lock from delete
  2172.       break;
  2173.     }
  2174.   }
  2175.   VOID(pthread_mutex_unlock(&LOCK_thread_count));
  2176.   if (tmp)
  2177.   {
  2178.     if ((thd->master_access & SUPER_ACL) ||
  2179. !strcmp(thd->user,tmp->user))
  2180.     {
  2181.       tmp->awake(1 /*prepare to die*/);
  2182.       error=0;
  2183.     }
  2184.     else
  2185.       error=ER_KILL_DENIED_ERROR;
  2186.     pthread_mutex_unlock(&tmp->LOCK_delete);
  2187.   }
  2188.   if (!error)
  2189.     send_ok(thd);
  2190.   else
  2191.     net_printf(thd,error,id);
  2192. }
  2193. /* Clear most status variables */
  2194. static void refresh_status(void)
  2195. {
  2196.   pthread_mutex_lock(&LOCK_status);
  2197.   for (struct show_var_st *ptr=status_vars; ptr->name; ptr++)
  2198.   {
  2199.     if (ptr->type == SHOW_LONG)
  2200.       *(ulong*) ptr->value= 0;
  2201.   }
  2202.   /* Reset the counters of all key caches (default and named). */
  2203.   process_key_caches(reset_key_cache_counters);
  2204.   pthread_mutex_unlock(&LOCK_status);
  2205. }
  2206. /* If pointer is not a null pointer, append filename to it */
  2207. static bool append_file_to_dir(THD *thd, const char **filename_ptr,
  2208.        const char *table_name)
  2209. {
  2210.   char buff[FN_REFLEN],*ptr, *end;
  2211.   if (!*filename_ptr)
  2212.     return 0; // nothing to do
  2213.   /* Check that the filename is not too long and it's a hard path */
  2214.   if (strlen(*filename_ptr)+strlen(table_name) >= FN_REFLEN-1 ||
  2215.       !test_if_hard_path(*filename_ptr))
  2216.   {
  2217.     my_error(ER_WRONG_TABLE_NAME, MYF(0), *filename_ptr);
  2218.     return 1;
  2219.   }
  2220.   /* Fix is using unix filename format on dos */
  2221.   strmov(buff,*filename_ptr);
  2222.   end=convert_dirname(buff, *filename_ptr, NullS);
  2223.   if (!(ptr=thd->alloc((uint) (end-buff)+(uint) strlen(table_name)+1)))
  2224.     return 1; // End of memory
  2225.   *filename_ptr=ptr;
  2226.   strxmov(ptr,buff,table_name,NullS);
  2227.   return 0;
  2228. }
  2229. /*
  2230.   Check if the select is a simple select (not an union)
  2231.   SYNOPSIS
  2232.     check_simple_select()
  2233.   RETURN VALUES
  2234.     0 ok
  2235.     1 error ; In this case the error messege is sent to the client
  2236. */
  2237. bool check_simple_select()
  2238. {
  2239.   THD *thd= current_thd;
  2240.   if (thd->lex->current_select != &thd->lex->select_lex)
  2241.   {
  2242.     char command[80];
  2243.     strmake(command, thd->lex->yylval->symbol.str,
  2244.     min(thd->lex->yylval->symbol.length, sizeof(command)-1));
  2245.     net_printf(thd, ER_CANT_USE_OPTION_HERE, command);
  2246.     return 1;
  2247.   }
  2248.   return 0;
  2249. }
  2250. Comp_creator *comp_eq_creator(bool invert)
  2251. {
  2252.   return invert?(Comp_creator *)&ne_creator:(Comp_creator *)&eq_creator;
  2253. }
  2254. Comp_creator *comp_ge_creator(bool invert)
  2255. {
  2256.   return invert?(Comp_creator *)&lt_creator:(Comp_creator *)&ge_creator;
  2257. }
  2258. Comp_creator *comp_gt_creator(bool invert)
  2259. {
  2260.   return invert?(Comp_creator *)&le_creator:(Comp_creator *)&gt_creator;
  2261. }
  2262. Comp_creator *comp_le_creator(bool invert)
  2263. {
  2264.   return invert?(Comp_creator *)&gt_creator:(Comp_creator *)&le_creator;
  2265. }
  2266. Comp_creator *comp_lt_creator(bool invert)
  2267. {
  2268.   return invert?(Comp_creator *)&ge_creator:(Comp_creator *)&lt_creator;
  2269. }
  2270. Comp_creator *comp_ne_creator(bool invert)
  2271. {
  2272.   return invert?(Comp_creator *)&eq_creator:(Comp_creator *)&ne_creator;
  2273. }
  2274. /*
  2275.   Construct ALL/ANY/SOME subquery Item
  2276.   SYNOPSIS
  2277.     all_any_subquery_creator()
  2278.     left_expr - pointer to left expression
  2279.     cmp - compare function creator
  2280.     all - true if we create ALL subquery
  2281.     select_lex - pointer on parsed subquery structure
  2282.   RETURN VALUE
  2283.     constructed Item (or 0 if out of memory)
  2284. */
  2285. Item * all_any_subquery_creator(Item *left_expr,
  2286. chooser_compare_func_creator cmp,
  2287. bool all,
  2288. SELECT_LEX *select_lex)
  2289. {
  2290.   if ((cmp == &comp_eq_creator) && !all)       //  = ANY <=> IN
  2291.     return new Item_in_subselect(left_expr, select_lex);
  2292.   if ((cmp == &comp_ne_creator) && all)        // <> ALL <=> NOT IN
  2293.     return new Item_func_not(new Item_in_subselect(left_expr, select_lex));
  2294.   Item_allany_subselect *it=
  2295.     new Item_allany_subselect(left_expr, (*cmp)(all), select_lex, all);
  2296.   if (all)
  2297.     return it->upper_item= new Item_func_not_all(it); /* ALL */
  2298.   return it->upper_item= new Item_func_nop_all(it);      /* ANY/SOME */
  2299. }
  2300. /*
  2301.   CREATE INDEX and DROP INDEX are implemented by calling ALTER TABLE with
  2302.   the proper arguments.  This isn't very fast but it should work for most
  2303.   cases.
  2304.   In the future ALTER TABLE will notice that only added indexes
  2305.   and create these one by one for the existing table without having to do
  2306.   a full rebuild.
  2307.   One should normally create all indexes with CREATE TABLE or ALTER TABLE.
  2308. */
  2309. int mysql_create_index(THD *thd, TABLE_LIST *table_list, List<Key> &keys)
  2310. {
  2311.   List<create_field> fields;
  2312.   ALTER_INFO alter_info;
  2313.   alter_info.flags= ALTER_ADD_INDEX;
  2314.   alter_info.is_simple= 0;
  2315.   HA_CREATE_INFO create_info;
  2316.   DBUG_ENTER("mysql_create_index");
  2317.   bzero((char*) &create_info,sizeof(create_info));
  2318.   create_info.db_type=DB_TYPE_DEFAULT;
  2319.   create_info.default_table_charset= thd->variables.collation_database;
  2320.   DBUG_RETURN(mysql_alter_table(thd,table_list->db,table_list->real_name,
  2321. &create_info, table_list,
  2322. fields, keys, 0, (ORDER*)0,
  2323. DUP_ERROR, 0, &alter_info));
  2324. }
  2325. int mysql_drop_index(THD *thd, TABLE_LIST *table_list, ALTER_INFO *alter_info)
  2326. {
  2327.   List<create_field> fields;
  2328.   List<Key> keys;
  2329.   HA_CREATE_INFO create_info;
  2330.   DBUG_ENTER("mysql_drop_index");
  2331.   bzero((char*) &create_info,sizeof(create_info));
  2332.   create_info.db_type=DB_TYPE_DEFAULT;
  2333.   create_info.default_table_charset= thd->variables.collation_database;
  2334.   alter_info->clear();
  2335.   alter_info->flags= ALTER_DROP_INDEX;
  2336.   alter_info->is_simple= 0;
  2337.   DBUG_RETURN(mysql_alter_table(thd,table_list->db,table_list->real_name,
  2338. &create_info, table_list,
  2339. fields, keys, 0, (ORDER*)0,
  2340. DUP_ERROR, 0, alter_info));
  2341. }
  2342. /*
  2343.   Multi update query pre-check
  2344.   SYNOPSIS
  2345.     multi_update_precheck()
  2346.     thd Thread handler
  2347.     tables Global table list
  2348.   RETURN VALUE
  2349.     0   OK
  2350.     1   Error (message is sent to user)
  2351.     -1  Error (message is not sent to user)
  2352. */
  2353. int multi_update_precheck(THD *thd, TABLE_LIST *tables)
  2354. {
  2355.   DBUG_ENTER("multi_update_precheck");
  2356.   const char *msg= 0;
  2357.   TABLE_LIST *table;
  2358.   LEX *lex= thd->lex;
  2359.   SELECT_LEX *select_lex= &lex->select_lex;
  2360.   TABLE_LIST *update_list= (TABLE_LIST*)select_lex->table_list.first;
  2361.   if (select_lex->item_list.elements != lex->value_list.elements)
  2362.   {
  2363.     my_error(ER_WRONG_VALUE_COUNT, MYF(0));
  2364.     DBUG_RETURN(-1);
  2365.   }
  2366.   /*
  2367.     Ensure that we have UPDATE or SELECT privilege for each table
  2368.     The exact privilege is checked in mysql_multi_update()
  2369.   */
  2370.   for (table= update_list; table; table= table->next)
  2371.   {
  2372.     if (table->derived)
  2373.       table->grant.privilege= SELECT_ACL;
  2374.     else if ((check_access(thd, UPDATE_ACL, table->db,
  2375.                            &table->grant.privilege, 0, 1) ||
  2376.               grant_option &&
  2377.               check_grant(thd, UPDATE_ACL, table, 0, 1, 1)) &&
  2378. (check_access(thd, SELECT_ACL, table->db,
  2379.       &table->grant.privilege, 0, 0) ||
  2380.  grant_option && check_grant(thd, SELECT_ACL, table, 0, 1, 0)))
  2381.       DBUG_RETURN(1);
  2382.     /*
  2383.       We assign following flag only to copy of table, because it will
  2384.       be checked only if query contains subqueries i.e. only if copy exists
  2385.     */
  2386.     if (table->table_list)
  2387.       table->table_list->table_in_update_from_clause= 1;
  2388.   }
  2389.   /*
  2390.     Is there tables of subqueries?
  2391.   */
  2392.   if (&lex->select_lex != lex->all_selects_list || lex->time_zone_tables_used)
  2393.   {
  2394.     DBUG_PRINT("info",("Checking sub query list"));
  2395.     for (table= tables; table; table= table->next)
  2396.     {
  2397.       if (my_tz_check_n_skip_implicit_tables(&table,
  2398.                                              lex->time_zone_tables_used))
  2399.         continue;
  2400.       else if (table->table_in_update_from_clause)
  2401.       {
  2402. /*
  2403.   If we check table by local TABLE_LIST copy then we should copy
  2404.   grants to global table list, because it will be used for table
  2405.   opening.
  2406. */
  2407. if (table->table_list)
  2408.   table->grant= table->table_list->grant;
  2409.       }
  2410.       else if (!table->derived)
  2411.       {
  2412. if (check_access(thd, SELECT_ACL, table->db,
  2413.  &table->grant.privilege, 0, 0) ||
  2414.     grant_option && check_grant(thd, SELECT_ACL, table, 0, 1, 0))
  2415.   DBUG_RETURN(1);
  2416.       }
  2417.     }
  2418.   }
  2419.   if (select_lex->order_list.elements)
  2420.     msg= "ORDER BY";
  2421.   else if (select_lex->select_limit && select_lex->select_limit !=
  2422.    HA_POS_ERROR)
  2423.     msg= "LIMIT";
  2424.   if (msg)
  2425.   {
  2426.     my_error(ER_WRONG_USAGE, MYF(0), "UPDATE", msg);
  2427.     DBUG_RETURN(-1);
  2428.   }
  2429.   DBUG_RETURN(0);
  2430. }
  2431. /*
  2432.   Multi delete query pre-check
  2433.   SYNOPSIS
  2434.     multi_delete_precheck()
  2435.     thd Thread handler
  2436.     tables Global table list
  2437.     table_count Pointer to table counter
  2438.   RETURN VALUE
  2439.     0   OK
  2440.     1   error (message is sent to user)
  2441.     -1  error (message is not sent to user)
  2442. */
  2443. int multi_delete_precheck(THD *thd, TABLE_LIST *tables, uint *table_count)
  2444. {
  2445.   DBUG_ENTER("multi_delete_precheck");
  2446.   SELECT_LEX *select_lex= &thd->lex->select_lex;
  2447.   TABLE_LIST *aux_tables=
  2448.     (TABLE_LIST *)thd->lex->auxilliary_table_list.first;
  2449.   TABLE_LIST *delete_tables= (TABLE_LIST *)select_lex->table_list.first;
  2450.   TABLE_LIST *target_tbl;
  2451.   *table_count= 0;
  2452.   /* sql_yacc guarantees that tables and aux_tables are not zero */
  2453.   DBUG_ASSERT(aux_tables != 0);
  2454.   if (check_db_used(thd, tables) || check_db_used(thd,aux_tables) ||
  2455.       check_table_access(thd,SELECT_ACL, tables,0) ||
  2456.       check_table_access(thd,DELETE_ACL, aux_tables,0))
  2457.     DBUG_RETURN(1);
  2458.   if ((thd->options & OPTION_SAFE_UPDATES) && !select_lex->where)
  2459.   {
  2460.     my_error(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE, MYF(0));
  2461.     DBUG_RETURN(-1);
  2462.   }
  2463.   for (target_tbl= aux_tables; target_tbl; target_tbl= target_tbl->next)
  2464.   {
  2465.     (*table_count)++;
  2466.     /* All tables in aux_tables must be found in FROM PART */
  2467.     TABLE_LIST *walk;
  2468.     walk= get_table_by_alias(delete_tables,target_tbl->db,target_tbl->alias);
  2469.     if (!walk)
  2470.     {
  2471.       my_error(ER_UNKNOWN_TABLE, MYF(0), target_tbl->real_name,
  2472.        "MULTI DELETE");
  2473.       DBUG_RETURN(-1);
  2474.     }
  2475.     if (walk->derived)
  2476.     {
  2477.       my_error(ER_NON_UPDATABLE_TABLE, MYF(0), target_tbl->real_name,
  2478.        "DELETE");
  2479.       DBUG_RETURN(-1);
  2480.     }
  2481.     walk->lock_type= target_tbl->lock_type;
  2482.     target_tbl->table_list= walk; // Remember corresponding table
  2483.     
  2484.     /* in case of subselects, we need to set lock_type in
  2485.      * corresponding table in list of all tables */
  2486.     if (walk->table_list)
  2487.     {
  2488.       target_tbl->table_list= walk->table_list;
  2489.       walk->table_list->lock_type= walk->lock_type;
  2490.     }
  2491.   }
  2492.   DBUG_RETURN(0);
  2493. }
  2494. /*
  2495.   simple UPDATE query pre-check
  2496.   SYNOPSIS
  2497.     update_precheck()
  2498.     thd Thread handler
  2499.     tables Global table list
  2500.   RETURN VALUE
  2501.     0   OK
  2502.     1   Error (message is sent to user)
  2503.     -1  Error (message is not sent to user)
  2504. */
  2505. int update_precheck(THD *thd, TABLE_LIST *tables)
  2506. {
  2507.   DBUG_ENTER("update_precheck");
  2508.   if (thd->lex->select_lex.item_list.elements != thd->lex->value_list.elements)
  2509.   {
  2510.     my_error(ER_WRONG_VALUE_COUNT, MYF(0));
  2511.     DBUG_RETURN(-1);
  2512.   }
  2513.   DBUG_RETURN((check_db_used(thd, tables) ||
  2514.        check_one_table_access(thd, UPDATE_ACL, tables)) ? 1 : 0);
  2515. }
  2516. /*
  2517.   simple DELETE query pre-check
  2518.   SYNOPSIS
  2519.     delete_precheck()
  2520.     thd Thread handler
  2521.     tables Global table list
  2522.   RETURN VALUE
  2523.     0   OK
  2524.     1   error (message is sent to user)
  2525.     -1  error (message is not sent to user)
  2526. */
  2527. int delete_precheck(THD *thd, TABLE_LIST *tables)
  2528. {
  2529.   DBUG_ENTER("delete_precheck");
  2530.   if (check_one_table_access(thd, DELETE_ACL, tables))
  2531.     DBUG_RETURN(1);
  2532.   /* Set privilege for the WHERE clause */
  2533.   tables->grant.want_privilege=(SELECT_ACL & ~tables->grant.privilege);
  2534.   DBUG_RETURN(0);
  2535. }
  2536. /*
  2537.   simple INSERT query pre-check
  2538.   SYNOPSIS
  2539.     insert_precheck()
  2540.     thd Thread handler
  2541.     tables Global table list
  2542.   RETURN VALUE
  2543.     0   OK
  2544.     1   error (message is sent to user)
  2545.     -1  error (message is not sent to user)
  2546. */
  2547. int insert_precheck(THD *thd, TABLE_LIST *tables)
  2548. {
  2549.   LEX *lex= thd->lex;
  2550.   DBUG_ENTER("insert_precheck");
  2551.   /*
  2552.     Check that we have modify privileges for the first table and
  2553.     select privileges for the rest
  2554.   */
  2555.   ulong privilege= INSERT_ACL |
  2556.                    (lex->duplicates == DUP_REPLACE ? DELETE_ACL : 0) |
  2557.                    (lex->duplicates == DUP_UPDATE ? UPDATE_ACL : 0);
  2558.   if (check_one_table_access(thd, privilege, tables))
  2559.     DBUG_RETURN(1);
  2560.   if (lex->update_list.elements != lex->value_list.elements)
  2561.   {
  2562.     my_error(ER_WRONG_VALUE_COUNT, MYF(0));
  2563.     DBUG_RETURN(-1);
  2564.   }
  2565.   DBUG_RETURN(0);
  2566. }
  2567. /*
  2568.   CREATE TABLE query pre-check
  2569.   SYNOPSIS
  2570.     create_table_precheck()
  2571.     thd Thread handler
  2572.     tables Global table list
  2573.     create_table Table which will be created
  2574.   RETURN VALUE
  2575.     0   OK
  2576.     1   Error (message is sent to user)
  2577. */
  2578. int create_table_precheck(THD *thd, TABLE_LIST *tables,
  2579.   TABLE_LIST *create_table)
  2580. {
  2581.   LEX *lex= thd->lex;
  2582.   SELECT_LEX *select_lex= &lex->select_lex;
  2583.   ulong want_priv;
  2584.   int error= 1;                                 // Error message is given
  2585.   DBUG_ENTER("create_table_precheck");
  2586.   want_priv= ((lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) ?
  2587.               CREATE_TMP_ACL : CREATE_ACL);
  2588.   lex->create_info.alias= create_table->alias;
  2589.   if (check_access(thd, want_priv, create_table->db,
  2590.    &create_table->grant.privilege, 0, 0) ||
  2591.       check_merge_table_access(thd, create_table->db,
  2592.        (TABLE_LIST *)
  2593.        lex->create_info.merge_list.first))
  2594.     goto err;
  2595.   if (grant_option && want_priv != CREATE_TMP_ACL &&
  2596.       check_grant(thd, want_priv, create_table, 0, UINT_MAX, 0))
  2597.     goto err;
  2598.   if (select_lex->item_list.elements)
  2599.   {
  2600.     /* Check permissions for used tables in CREATE TABLE ... SELECT */
  2601.     /*
  2602.       For temporary tables or PREPARED STATEMETNS we don't have to check
  2603.       if the created table exists
  2604.     */
  2605.     if (!(lex->create_info.options & HA_LEX_CREATE_TMP_TABLE) &&
  2606.         ! thd->current_arena->is_stmt_prepare() &&
  2607.         find_real_table_in_list(tables, create_table->db,
  2608.                                 create_table->real_name))
  2609.     {
  2610.       net_printf(thd,ER_UPDATE_TABLE_USED, create_table->real_name);
  2611.       goto err;
  2612.     }
  2613.     if (lex->create_info.used_fields & HA_CREATE_USED_UNION)
  2614.     {
  2615.       TABLE_LIST *tab;
  2616.       for (tab= tables; tab; tab= tab->next)
  2617.       {
  2618.         if (find_real_table_in_list((TABLE_LIST*) lex->create_info.
  2619.                                     merge_list.first,
  2620.                                     tables->db, tab->real_name))
  2621.         {
  2622.           net_printf(thd, ER_UPDATE_TABLE_USED, tab->real_name);
  2623.           goto err;
  2624.         }
  2625.       }  
  2626.     }    
  2627.     if (tables && check_table_access(thd, SELECT_ACL, tables,0))
  2628.       goto err;
  2629.   }
  2630.   error= 0;
  2631. err:
  2632.   DBUG_RETURN(error);
  2633. }
  2634. /*
  2635.   negate given expression
  2636.   SYNOPSIS
  2637.     negate_expression()
  2638.     thd  therad handler
  2639.     expr expression for negation
  2640.   RETURN
  2641.     negated expression
  2642. */
  2643. Item *negate_expression(THD *thd, Item *expr)
  2644. {
  2645.   Item *negated;
  2646.   if (expr->type() == Item::FUNC_ITEM &&
  2647.       ((Item_func *) expr)->functype() == Item_func::NOT_FUNC)
  2648.   {
  2649.     /* it is NOT(NOT( ... )) */
  2650.     Item *arg= ((Item_func *) expr)->arguments()[0];
  2651.     enum_parsing_place place= thd->lex->current_select->parsing_place;
  2652.     if (arg->is_bool_func() || place == IN_WHERE || place == IN_HAVING)
  2653.       return arg;
  2654.     /*
  2655.       if it is not boolean function then we have to emulate value of
  2656.       not(not(a)), it will be a != 0
  2657.     */
  2658.     return new Item_func_ne(arg, new Item_int((char*) "0", 0, 1));
  2659.   }
  2660.   if ((negated= expr->neg_transformer(thd)) != 0)
  2661.     return negated;
  2662.   return new Item_func_not(expr);
  2663. }