OSDN Git Service

A strange message is emitted after a crash or the first time
[pgstoreplans/pg_store_plans.git] / pgsp_explain.c
index 6bdc6ed..6f4ccad 100644 (file)
@@ -1,5 +1,14 @@
-/*
- * pgsp_explain: extracted code from explain.c for explain of triggers.
+/*-------------------------------------------------------------------------
+ *
+ * pgsp_explain.c: extracted code from explain.c for explain of triggers.
+ *
+ * Copyright (c) 2008-2020, PostgreSQL Global Development Group
+ * Copyright (c) 2012-2021, NIPPON TELEGRAPH AND TELEPHONE CORPORATION
+ *
+ * IDENTIFICATION
+ *       pg_store_plans/pgsp_explain.c
+ *
+ *-------------------------------------------------------------------------
  */
 
 #include "postgres.h"
@@ -37,6 +46,19 @@ static void pgspExplainJSONLineEnding(ExplainState *es);
 #define GROUPING_STACK(es) ((es)->grouping_stack)
 #endif
 
+/* ExplainInitState() is replaced with NewExlainState() in 9.5 */
+#if PG_VERSION_NUM < 90500
+ExplainState *
+NewExplainState(void)
+{
+  ExplainState *es = (ExplainState *)palloc0(sizeof(ExplainState));
+
+  ExplainInitState(es);
+  es->costs = true;
+  return es;
+}
+#endif
+
 void
 pgspExplainTriggers(ExplainState *es, QueryDesc *queryDesc)
 {
@@ -44,24 +66,52 @@ pgspExplainTriggers(ExplainState *es, QueryDesc *queryDesc)
        {
                ResultRelInfo *rInfo;
                bool            show_relname;
-               int                     numrels = queryDesc->estate->es_num_result_relations;
+#if PG_VERSION_NUM < 140000
+               int         numrels = queryDesc->estate->es_num_result_relations;
+               int         nr;
+#else
+               List       *resultrels;
+               List       *routerels;
+#endif
                List       *targrels = queryDesc->estate->es_trig_target_relations;
-               int                     nr;
                ListCell   *l;
-               
+
+#if PG_VERSION_NUM >= 140000
+               resultrels = queryDesc->estate->es_opened_result_relations;
+               routerels = queryDesc->estate->es_tuple_routing_result_relations;
+               targrels = queryDesc->estate->es_trig_target_relations;
+#endif
+
                pgspExplainOpenGroup("Triggers", "Triggers", false, es);
-               
+
+#if PG_VERSION_NUM < 140000
                show_relname = (numrels > 1 || targrels != NIL);
                rInfo = queryDesc->estate->es_result_relations;
                for (nr = 0; nr < numrels; rInfo++, nr++)
+#else
+               show_relname = (list_length(resultrels) > 1 ||
+                                               routerels != NIL || targrels != NIL);
+               foreach(l, resultrels)
+               {
+                       rInfo = (ResultRelInfo *) lfirst(l);
+#endif
                        report_triggers(rInfo, show_relname, es);
-               
+#if PG_VERSION_NUM >= 140000
+               }
+
+               foreach(l, routerels)
+               {
+                       rInfo = (ResultRelInfo *) lfirst(l);
+                       report_triggers(rInfo, show_relname, es);
+               }
+#endif
+
                foreach(l, targrels)
                {
                        rInfo = (ResultRelInfo *) lfirst(l);
                        report_triggers(rInfo, show_relname, es);
                }
-               
+
                pgspExplainCloseGroup("Triggers", "Triggers", false, es);
        }
 }
@@ -78,7 +128,7 @@ pgspExplainOpenGroup(const char *objtype, const char *labelname,
                appendStringInfoString(es->str, ": ");
        }
        appendStringInfoChar(es->str, labeled ? '{' : '[');
-       
+
        GROUPING_STACK(es) = lcons_int(0, GROUPING_STACK(es));
        es->indent++;
 }