From 175756c478d9328fdb9e3c470e9d1e5de8b6f5f2 Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Fri, 12 Dec 2014 16:25:19 +0200 Subject: [PATCH 1/2] Fixed some missing return values and added database change routing to right shard. --- server/modules/routing/dbshard/dbshard.c | 26 +++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/server/modules/routing/dbshard/dbshard.c b/server/modules/routing/dbshard/dbshard.c index cab4e2d60..0af85c8bd 100644 --- a/server/modules/routing/dbshard/dbshard.c +++ b/server/modules/routing/dbshard/dbshard.c @@ -1887,7 +1887,19 @@ static int routeQuery( * eventually to master */ - if((tname = get_shard_target_name(inst,router_cli_ses,querybuf)) != NULL) + if (packet_type == MYSQL_COM_INIT_DB) + { + char dbname[MYSQL_DATABASE_MAXLEN+1]; + unsigned int plen = gw_mysql_get_byte3((unsigned char*)querybuf->start) - 1; + memcpy(dbname,querybuf->start + 5,plen); + dbname[plen] = '\0'; + tname = hashtable_fetch(inst->dbnames_hash,dbname); + if(tname) + { + route_target = TARGET_NAMED_SERVER; + } + } + else if((tname = get_shard_target_name(inst,router_cli_ses,querybuf)) != NULL) { bool shard_ok = check_shard_status(inst,tname); @@ -1930,17 +1942,16 @@ static int routeQuery( GWBUF *errbuff; update_dbnames_hash(inst->servers,inst->dbnames_hash); + tname = get_shard_target_name(inst,router_cli_ses,querybuf); if(tname == NULL && router_cli_ses->rses_mysql_session->db[0] == '\0') { /** - * No current database or databases in query. + * No current database or databases in query, route to all. */ + route_target = TARGET_ALL; - errbuff = modutil_create_mysql_err_msg(1,0,1046, - "3D000", - "No database selected"); } else { @@ -1948,14 +1959,15 @@ static int routeQuery( /** * Bad shard status */ + sprintf(errstr,"Unknown database '%s'", router_cli_ses->rses_mysql_session->db); errbuff = modutil_create_mysql_err_msg(1,0,1049, "42000", errstr); + gwbuf_free(querybuf); + return router_cli_ses->rses_client_dcb->func.write(router_cli_ses->rses_client_dcb,errbuff); } - - router_cli_ses->rses_client_dcb->func.write(router_cli_ses->rses_client_dcb,errbuff); } From d1f5eaaaec9f25752508b4aafd953a00c2e72a92 Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Fri, 12 Dec 2014 16:57:19 +0200 Subject: [PATCH 2/2] Fixed databases not being detected in query_classifier when creating new tables. --- query_classifier/query_classifier.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/query_classifier/query_classifier.cc b/query_classifier/query_classifier.cc index 0ebefaa10..05c81cb1f 100644 --- a/query_classifier/query_classifier.cc +++ b/query_classifier/query_classifier.cc @@ -1448,10 +1448,11 @@ char** skygw_get_database_names(GWBUF* querybuf,int* size) } lex->current_select = lex->all_selects_list; - + while(lex->current_select) { - tbl = lex->current_select->join_list->head(); + tbl = lex->current_select->table_list.first; + while(tbl) { if(strcmp(tbl->db,"skygw_virtual") != 0)