Fix to bug http://bugs.skysql.com/show_bug.cgi?id=488. SHOW VARIABLES was treated as if it was session write command. Instead it is a read-only query. Changed to route that to master.

This commit is contained in:
VilhoRaatikka
2014-08-31 22:56:30 +03:00
parent 40416d424e
commit 40f85f9cad
3 changed files with 15 additions and 5 deletions

View File

@ -512,7 +512,15 @@ static skygw_query_type_t resolve_query_type(
} }
else if (lex->option_type == OPT_SESSION) else if (lex->option_type == OPT_SESSION)
{ {
type |= QUERY_TYPE_SESSION_WRITE; /** SHOW commands are all reads to one backend */
if (lex->sql_command == SQLCOM_SHOW_VARIABLES)
{
type |= QUERY_TYPE_SESSION_READ;
}
else
{
type |= QUERY_TYPE_SESSION_WRITE;
}
goto return_qtype; goto return_qtype;
} }
/** /**
@ -531,10 +539,11 @@ static skygw_query_type_t resolve_query_type(
force_data_modify_op_replication) force_data_modify_op_replication)
{ {
type |= QUERY_TYPE_SESSION_WRITE; type |= QUERY_TYPE_SESSION_WRITE;
} else { }
else
{
type |= QUERY_TYPE_WRITE; type |= QUERY_TYPE_WRITE;
} }
goto return_qtype; goto return_qtype;
} }

View File

@ -44,7 +44,8 @@ typedef enum {
QUERY_TYPE_COMMIT = 0x0200, /*< COMMIT */ QUERY_TYPE_COMMIT = 0x0200, /*< COMMIT */
QUERY_TYPE_PREPARE_NAMED_STMT = 0x0400, /*< Prepared stmt with name from user */ 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_PREPARE_STMT = 0x0800, /*< Prepared stmt with id provided by server */
QUERY_TYPE_EXEC_STMT = 0x1000 /*< Execute prepared statement */ QUERY_TYPE_EXEC_STMT = 0x1000, /*< Execute prepared statement */
QUERY_TYPE_SESSION_READ = 0x2000 /*< Read session data (from master 31.8.14) */
} skygw_query_type_t; } skygw_query_type_t;

View File

@ -1451,7 +1451,7 @@ static int routeQuery(
if (succp) /*< Have DCB of the target backend */ if (succp) /*< Have DCB of the target backend */
{ {
if ((ret = target_dcb->func.write(target_dcb, querybuf)) == 1) if ((ret = target_dcb->func.write(target_dcb, gwbuf_clone(querybuf))) == 1)
{ {
backend_ref_t* bref; backend_ref_t* bref;