13
13
along with this program; if not, write to the Free Software
14
14
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
18
18
#define DRIZZLE_LEX 1
20
#include <drizzled/item/num.h>
21
#include <drizzled/abort_exception.h>
22
20
#include <drizzled/my_hash.h>
23
21
#include <drizzled/error.h>
24
22
#include <drizzled/nested_join.h>
25
23
#include <drizzled/query_id.h>
26
#include <drizzled/transaction_services.h>
24
#include "drizzled/transaction_services.h"
27
25
#include <drizzled/sql_parse.h>
28
26
#include <drizzled/data_home.h>
29
27
#include <drizzled/sql_base.h>
30
28
#include <drizzled/show.h>
29
#include <drizzled/db.h>
31
30
#include <drizzled/function/time/unix_timestamp.h>
32
31
#include <drizzled/function/get_system_var.h>
33
32
#include <drizzled/item/cmpfunc.h>
34
33
#include <drizzled/item/null.h>
35
34
#include <drizzled/session.h>
36
#include <drizzled/session/cache.h>
37
35
#include <drizzled/sql_load.h>
38
36
#include <drizzled/lock.h>
39
37
#include <drizzled/select_send.h>
40
38
#include <drizzled/plugin/client.h>
41
39
#include <drizzled/statement.h>
42
40
#include <drizzled/statement/alter_table.h>
43
#include <drizzled/probes.h>
44
#include <drizzled/global_charset_info.h>
46
#include <drizzled/plugin/logging.h>
47
#include <drizzled/plugin/query_rewrite.h>
48
#include <drizzled/plugin/query_cache.h>
49
#include <drizzled/plugin/authorization.h>
50
#include <drizzled/optimizer/explain_plan.h>
51
#include <drizzled/pthread_globals.h>
52
#include <drizzled/plugin/event_observer.h>
53
#include <drizzled/visibility.h>
55
#include <drizzled/schema.h>
41
#include "drizzled/probes.h"
42
#include "drizzled/session_list.h"
43
#include "drizzled/global_charset_info.h"
45
#include "drizzled/plugin/logging.h"
46
#include "drizzled/plugin/query_rewrite.h"
47
#include "drizzled/plugin/query_cache.h"
48
#include "drizzled/plugin/authorization.h"
49
#include "drizzled/optimizer/explain_plan.h"
50
#include "drizzled/pthread_globals.h"
51
#include "drizzled/plugin/event_observer.h"
57
53
#include <limits.h>
60
56
#include <algorithm>
61
#include <boost/date_time.hpp>
62
#include <drizzled/internal/my_sys.h>
58
#include "drizzled/internal/my_sys.h"
64
60
using namespace std;
66
extern int base_sql_parse(drizzled::Session *session); // from sql_yacc.cc
62
extern int DRIZZLEparse(void *session); // from sql_yacc.cc
72
bool my_yyoverflow(short **a, ParserType **b, ulong *yystacksize);
68
bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
73
69
static bool parse_sql(Session *session, Lex_input_stream *lip);
74
void parse(Session *session, const char *inBuf, uint32_t length);
70
void mysql_parse(Session *session, const char *inBuf, uint32_t length);
77
73
@defgroup Runtime_Environment Runtime Environment
81
77
extern size_t my_thread_stack_size;
82
78
extern const CHARSET_INFO *character_set_filesystem;
87
static const std::string command_name[COM_END+1]={
95
"Error" // Last command number
80
const LEX_STRING command_name[COM_END+1]={
81
{ C_STRING_WITH_LEN("Sleep") },
82
{ C_STRING_WITH_LEN("Quit") },
83
{ C_STRING_WITH_LEN("Init DB") },
84
{ C_STRING_WITH_LEN("Query") },
85
{ C_STRING_WITH_LEN("Shutdown") },
86
{ C_STRING_WITH_LEN("Connect") },
87
{ C_STRING_WITH_LEN("Ping") },
88
{ C_STRING_WITH_LEN("Error") } // Last command number
100
91
const char *xa_state_names[]={
101
92
"NON-EXISTING", "ACTIVE", "IDLE", "PREPARED"
235
222
if (not session->readAndStoreQuery(packet, packet_length))
236
223
break; // fatal error is set
237
DRIZZLE_QUERY_START(session->getQueryString()->c_str(),
224
DRIZZLE_QUERY_START(session->query.c_str(),
238
225
session->thread_id,
239
const_cast<const char *>(session->schema()->c_str()));
226
const_cast<const char *>(session->db.empty() ? "" : session->db.c_str()));
241
parse(session, session->getQueryString()->c_str(), session->getQueryString()->length());
228
plugin::QueryRewriter::rewriteQuery(session->db, session->query);
229
std::cerr << "SQL:" << session->query << "\n";
230
mysql_parse(session, session->query.c_str(), session->query.length());
297
286
case Diagnostics_area::DA_ERROR:
298
287
/* The query failed, send error to log and abort bootstrap. */
299
session->getClient()->sendError(session->main_da.sql_errno(),
288
session->client->sendError(session->main_da.sql_errno(),
300
289
session->main_da.message());
303
292
case Diagnostics_area::DA_EOF:
304
session->getClient()->sendEOF();
293
session->client->sendEOF();
307
296
case Diagnostics_area::DA_OK:
308
session->getClient()->sendOK();
297
session->client->sendOK();
311
300
case Diagnostics_area::DA_DISABLED:
446
static int execute_command(Session *session)
437
mysql_execute_command(Session *session)
440
LEX *lex= session->lex;
450
441
/* first Select_Lex (have special meaning for many of non-SELECTcommands) */
451
Select_Lex *select_lex= &session->getLex()->select_lex;
442
Select_Lex *select_lex= &lex->select_lex;
453
443
/* list of all tables in query */
454
444
TableList *all_tables;
445
/* A peek into the query string */
446
size_t proc_info_len= session->query.length() > PROCESS_LIST_WIDTH ?
447
PROCESS_LIST_WIDTH : session->query.length();
449
memcpy(session->process_list_info, session->query.c_str(), proc_info_len);
450
session->process_list_info[proc_info_len]= '\0';
457
453
In many cases first table of main Select_Lex have special meaning =>
468
464
assert(first_table == all_tables);
469
465
assert(first_table == all_tables && first_table != 0);
471
session->getLex()->first_lists_tables_same();
467
lex->first_lists_tables_same();
473
468
/* should be assigned after making first tables same */
474
all_tables= session->getLex()->query_tables;
469
all_tables= lex->query_tables;
476
470
/* set context for commands which do not use setup_tables */
477
select_lex->context.resolve_in_table_list_only((TableList*)select_lex->table_list.first);
472
context.resolve_in_table_list_only((TableList*)select_lex->
480
476
Reset warning count for each query that uses tables
483
479
variables, but for now this is probably good enough.
484
480
Don't reset warnings when executing a stored routine.
486
if (all_tables || ! session->getLex()->is_single_level_stmt())
482
if (all_tables || ! lex->is_single_level_stmt())
488
484
drizzle_reset_errors(session, 0);
491
487
assert(session->transaction.stmt.hasModifiedNonTransData() == false);
493
if (! (session->server_status & SERVER_STATUS_AUTOCOMMIT)
494
&& ! session->inTransaction()
495
&& session->getLex()->statement->isTransactional())
497
if (session->startTransaction() == false)
499
my_error(drizzled::ER_UNKNOWN_ERROR, MYF(0));
504
489
/* now we are ready to execute the statement */
505
res= session->getLex()->statement->execute();
490
res= lex->statement->execute();
506
491
session->set_proc_info("query end");
508
493
The return value for ROW_COUNT() is "implementation dependent" if the
557
529
session->send_explain_fields(result);
558
530
optimizer::ExplainPlan planner;
559
res= planner.explainUnion(session, &session->getLex()->unit, result);
531
res= planner.explainUnion(session, &session->lex->unit, result);
560
532
if (lex->describe & DESCRIBE_EXTENDED)
563
535
String str(buff,(uint32_t) sizeof(buff), system_charset_info);
565
session->getLex()->unit.print(&str, QT_ORDINARY);
537
session->lex->unit.print(&str, QT_ORDINARY);
566
538
str.append('\0');
567
539
push_warning(session, DRIZZLE_ERROR::WARN_LEVEL_NOTE,
568
540
ER_YES, str.ptr());
644
new_select(LEX *lex, bool move_down)
615
mysql_new_select(LEX *lex, bool move_down)
646
617
Select_Lex *select_lex;
647
618
Session *session= lex->session;
649
620
if (!(select_lex= new (session->mem_root) Select_Lex()))
652
622
select_lex->select_number= ++session->select_number;
653
623
select_lex->parent_lex= lex; /* Used in init_query. */
654
624
select_lex->init_query();
655
625
select_lex->init_select();
656
626
lex->nest_level++;
658
627
if (lex->nest_level > (int) MAX_SELECT_NESTING)
660
629
my_error(ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT,MYF(0),MAX_SELECT_NESTING);
664
632
select_lex->nest_level= lex->nest_level;
688
656
if (lex->current_select->order_list.first && !lex->current_select->braces)
690
658
my_error(ER_WRONG_USAGE, MYF(0), "UNION", "order_st BY");
694
661
select_lex->include_neighbour(lex->current_select);
695
662
Select_Lex_Unit *unit= select_lex->master_unit();
697
if (not unit->fake_select_lex && unit->add_fake_select_lex(lex->session))
663
if (!unit->fake_select_lex && unit->add_fake_select_lex(lex->session))
700
665
select_lex->context.outer_context=
701
666
unit->first_select()->context.outer_context;
723
687
@param var_name Variable name
726
void create_select_for_variable(Session *session, const char *var_name)
690
void create_select_for_variable(const char *var_name)
729
694
LEX_STRING tmp, null_lex_string;
731
696
char buff[MAX_SYS_VAR_LENGTH*2+4+8];
734
lex= session->getLex();
699
session= current_session;
701
mysql_init_select(lex);
736
702
lex->sql_command= SQLCOM_SELECT;
737
703
tmp.str= (char*) var_name;
738
704
tmp.length=strlen(var_name);
758
725
@param length Length of the query text
761
void parse(Session *session, const char *inBuf, uint32_t length)
728
void mysql_parse(Session *session, const char *inBuf, uint32_t length)
763
session->getLex()->start(session);
730
uint64_t start_time= my_getsystime();
731
session->lex->start(session);
765
732
session->reset_for_next_command();
766
733
/* Check if the Query is Cached if and return true if yes
767
734
* TODO the plugin has to make sure that the query is cacheble
779
LEX *lex= session->getLex();
746
LEX *lex= session->lex;
780
747
Lex_input_stream lip(session, inBuf, length);
781
748
bool err= parse_sql(session, &lip);
785
if (not session->is_error())
752
if (! session->is_error())
787
DRIZZLE_QUERY_EXEC_START(session->getQueryString()->c_str(),
754
DRIZZLE_QUERY_EXEC_START(session->query.c_str(),
788
755
session->thread_id,
789
const_cast<const char *>(session->schema()->c_str()));
756
const_cast<const char *>(session->db.empty() ? "" : session->db.c_str()));
790
757
// Implement Views here --Brian
791
758
/* Actually execute the query */
794
execute_command(session);
761
mysql_execute_command(session);
798
765
// Just try to catch any random failures that could have come
799
766
// during execution.
802
768
DRIZZLE_QUERY_EXEC_DONE(0);
933
907
TableList *Select_Lex::add_table_to_list(Session *session,
936
const bitset<NUM_OF_TABLE_OPTIONS>& table_options,
937
thr_lock_type lock_type,
938
List<Index_hint> *index_hints_arg,
910
const bitset<NUM_OF_TABLE_OPTIONS>& table_options,
911
thr_lock_type lock_type,
912
List<Index_hint> *index_hints_arg,
939
913
LEX_STRING *option)
942
916
TableList *previous_table_ref; /* The table preceding the current one. */
944
LEX *lex= session->getLex();
918
LEX *lex= session->lex;
947
921
return NULL; // End of memory
1011
987
tables=tables->next_local)
1013
if (not my_strcasecmp(table_alias_charset, alias_str, tables->alias) &&
1014
not my_strcasecmp(system_charset_info, ptr->getSchemaName(), tables->getSchemaName()))
989
if (!my_strcasecmp(table_alias_charset, alias_str, tables->alias) &&
990
!strcasecmp(ptr->getSchemaName(), tables->getSchemaName()))
1016
992
my_error(ER_NONUNIQ_TABLE, MYF(0), alias_str);
1151
1127
TableList *Select_Lex::nest_last_join(Session *session)
1153
1129
TableList *ptr;
1154
NestedJoin *nested_join;
1130
nested_join_st *nested_join;
1155
1131
List<TableList> *embedded_list;
1157
1133
if (!(ptr= (TableList*) session->calloc(ALIGN_SIZE(sizeof(TableList))+
1158
sizeof(NestedJoin))))
1134
sizeof(nested_join_st))))
1160
ptr->setNestedJoin(((NestedJoin*) ((unsigned char*) ptr + ALIGN_SIZE(sizeof(TableList)))));
1136
ptr->setNestedJoin(((nested_join_st*) ((unsigned char*) ptr + ALIGN_SIZE(sizeof(TableList)))));
1161
1137
nested_join= ptr->getNestedJoin();
1162
1138
ptr->setEmbedding(embedding);
1163
1139
ptr->setJoinList(join_list);
1164
1140
ptr->alias= (char*) "(nest_last_join)";
1165
1141
embedded_list= &nested_join->join_list;
1166
embedded_list->clear();
1142
embedded_list->empty();
1168
1144
for (uint32_t i=0; i < 2; i++)
1430
@param session Thread class
1432
@param only_kill_query Should it kill the query or the connection
1435
This is written such that we have a short lock on LOCK_thread_count
1439
kill_one_thread(Session *, session_id_t id, bool only_kill_query)
1442
uint32_t error= ER_NO_SUCH_THREAD;
1445
boost::mutex::scoped_lock scoped(LOCK_thread_count);
1446
for (SessionList::iterator it= getSessionList().begin(); it != getSessionList().end(); ++it )
1448
if ((*it)->thread_id == id)
1451
tmp->lockForDelete();
1460
if (tmp->isViewable())
1462
tmp->awake(only_kill_query ? Session::KILL_QUERY : Session::KILL_CONNECTION);
1466
tmp->unlockForDelete();
1473
kills a thread and sends response
1477
session Thread class
1479
only_kill_query Should it kill the query or the connection
1482
void sql_kill(Session *session, int64_t id, bool only_kill_query)
1485
if (!(error= kill_one_thread(session, id, only_kill_query)))
1488
my_error(error, MYF(0), id);
1452
1493
Check if the select is a simple select (not an union).
1519
1562
bool update_precheck(Session *session, TableList *)
1521
1564
const char *msg= 0;
1522
Select_Lex *select_lex= &session->getLex()->select_lex;
1565
LEX *lex= session->lex;
1566
Select_Lex *select_lex= &lex->select_lex;
1524
if (session->getLex()->select_lex.item_list.elements != session->getLex()->value_list.elements)
1568
if (session->lex->select_lex.item_list.elements != session->lex->value_list.elements)
1526
1570
my_message(ER_WRONG_VALUE_COUNT, ER(ER_WRONG_VALUE_COUNT), MYF(0));
1530
if (session->getLex()->select_lex.table_list.elements > 1)
1574
if (session->lex->select_lex.table_list.elements > 1)
1532
1576
if (select_lex->order_list.elements)
1533
1577
msg= "ORDER BY";
1620
CREATE TABLE query pre-check.
1622
@param session Thread handler
1623
@param tables Global table list
1624
@param create_table Table which will be created
1632
bool create_table_precheck(TableIdentifier &identifier)
1634
if (not plugin::StorageEngine::canCreateTable(identifier))
1636
my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), "", "", identifier.getSchemaName().c_str());
1640
if (not plugin::StorageEngine::doesSchemaExist(identifier))
1642
my_error(ER_BAD_DB_ERROR, MYF(0), identifier.getSchemaName().c_str());
1574
1651
negate given expression.
1576
1653
@param session thread handler
1705
1781
/* Parse the query. */
1707
bool parse_status= base_sql_parse(session) != 0;
1783
bool mysql_parse_status= DRIZZLEparse(session) != 0;
1709
1785
/* Check that if DRIZZLEparse() failed, session->is_error() is set. */
1711
assert(!parse_status || session->is_error());
1787
assert(!mysql_parse_status || session->is_error());
1713
1789
/* Reset Lex_input_stream. */
1715
1791
session->m_lip= NULL;
1717
DRIZZLE_QUERY_PARSE_DONE(parse_status || session->is_fatal_error);
1793
DRIZZLE_QUERY_PARSE_DONE(mysql_parse_status || session->is_fatal_error);
1719
1795
/* That's it. */
1721
return parse_status || session->is_fatal_error;
1797
return mysql_parse_status || session->is_fatal_error;