diff options
Diffstat (limited to 'sql/sql_parse.cc')
-rw-r--r-- | sql/sql_parse.cc | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 92a21b5982d..6e6ec025a1f 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -333,8 +333,7 @@ int check_user(THD *thd, enum enum_server_command command, DBUG_RETURN(-1); } } - else - send_ok(thd); + send_ok(thd); thd->password= test(passwd_len); // remember for error messages /* Ready to handle queries */ DBUG_RETURN(0); @@ -1815,9 +1814,18 @@ mysql_execute_command(THD *thd) } } } - if (&lex->select_lex != lex->all_selects_list && - lex->unit.create_total_list(thd, lex, &tables, 0)) - DBUG_VOID_RETURN; + if (&lex->select_lex != lex->all_selects_list) + { + byte *save= lex->select_lex.table_list.first; + if (lex->sql_command == SQLCOM_CREATE_TABLE) + { + /* Skip first table, which is the table we are creating */ + lex->select_lex.table_list.first= (byte*) (((TABLE_LIST *) save)->next); + } + if (lex->unit.create_total_list(thd, lex, &tables, 0)) + DBUG_VOID_RETURN; + lex->select_lex.table_list.first= save; + } /* When option readonly is set deny operations which change tables. @@ -2595,7 +2603,6 @@ mysql_execute_command(THD *thd) case SQLCOM_REPLACE_SELECT: case SQLCOM_INSERT_SELECT: { - /* Check that we have modify privileges for the first table and select privileges for the rest @@ -2616,6 +2623,11 @@ mysql_execute_command(THD *thd) goto error; } #endif + + /* Fix lock for first table */ + if (tables->lock_type == TL_WRITE_DELAYED) + tables->lock_type == TL_WRITE; + /* Don't unlock tables until command is written to binary log */ select_lex->options|= SELECT_NO_UNLOCK; @@ -3247,6 +3259,7 @@ mysql_execute_command(THD *thd) mysql_update_log.write(thd, thd->query, thd->query_length); if (mysql_bin_log.is_open()) { + thd->clear_error(); Query_log_event qinfo(thd, thd->query, thd->query_length, 0); mysql_bin_log.write(&qinfo); } @@ -3267,6 +3280,7 @@ mysql_execute_command(THD *thd) mysql_update_log.write(thd, thd->query, thd->query_length); if (mysql_bin_log.is_open()) { + thd->clear_error(); Query_log_event qinfo(thd, thd->query, thd->query_length, 0); mysql_bin_log.write(&qinfo); } @@ -3780,7 +3794,9 @@ mysql_init_query(THD *thd) thd->last_insert_id_used= thd->query_start_used= thd->insert_id_used=0; thd->sent_row_count= thd->examined_row_count= 0; thd->is_fatal_error= thd->rand_used= 0; - thd->server_status &= ~SERVER_MORE_RESULTS_EXISTS; + thd->server_status&= ~ (SERVER_MORE_RESULTS_EXISTS | + SERVER_QUERY_NO_INDEX_USED | + SERVER_QUERY_NO_GOOD_INDEX_USED); thd->tmp_table_used= 0; if (opt_bin_log) reset_dynamic(&thd->user_var_events); @@ -3987,7 +4003,12 @@ bool add_field_to_list(THD *thd, char *field_name, enum_field_types type, if (default_value) { - if (default_value->type() == Item::NULL_ITEM) + if (type == FIELD_TYPE_TIMESTAMP) + { + net_printf(&thd->net, ER_INVALID_DEFAULT, field_name); + DBUG_RETURN(1); + } + else if (default_value->type() == Item::NULL_ITEM) { default_value=0; if ((type_modifier & (NOT_NULL_FLAG | AUTO_INCREMENT_FLAG)) == |