From 625c9a54a106bd2103ba7d3402bd0a91bc8dd537 Mon Sep 17 00:00:00 2001 From: Ilhan <70995854+xmilex-git@users.noreply.github.com> Date: Mon, 17 Jun 2024 13:16:51 +0900 Subject: [PATCH] [CBRD-25361] Fixed the issue where trace information for CTEs and subqueries not provided. (#5200) http://jira.cubrid.org/browse/CBRD-25361 There are currently issues with trace statistics. When tracing queries that use UNION, DIFFERENCE, INTERSECTION, and CTE together, the statistical information for the CTE is not output. Additionally, when using UNION-like SQL statements, the trace for the total cost is also not output. In this issue, we have made changes to enable the output of trace for the total cost of UNION-like SQL statements and to ensure that the statistical information for all subqueries bundled under the UNION statement is output. Conflicts: src/query/query_dump.c [CBRD-25361] When backporting, remove the fetch_time output part that only exists in fig-cake. http://jira.cubrid.org/browse/CBRD-25361 --- src/query/query_dump.c | 81 +++++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 32 deletions(-) diff --git a/src/query/query_dump.c b/src/query/query_dump.c index 51d38a6c679..c56fc56df44 100644 --- a/src/query/query_dump.c +++ b/src/query/query_dump.c @@ -2891,8 +2891,14 @@ qdump_print_stats_json (xasl_node * xasl_p, json_t * parent) GROUPBY_STATS *gstats; json_t *proc, *scan = NULL; json_t *subquery, *groupby, *orderby; - json_t *left, *right, *outer, *inner; + json_t *outer, *inner; json_t *cte_non_recursive_part, *cte_recursive_part; +<<<<<<< HEAD +======= + json_t *temp; + xasl_node *xptr; + json_t *sq_cache; +>>>>>>> b214f10... [CBRD-25361] Fixed the issue where trace information for CTEs and subqueries not provided. (#5200) if (xasl_p == NULL || parent == NULL) { @@ -2920,20 +2926,25 @@ qdump_print_stats_json (xasl_node * xasl_p, json_t * parent) case BUILD_SCHEMA_PROC: json_object_set_new (proc, "time", json_integer (TO_MSEC (xasl_p->xasl_stats.elapsed_time))); json_object_set_new (proc, "fetch", json_integer (xasl_p->xasl_stats.fetches)); + json_object_set_new (proc, "fetch_time", json_integer (xasl_p->xasl_stats.fetch_time)); json_object_set_new (proc, "ioread", json_integer (xasl_p->xasl_stats.ioreads)); break; case UNION_PROC: case DIFFERENCE_PROC: case INTERSECTION_PROC: - left = json_object (); - right = json_object (); - - qdump_print_stats_json (xasl_p->proc.union_.left, left); - qdump_print_stats_json (xasl_p->proc.union_.right, right); - - json_object_set_new (proc, "left", left); - json_object_set_new (proc, "right", right); + json_object_set_new (proc, "time", json_integer (TO_MSEC (xasl_p->xasl_stats.elapsed_time))); + json_object_set_new (proc, "fetch", json_integer (xasl_p->xasl_stats.fetches)); + json_object_set_new (proc, "fetch_time", json_integer (xasl_p->xasl_stats.fetch_time)); + json_object_set_new (proc, "ioread", json_integer (xasl_p->xasl_stats.ioreads)); + subquery = json_array (); + for (xptr = xasl_p->aptr_list; xptr; xptr = xptr->next) + { + temp = json_object (); + qdump_print_stats_json (xptr, temp); + json_array_append_new (subquery, temp); + } + json_object_set_new (proc, "SUBQUERY (uncorrelated)", subquery); break; case MERGELIST_PROC: @@ -3060,22 +3071,25 @@ qdump_print_stats_json (xasl_node * xasl_p, json_t * parent) if (HAVE_SUBQUERY_PROC (xasl_p) && xasl_p->aptr_list != NULL) { - if (HAVE_SUBQUERY_PROC (xasl_p->aptr_list)) - { - subquery = json_object (); - qdump_print_stats_json (xasl_p->aptr_list, subquery); - json_object_set_new (proc, "SUBQUERY (uncorrelated)", subquery); - } - else + subquery = json_array (); + for (xptr = xasl_p->aptr_list; xptr; xptr = xptr->next) { - qdump_print_stats_json (xasl_p->aptr_list, proc); + temp = json_object (); + qdump_print_stats_json (xptr, temp); + json_array_append_new (subquery, temp); } + json_object_set_new (proc, "SUBQUERY (uncorrelated)", subquery); } if (xasl_p->dptr_list != NULL) { - subquery = json_object (); - qdump_print_stats_json (xasl_p->dptr_list, subquery); + subquery = json_array (); + for (xptr = xasl_p->dptr_list; xptr; xptr = xptr->next) + { + temp = json_object (); + qdump_print_stats_json (xptr, temp); + json_array_append_new (subquery, temp); + } json_object_set_new (proc, "SUBQUERY (correlated)", subquery); } } @@ -3183,6 +3197,7 @@ qdump_print_stats_text (FILE * fp, xasl_node * xasl_p, int indent) { ORDERBY_STATS *ostats; GROUPBY_STATS *gstats; + xasl_node *xptr; if (xasl_p == NULL) { @@ -3215,19 +3230,15 @@ qdump_print_stats_text (FILE * fp, xasl_node * xasl_p, int indent) break; case UNION_PROC: - fprintf (fp, "UNION\n"); - qdump_print_stats_text (fp, xasl_p->proc.union_.left, indent); - qdump_print_stats_text (fp, xasl_p->proc.union_.right, indent); - break; case DIFFERENCE_PROC: - fprintf (fp, "DIFFERENCE\n"); - qdump_print_stats_text (fp, xasl_p->proc.union_.left, indent); - qdump_print_stats_text (fp, xasl_p->proc.union_.right, indent); - break; case INTERSECTION_PROC: - fprintf (fp, "INTERSECTION\n"); - qdump_print_stats_text (fp, xasl_p->proc.union_.left, indent); - qdump_print_stats_text (fp, xasl_p->proc.union_.right, indent); + fprintf (fp, "%s (time: %d, fetch: %lld, fetch_time: %lld, ioread: %lld)\n", qdump_xasl_type_string (xasl_p), + TO_MSEC (xasl_p->xasl_stats.elapsed_time), (long long int) xasl_p->xasl_stats.fetches, + (long long int) xasl_p->xasl_stats.fetch_time, (long long int) xasl_p->xasl_stats.ioreads); + for (xptr = xasl_p->aptr_list; xptr; xptr = xptr->next) + { + qdump_print_stats_text (fp, xptr, indent); + } break; case MERGELIST_PROC: @@ -3327,13 +3338,19 @@ qdump_print_stats_text (FILE * fp, xasl_node * xasl_p, int indent) fprintf (fp, "%*cSUBQUERY (uncorrelated)\n", indent, ' '); } - qdump_print_stats_text (fp, xasl_p->aptr_list, indent); + for (xptr = xasl_p->aptr_list; xptr; xptr = xptr->next) + { + qdump_print_stats_text (fp, xptr, indent); + } } if (xasl_p->dptr_list != NULL) { fprintf (fp, "%*cSUBQUERY (correlated)\n", indent, ' '); - qdump_print_stats_text (fp, xasl_p->dptr_list, indent); + for (xptr = xasl_p->dptr_list; xptr; xptr = xptr->next) + { + qdump_print_stats_text (fp, xptr, indent); + } } } #endif /* SERVER_MODE */