Merge branch 'Z3' of https://github.com/skysql/MaxScale into Z3
Conflicts: server/modules/routing/readwritesplit/readwritesplit.c
This commit is contained in:
@ -541,8 +541,15 @@ static skygw_query_type_t resolve_query_type(
|
||||
type |= QUERY_TYPE_SESSION_WRITE;
|
||||
}
|
||||
else
|
||||
{
|
||||
{
|
||||
type |= QUERY_TYPE_WRITE;
|
||||
|
||||
if (lex->create_info.options & HA_LEX_CREATE_TMP_TABLE &&
|
||||
lex->sql_command == SQLCOM_CREATE_TABLE)
|
||||
{
|
||||
type |= QUERY_TYPE_CREATE_TMP_TABLE;
|
||||
}
|
||||
|
||||
}
|
||||
goto return_qtype;
|
||||
}
|
||||
@ -884,6 +891,183 @@ char* skygw_query_classifier_get_stmtname(
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds the head of the list of tables affected by the current select statement.
|
||||
* @param thd Pointer to a valid THD
|
||||
* @return Pointer to the head of the TABLE_LIST chain or NULL in case of an error
|
||||
*/
|
||||
void* skygw_get_affected_tables(void* thdp)
|
||||
{
|
||||
THD* thd = (THD*)thdp;
|
||||
|
||||
if(thd == NULL ||
|
||||
thd->lex == NULL ||
|
||||
thd->lex->current_select == NULL)
|
||||
{
|
||||
ss_dassert(thd != NULL &&
|
||||
thd->lex != NULL &&
|
||||
thd->lex->current_select != NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return (void*)thd->lex->current_select->table_list.first;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reads the parsetree and lists all the affected tables and views in the query.
|
||||
* In the case of an error, the size of the table is set to zero and no memory is allocated.
|
||||
* The caller must free the allocated memory.
|
||||
*
|
||||
* @param querybuf GWBUF where the table names are extracted from
|
||||
* @param tblsize Pointer where the number of tables is written
|
||||
* @return Array of null-terminated strings with the table names
|
||||
*/
|
||||
char** skygw_get_table_names(GWBUF* querybuf,int* tblsize)
|
||||
{
|
||||
parsing_info_t* pi;
|
||||
MYSQL* mysql;
|
||||
THD* thd;
|
||||
TABLE_LIST* tbl;
|
||||
int i = 0, currtblsz = 0;
|
||||
char**tables,**tmp;
|
||||
|
||||
if (!GWBUF_IS_PARSED(querybuf))
|
||||
{
|
||||
tables = NULL;
|
||||
goto retblock;
|
||||
}
|
||||
pi = (parsing_info_t *)gwbuf_get_buffer_object_data(querybuf,
|
||||
GWBUF_PARSING_INFO);
|
||||
|
||||
if (pi == NULL)
|
||||
{
|
||||
tables = NULL;
|
||||
goto retblock;
|
||||
}
|
||||
|
||||
if (pi->pi_query_plain_str == NULL ||
|
||||
(mysql = (MYSQL *)pi->pi_handle) == NULL ||
|
||||
(thd = (THD *)mysql->thd) == NULL)
|
||||
{
|
||||
ss_dassert(pi->pi_query_plain_str != NULL &&
|
||||
mysql != NULL &&
|
||||
thd != NULL);
|
||||
tables = NULL;
|
||||
goto retblock;
|
||||
}
|
||||
|
||||
thd->lex->current_select = thd->lex->all_selects_list;
|
||||
|
||||
while(thd->lex->current_select){
|
||||
|
||||
tbl = (TABLE_LIST*)skygw_get_affected_tables(thd);
|
||||
|
||||
while (tbl)
|
||||
{
|
||||
if(i >= currtblsz){
|
||||
|
||||
tmp = (char**)malloc(sizeof(char*)*(currtblsz*2+1));
|
||||
|
||||
if(tmp){
|
||||
if(currtblsz > 0){
|
||||
int x;
|
||||
for(x = 0;x<currtblsz;x++){
|
||||
tmp[x] = tables[x];
|
||||
}
|
||||
free(tables);
|
||||
}
|
||||
|
||||
tables = tmp;
|
||||
currtblsz = currtblsz*2 + 1;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
tables[i++] = strdup(tbl->alias);
|
||||
tbl=tbl->next_local;
|
||||
}
|
||||
thd->lex->current_select = thd->lex->current_select->next_select_in_list();
|
||||
}
|
||||
|
||||
retblock:
|
||||
*tblsize = i;
|
||||
return tables;
|
||||
}
|
||||
/**
|
||||
* Extract the name of the created table.
|
||||
* @param querybuf Buffer to use.
|
||||
* @return A pointer to the name if a table was created, otherwise NULL
|
||||
*/
|
||||
char* skygw_get_created_table_name(GWBUF* querybuf)
|
||||
{
|
||||
parsing_info_t* pi;
|
||||
MYSQL* mysql;
|
||||
THD* thd;
|
||||
if (!GWBUF_IS_PARSED(querybuf))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
pi = (parsing_info_t *)gwbuf_get_buffer_object_data(querybuf,
|
||||
GWBUF_PARSING_INFO);
|
||||
|
||||
if (pi == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if ((mysql = (MYSQL *)pi->pi_handle) == NULL ||
|
||||
(thd = (THD *)mysql->thd) == NULL)
|
||||
{
|
||||
ss_dassert(mysql != NULL &&
|
||||
thd != NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if(thd->lex->create_last_non_select_table &&
|
||||
thd->lex->create_last_non_select_table->table_name){
|
||||
char* name = strdup(thd->lex->create_last_non_select_table->table_name);
|
||||
return name;
|
||||
}else{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
}
|
||||
/**
|
||||
* Checks whether the buffer contains a DROP TABLE... query.
|
||||
* @param querybuf Buffer to inspect
|
||||
* @return true if it contains the query otherwise false
|
||||
*/
|
||||
bool is_drop_table_query(GWBUF* querybuf)
|
||||
{
|
||||
parsing_info_t* pi;
|
||||
MYSQL* mysql;
|
||||
THD* thd;
|
||||
|
||||
if (!GWBUF_IS_PARSED(querybuf))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
pi = (parsing_info_t *)gwbuf_get_buffer_object_data(querybuf,
|
||||
GWBUF_PARSING_INFO);
|
||||
|
||||
if (pi == NULL)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((mysql = (MYSQL *)pi->pi_handle) == NULL ||
|
||||
(thd = (THD *)mysql->thd) == NULL)
|
||||
{
|
||||
ss_dassert(mysql != NULL &&
|
||||
thd != NULL);
|
||||
return false;
|
||||
}
|
||||
|
||||
return thd->lex->sql_command == SQLCOM_DROP_TABLE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Replace user-provided literals with question marks. Return a copy of the
|
||||
* querystr with replacements.
|
||||
*
|
||||
|
@ -45,7 +45,9 @@ typedef enum {
|
||||
QUERY_TYPE_PREPARE_NAMED_STMT = 0x0400, /*< Prepared stmt with name from user */
|
||||
QUERY_TYPE_PREPARE_STMT = 0x0800, /*< Prepared stmt with id provided by server */
|
||||
QUERY_TYPE_EXEC_STMT = 0x1000, /*< Execute prepared statement */
|
||||
QUERY_TYPE_SESSION_READ = 0x2000 /*< Read session data (from master 31.8.14) */
|
||||
QUERY_TYPE_SESSION_READ = 0x2000, /*< Read session data (from master 31.8.14) */
|
||||
QUERY_TYPE_CREATE_TMP_TABLE = 0x4000, /*< Create temporary table */
|
||||
QUERY_TYPE_READ_TMP_TABLE = 0x8000 /*< Read temporary table */
|
||||
} skygw_query_type_t;
|
||||
|
||||
|
||||
@ -72,6 +74,10 @@ skygw_query_type_t query_classifier_get_type(GWBUF* querybuf);
|
||||
|
||||
/** Free THD context and close MYSQL */
|
||||
char* skygw_query_classifier_get_stmtname(MYSQL* mysql);
|
||||
char* skygw_get_created_table_name(GWBUF* querybuf);
|
||||
bool is_drop_table_query(GWBUF* querybuf);
|
||||
void* skygw_get_affected_tables(void* thdp);
|
||||
char** skygw_get_table_names(GWBUF* querybuf,int* tblsize);
|
||||
char* skygw_get_canonical(GWBUF* querybuf);
|
||||
bool parse_query (GWBUF* querybuf);
|
||||
parsing_info_t* parsing_info_init(void (*donefun)(void *));
|
||||
|
Reference in New Issue
Block a user