1/*-------------------------------------------------------------------------
2 *
3 * execdebug.h
4 * #defines governing debugging behaviour in the executor
5 *
6 * XXX this is all pretty old and crufty. Newer code tends to use elog()
7 * for debug printouts, because that's more flexible than printf().
8 *
9 *
10 * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
11 * Portions Copyright (c) 1994, Regents of the University of California
12 *
13 * src/include/executor/execdebug.h
14 *
15 *-------------------------------------------------------------------------
16 */
17#ifndef EXECDEBUG_H
18#define EXECDEBUG_H
19
20#include "executor/executor.h"
21#include "nodes/print.h"
22
23/* ----------------------------------------------------------------
24 * debugging defines.
25 *
26 * If you want certain debugging behaviour, then #define
27 * the variable to 1. No need to explicitly #undef by default,
28 * since we can use -D compiler options to enable features.
29 * - thomas 1999-02-20
30 * ----------------------------------------------------------------
31 */
32
33/* ----------------
34 * EXEC_NESTLOOPDEBUG is a flag which turns on debugging of the
35 * nest loop node by NL_printf() and ENL_printf() in nodeNestloop.c
36 * ----------------
37#undef EXEC_NESTLOOPDEBUG
38 */
39
40/* ----------------
41 * EXEC_SORTDEBUG is a flag which turns on debugging of
42 * the ExecSort() stuff by SO_printf() in nodeSort.c
43 * ----------------
44#undef EXEC_SORTDEBUG
45 */
46
47/* ----------------
48 * EXEC_MERGEJOINDEBUG is a flag which turns on debugging of
49 * the ExecMergeJoin() stuff by MJ_printf() in nodeMergejoin.c
50 * ----------------
51#undef EXEC_MERGEJOINDEBUG
52 */
53
54/* ----------------------------------------------------------------
55 * #defines controlled by above definitions
56 *
57 * Note: most of these are "incomplete" because I didn't
58 * need the ones not defined. More should be added
59 * only as necessary -cim 10/26/89
60 * ----------------------------------------------------------------
61 */
62#define T_OR_F(b) ((b) ? "true" : "false")
63#define NULL_OR_TUPLE(slot) (TupIsNull(slot) ? "null" : "a tuple")
64
65/* ----------------
66 * nest loop debugging defines
67 * ----------------
68 */
69#ifdef EXEC_NESTLOOPDEBUG
70#define NL_nodeDisplay(l) nodeDisplay(l)
71#define NL_printf(s) printf(s)
72#define NL1_printf(s, a) printf(s, a)
73#define ENL1_printf(message) printf("ExecNestLoop: %s\n", message)
74#else
75#define NL_nodeDisplay(l)
76#define NL_printf(s)
77#define NL1_printf(s, a)
78#define ENL1_printf(message)
79#endif /* EXEC_NESTLOOPDEBUG */
80
81/* ----------------
82 * sort node debugging defines
83 * ----------------
84 */
85#ifdef EXEC_SORTDEBUG
86#define SO_nodeDisplay(l) nodeDisplay(l)
87#define SO_printf(s) printf(s)
88#define SO1_printf(s, p) printf(s, p)
89#else
90#define SO_nodeDisplay(l)
91#define SO_printf(s)
92#define SO1_printf(s, p)
93#endif /* EXEC_SORTDEBUG */
94
95/* ----------------
96 * merge join debugging defines
97 * ----------------
98 */
99#ifdef EXEC_MERGEJOINDEBUG
100
101#define MJ_nodeDisplay(l) nodeDisplay(l)
102#define MJ_printf(s) printf(s)
103#define MJ1_printf(s, p) printf(s, p)
104#define MJ2_printf(s, p1, p2) printf(s, p1, p2)
105#define MJ_debugtup(slot) debugtup(slot, NULL)
106#define MJ_dump(state) ExecMergeTupleDump(state)
107#define MJ_DEBUG_COMPARE(res) \
108 MJ1_printf(" MJCompare() returns %d\n", (res))
109#define MJ_DEBUG_QUAL(clause, res) \
110 MJ2_printf(" ExecQual(%s, econtext) returns %s\n", \
111 CppAsString(clause), T_OR_F(res))
112#define MJ_DEBUG_PROC_NODE(slot) \
113 MJ2_printf(" %s = ExecProcNode(...) returns %s\n", \
114 CppAsString(slot), NULL_OR_TUPLE(slot))
115#else
116
117#define MJ_nodeDisplay(l)
118#define MJ_printf(s)
119#define MJ1_printf(s, p)
120#define MJ2_printf(s, p1, p2)
121#define MJ_debugtup(slot)
122#define MJ_dump(state)
123#define MJ_DEBUG_COMPARE(res)
124#define MJ_DEBUG_QUAL(clause, res)
125#define MJ_DEBUG_PROC_NODE(slot)
126#endif /* EXEC_MERGEJOINDEBUG */
127
128#endif /* EXECDEBUG_H */
129