From 7c1afe5d2ccbc1a03645f32cf17fd1de0a7ed720 Mon Sep 17 00:00:00 2001 From: Johan Wikman Date: Thu, 18 May 2017 16:48:39 +0300 Subject: [PATCH] MXS-1196: Not all preparable stmts can be parsed But the out arguments of ...get_[field|function]_infos must be sensible and the functions must not crash. --- .../qc_mysqlembedded/qc_mysqlembedded.cc | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/query_classifier/qc_mysqlembedded/qc_mysqlembedded.cc b/query_classifier/qc_mysqlembedded/qc_mysqlembedded.cc index 0dc369c5e..ec7bffcf5 100644 --- a/query_classifier/qc_mysqlembedded/qc_mysqlembedded.cc +++ b/query_classifier/qc_mysqlembedded/qc_mysqlembedded.cc @@ -2653,6 +2653,9 @@ static void update_field_infos(parsing_info_t* pi, int32_t qc_mysql_get_field_info(GWBUF* buf, const QC_FIELD_INFO** infos, uint32_t* n_infos) { + *infos = NULL; + *n_infos = 0; + if (!buf) { return QC_RESULT_OK; @@ -2660,7 +2663,7 @@ int32_t qc_mysql_get_field_info(GWBUF* buf, const QC_FIELD_INFO** infos, uint32_ if (!ensure_query_is_parsed(buf)) { - return QC_RESULT_ERROR;; + return QC_RESULT_ERROR; } parsing_info_t* pi = get_pinfo(buf); @@ -2775,19 +2778,27 @@ int32_t qc_mysql_get_function_info(GWBUF* buf, *function_infos = NULL; *n_function_infos = 0; - const QC_FIELD_INFO* field_infos; - uint32_t n_field_infos; + int32_t rv = QC_RESULT_OK; - // We ensure the information has been collected by querying the fields first. - qc_mysql_get_field_info(buf, &field_infos, &n_field_infos); + if (buf) + { + const QC_FIELD_INFO* field_infos; + uint32_t n_field_infos; - parsing_info_t* pi = get_pinfo(buf); - ss_dassert(pi); + // We ensure the information has been collected by querying the fields first. + rv = qc_mysql_get_field_info(buf, &field_infos, &n_field_infos); - *function_infos = pi->function_infos; - *n_function_infos = pi->function_infos_len; + if (rv == QC_RESULT_OK) + { + parsing_info_t* pi = get_pinfo(buf); + ss_dassert(pi); - return QC_RESULT_OK; + *function_infos = pi->function_infos; + *n_function_infos = pi->function_infos_len; + } + } + + return rv; } namespace