~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to drizzled/sql_parse.cc

  • Committer: Brian Aker
  • Date: 2009-08-20 00:06:57 UTC
  • mfrom: (1115.3.6 captain)
  • Revision ID: brian@gaz-20090820000657-hw5twz33bw30lz4j
Merge Jay

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
/* Prototypes */
46
46
static bool append_file_to_dir(Session *session, const char **filename_ptr,
47
47
                               const char *table_name);
48
 
static bool reload_cache(Session *session, ulong options, TableList *tables);
49
48
 
50
49
bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
51
50
 
746
745
    }
747
746
    break;
748
747
  }
749
 
  case SQLCOM_CHECK:
750
 
  {
751
 
    assert(first_table == all_tables && first_table != 0);
752
 
    res = mysql_check_table(session, first_table, &lex->check_opt);
753
 
    select_lex->table_list.first= (unsigned char*) first_table;
754
 
    lex->query_tables=all_tables;
755
 
    break;
756
 
  }
757
 
  case SQLCOM_ANALYZE:
758
 
  {
759
 
    assert(first_table == all_tables && first_table != 0);
760
 
    res= mysql_analyze_table(session, first_table, &lex->check_opt);
761
 
    /* ! we write after unlocking the table */
762
 
    write_bin_log(session, true, session->query, session->query_length);
763
 
    select_lex->table_list.first= (unsigned char*) first_table;
764
 
    lex->query_tables=all_tables;
765
 
    break;
766
 
  }
767
 
 
768
 
  case SQLCOM_OPTIMIZE:
769
 
  {
770
 
    assert(first_table == all_tables && first_table != 0);
771
 
    res= mysql_optimize_table(session, first_table, &lex->check_opt);
772
 
    /* ! we write after unlocking the table */
773
 
    write_bin_log(session, true, session->query, session->query_length);
774
 
    select_lex->table_list.first= (unsigned char*) first_table;
775
 
    lex->query_tables=all_tables;
776
 
    break;
777
 
  }
778
 
  case SQLCOM_UPDATE:
779
 
    assert(first_table == all_tables && first_table != 0);
780
 
    if ((res= update_precheck(session, all_tables)))
781
 
      break;
782
 
    assert(select_lex->offset_limit == 0);
783
 
    unit->set_limit(select_lex);
784
 
    res= mysql_update(session, all_tables,
785
 
                      select_lex->item_list,
786
 
                      lex->value_list,
787
 
                      select_lex->where,
788
 
                      select_lex->order_list.elements,
789
 
                      (order_st *) select_lex->order_list.first,
790
 
                      unit->select_limit_cnt,
791
 
                      lex->duplicates, lex->ignore);
792
 
    break;
793
748
  case SQLCOM_REPLACE:
794
749
  case SQLCOM_INSERT:
795
750
  {
867
822
 
868
823
    break;
869
824
  }
870
 
  case SQLCOM_TRUNCATE:
871
 
    if (! session->endActiveTransaction())
872
 
    {
873
 
      res= -1;
874
 
      break;
875
 
    }
876
 
    assert(first_table == all_tables && first_table != 0);
877
 
    /*
878
 
      Don't allow this within a transaction because we want to use
879
 
      re-generate table
880
 
    */
881
 
    if (session->inTransaction())
882
 
    {
883
 
      my_message(ER_LOCK_OR_ACTIVE_TRANSACTION, ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
884
 
      goto error;
885
 
    }
886
 
 
887
 
    res= mysql_truncate(session, first_table, 0);
888
 
 
889
 
    break;
890
 
  case SQLCOM_DROP_TABLE:
891
 
  {
892
 
    assert(first_table == all_tables && first_table != 0);
893
 
    if (!lex->drop_temporary)
894
 
    {
895
 
      if (! session->endActiveTransaction())
896
 
        goto error;
897
 
    }
898
 
    else
899
 
    {
900
 
      /* So that DROP TEMPORARY TABLE gets to binlog at commit/rollback */
901
 
      session->options|= OPTION_KEEP_LOG;
902
 
    }
903
 
    /* DDL and binlog write order protected by LOCK_open */
904
 
    res= mysql_rm_table(session, first_table, lex->drop_if_exists, lex->drop_temporary);
905
 
  }
906
 
  break;
907
 
  case SQLCOM_CHANGE_DB:
908
 
  {
909
 
    LEX_STRING db_str= { (char *) select_lex->db, strlen(select_lex->db) };
910
 
 
911
 
    if (!mysql_change_db(session, &db_str, false))
912
 
      session->my_ok();
913
 
 
914
 
    break;
915
 
  }
916
 
  case SQLCOM_SET_OPTION:
917
 
  {
918
 
    List<set_var_base> *lex_var_list= &lex->var_list;
919
 
 
920
 
    if (session->openTablesLock(all_tables))
921
 
      goto error;
922
 
    if (!(res= sql_set_variables(session, lex_var_list)))
923
 
    {
924
 
      session->my_ok();
925
 
    }
926
 
    else
927
 
    {
928
 
      /*
929
 
        We encountered some sort of error, but no message was sent.
930
 
        Send something semi-generic here since we don't know which
931
 
        assignment in the list caused the error.
932
 
      */
933
 
      if (!session->is_error())
934
 
        my_error(ER_WRONG_ARGUMENTS,MYF(0),"SET");
935
 
      goto error;
936
 
    }
937
 
 
938
 
    break;
939
 
  }
940
 
  case SQLCOM_CREATE_DB:
941
 
  {
942
 
    /*
943
 
      As mysql_create_db() may modify HA_CREATE_INFO structure passed to
944
 
      it, we need to use a copy of LEX::create_info to make execution
945
 
      prepared statement- safe.
946
 
    */
947
 
    HA_CREATE_INFO create_info(lex->create_info);
948
 
    if (! session->endActiveTransaction())
949
 
    {
950
 
      res= -1;
951
 
      break;
952
 
    }
953
 
    char *alias;
954
 
    if (!(alias=session->strmake(lex->name.str, lex->name.length)) ||
955
 
        check_db_name(&lex->name))
956
 
    {
957
 
      my_error(ER_WRONG_DB_NAME, MYF(0), lex->name.str);
958
 
      break;
959
 
    }
960
 
    res= mysql_create_db(session,(lex->name.str), &create_info);
961
 
    break;
962
 
  }
963
 
  case SQLCOM_DROP_DB:
964
 
  {
965
 
    if (! session->endActiveTransaction())
966
 
    {
967
 
      res= -1;
968
 
      break;
969
 
    }
970
 
    if (check_db_name(&lex->name))
971
 
    {
972
 
      my_error(ER_WRONG_DB_NAME, MYF(0), lex->name.str);
973
 
      break;
974
 
    }
975
 
    if (session->inTransaction())
976
 
    {
977
 
      my_message(ER_LOCK_OR_ACTIVE_TRANSACTION, ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
978
 
      goto error;
979
 
    }
980
 
    res= mysql_rm_db(session, lex->name.str, lex->drop_if_exists);
981
 
    break;
982
 
  }
983
 
  case SQLCOM_ALTER_DB:
984
 
  {
985
 
    LEX_STRING *db= &lex->name;
986
 
    HA_CREATE_INFO create_info(lex->create_info);
987
 
    if (check_db_name(db))
988
 
    {
989
 
      my_error(ER_WRONG_DB_NAME, MYF(0), db->str);
990
 
      break;
991
 
    }
992
 
    if (session->inTransaction())
993
 
    {
994
 
      my_message(ER_LOCK_OR_ACTIVE_TRANSACTION, ER(ER_LOCK_OR_ACTIVE_TRANSACTION), MYF(0));
995
 
      goto error;
996
 
    }
997
 
    res= mysql_alter_db(session, db->str, &create_info);
998
 
    break;
999
 
  }
1000
 
  case SQLCOM_FLUSH:
1001
 
  {
1002
 
    /*
1003
 
      reload_cache() will tell us if we are allowed to write to the
1004
 
      binlog or not.
1005
 
    */
1006
 
    if (!reload_cache(session, lex->type, first_table))
1007
 
    {
1008
 
      /*
1009
 
        We WANT to write and we CAN write.
1010
 
        ! we write after unlocking the table.
1011
 
      */
1012
 
      /*
1013
 
        Presumably, RESET and binlog writing doesn't require synchronization
1014
 
      */
1015
 
      write_bin_log(session, false, session->query, session->query_length);
1016
 
      session->my_ok();
1017
 
    }
1018
 
 
1019
 
    break;
1020
 
  }
1021
 
  case SQLCOM_KILL:
1022
 
  {
1023
 
    Item *it= (Item *)lex->value_list.head();
1024
 
 
1025
 
    if ((!it->fixed && it->fix_fields(lex->session, &it)) || it->check_cols(1))
1026
 
    {
1027
 
      my_message(ER_SET_CONSTANTS_ONLY, ER(ER_SET_CONSTANTS_ONLY),
1028
 
                 MYF(0));
1029
 
      goto error;
1030
 
    }
1031
 
    sql_kill(session, (ulong)it->val_int(), lex->type & ONLY_KILL_QUERY);
1032
 
    break;
1033
 
  }
1034
825
  case SQLCOM_BEGIN:
1035
826
    if (session->transaction.xid_state.xa_state != XA_NOTR)
1036
827
    {
1170
961
    wants. We also keep the last value in case of SQLCOM_CALL or
1171
962
    SQLCOM_EXECUTE.
1172
963
  */
1173
 
  if (!(sql_command_flags[lex->sql_command].test(CF_BIT_HAS_ROW_COUNT)))
 
964
  if (! (sql_command_flags[lex->sql_command].test(CF_BIT_HAS_ROW_COUNT)))
 
965
  {
1174
966
    session->row_count_func= -1;
 
967
  }
1175
968
 
1176
969
  goto finish;
1177
970
 
2137
1930
 
2138
1931
 
2139
1932
/**
2140
 
  Reload/resets privileges and the different caches.
2141
 
 
2142
 
  @param session Thread handler (can be NULL!)
2143
 
  @param options What should be reset/reloaded (tables, privileges, slave...)
2144
 
  @param tables Tables to flush (if any)
2145
 
  @param write_to_binlog True if we can write to the binlog.
2146
 
 
2147
 
  @note Depending on 'options', it may be very bad to write the
2148
 
    query to the binlog (e.g. FLUSH SLAVE); this is a
2149
 
    pointer where reload_cache() will put 0 if
2150
 
    it thinks we really should not write to the binlog.
2151
 
    Otherwise it will put 1.
2152
 
 
2153
 
  @return Error status code
2154
 
    @retval 0 Ok
2155
 
    @retval !=0  Error; session->killed is set or session->is_error() is true
2156
 
*/
2157
 
 
2158
 
static bool reload_cache(Session *session, ulong options, TableList *tables)
2159
 
{
2160
 
  bool result=0;
2161
 
 
2162
 
  if (options & REFRESH_LOG)
2163
 
  {
2164
 
    if (ha_flush_logs(NULL))
2165
 
      result=1;
2166
 
  }
2167
 
  /*
2168
 
    Note that if REFRESH_READ_LOCK bit is set then REFRESH_TABLES is set too
2169
 
    (see sql_yacc.yy)
2170
 
  */
2171
 
  if (options & (REFRESH_TABLES | REFRESH_READ_LOCK))
2172
 
  {
2173
 
    if ((options & REFRESH_READ_LOCK) && session)
2174
 
    {
2175
 
      if (lock_global_read_lock(session))
2176
 
        return true;                               // Killed
2177
 
      result= session->close_cached_tables(tables, (options & REFRESH_FAST) ?  false : true, true);
2178
 
      if (make_global_read_lock_block_commit(session)) // Killed
2179
 
      {
2180
 
        /* Don't leave things in a half-locked state */
2181
 
        unlock_global_read_lock(session);
2182
 
 
2183
 
        return true;
2184
 
      }
2185
 
    }
2186
 
    else
2187
 
      result= session->close_cached_tables(tables, (options & REFRESH_FAST) ?  false : true, false);
2188
 
  }
2189
 
  if (session && (options & REFRESH_STATUS))
2190
 
    session->refresh_status();
2191
 
 
2192
 
 return result;
2193
 
}
2194
 
 
2195
 
 
2196
 
/**
2197
1933
  kill on thread.
2198
1934
 
2199
1935
  @param session                        Thread class