Coverage Report

Created: 2025-06-15 06:31

/src/postgres/src/backend/utils/misc/help_config.c
Line
Count
Source (jump to first uncovered line)
1
/*-------------------------------------------------------------------------
2
 * help_config.c
3
 *
4
 * Displays available options under grand unified configuration scheme
5
 *
6
 * Options whose flag bits are set to GUC_NO_SHOW_ALL, GUC_NOT_IN_SAMPLE,
7
 * or GUC_DISALLOW_IN_FILE are not displayed, unless the user specifically
8
 * requests that variable by name
9
 *
10
 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
11
 *
12
 * IDENTIFICATION
13
 *    src/backend/utils/misc/help_config.c
14
 *
15
 *-------------------------------------------------------------------------
16
 */
17
#include "postgres.h"
18
19
#include <limits.h>
20
#include <unistd.h>
21
22
#include "utils/guc_tables.h"
23
#include "utils/help_config.h"
24
25
26
/*
27
 * This union allows us to mix the numerous different types of structs
28
 * that we are organizing.
29
 */
30
typedef union
31
{
32
  struct config_generic generic;
33
  struct config_bool _bool;
34
  struct config_real real;
35
  struct config_int integer;
36
  struct config_string string;
37
  struct config_enum _enum;
38
} mixedStruct;
39
40
41
static void printMixedStruct(mixedStruct *structToPrint);
42
static bool displayStruct(mixedStruct *structToDisplay);
43
44
45
void
46
GucInfoMain(void)
47
0
{
48
0
  struct config_generic **guc_vars;
49
0
  int     numOpts,
50
0
        i;
51
52
  /* Initialize the GUC hash table */
53
0
  build_guc_variables();
54
55
0
  guc_vars = get_guc_variables(&numOpts);
56
57
0
  for (i = 0; i < numOpts; i++)
58
0
  {
59
0
    mixedStruct *var = (mixedStruct *) guc_vars[i];
60
61
0
    if (displayStruct(var))
62
0
      printMixedStruct(var);
63
0
  }
64
65
0
  exit(0);
66
0
}
67
68
69
/*
70
 * This function will return true if the struct passed to it
71
 * should be displayed to the user.
72
 */
73
static bool
74
displayStruct(mixedStruct *structToDisplay)
75
0
{
76
0
  return !(structToDisplay->generic.flags & (GUC_NO_SHOW_ALL |
77
0
                         GUC_NOT_IN_SAMPLE |
78
0
                         GUC_DISALLOW_IN_FILE));
79
0
}
80
81
82
/*
83
 * This function prints out the generic struct passed to it. It will print out
84
 * a different format, depending on what the user wants to see.
85
 */
86
static void
87
printMixedStruct(mixedStruct *structToPrint)
88
0
{
89
0
  printf("%s\t%s\t%s\t",
90
0
       structToPrint->generic.name,
91
0
       GucContext_Names[structToPrint->generic.context],
92
0
       _(config_group_names[structToPrint->generic.group]));
93
94
0
  switch (structToPrint->generic.vartype)
95
0
  {
96
97
0
    case PGC_BOOL:
98
0
      printf("BOOLEAN\t%s\t\t\t",
99
0
           (structToPrint->_bool.reset_val == 0) ?
100
0
           "FALSE" : "TRUE");
101
0
      break;
102
103
0
    case PGC_INT:
104
0
      printf("INTEGER\t%d\t%d\t%d\t",
105
0
           structToPrint->integer.reset_val,
106
0
           structToPrint->integer.min,
107
0
           structToPrint->integer.max);
108
0
      break;
109
110
0
    case PGC_REAL:
111
0
      printf("REAL\t%g\t%g\t%g\t",
112
0
           structToPrint->real.reset_val,
113
0
           structToPrint->real.min,
114
0
           structToPrint->real.max);
115
0
      break;
116
117
0
    case PGC_STRING:
118
0
      printf("STRING\t%s\t\t\t",
119
0
           structToPrint->string.boot_val ? structToPrint->string.boot_val : "");
120
0
      break;
121
122
0
    case PGC_ENUM:
123
0
      printf("ENUM\t%s\t\t\t",
124
0
           config_enum_lookup_by_value(&structToPrint->_enum,
125
0
                         structToPrint->_enum.boot_val));
126
0
      break;
127
128
0
    default:
129
0
      write_stderr("internal error: unrecognized run-time parameter type\n");
130
0
      break;
131
0
  }
132
133
0
  printf("%s\t%s\n",
134
0
       (structToPrint->generic.short_desc == NULL) ? "" : _(structToPrint->generic.short_desc),
135
0
       (structToPrint->generic.long_desc == NULL) ? "" : _(structToPrint->generic.long_desc));
136
0
}