TLA Line data Source code
1 : /*----------------------------------------------------------------------
2 : * test_ddl_deparse.c
3 : * Support functions for the test_ddl_deparse module
4 : *
5 : * Copyright (c) 2014-2023, PostgreSQL Global Development Group
6 : *
7 : * IDENTIFICATION
8 : * src/test/modules/test_ddl_deparse/test_ddl_deparse.c
9 : *----------------------------------------------------------------------
10 : */
11 : #include "postgres.h"
12 :
13 : #include "catalog/pg_type.h"
14 : #include "funcapi.h"
15 : #include "nodes/execnodes.h"
16 : #include "tcop/deparse_utility.h"
17 : #include "tcop/utility.h"
18 : #include "utils/builtins.h"
19 :
20 GIC 21 : PG_MODULE_MAGIC;
21 :
22 CBC 21 : PG_FUNCTION_INFO_V1(get_command_type);
23 GIC 21 : PG_FUNCTION_INFO_V1(get_command_tag);
24 GNC 4 : PG_FUNCTION_INFO_V1(get_altertable_subcmdinfo);
25 ECB :
26 : /*
27 : * Return the textual representation of the struct type used to represent a
28 : * command in struct CollectedCommand format.
29 : */
30 : Datum
31 GIC 186 : get_command_type(PG_FUNCTION_ARGS)
32 : {
33 CBC 186 : CollectedCommand *cmd = (CollectedCommand *) PG_GETARG_POINTER(0);
34 : const char *type;
35 ECB :
36 GIC 186 : switch (cmd->type)
37 : {
38 CBC 133 : case SCT_Simple:
39 GIC 133 : type = "simple";
40 CBC 133 : break;
41 40 : case SCT_AlterTable:
42 40 : type = "alter table";
43 40 : break;
44 9 : case SCT_Grant:
45 9 : type = "grant";
46 9 : break;
47 1 : case SCT_AlterOpFamily:
48 1 : type = "alter operator family";
49 1 : break;
50 1 : case SCT_AlterDefaultPrivileges:
51 1 : type = "alter default privileges";
52 1 : break;
53 1 : case SCT_CreateOpClass:
54 1 : type = "create operator class";
55 1 : break;
56 1 : case SCT_AlterTSConfig:
57 1 : type = "alter text search configuration";
58 1 : break;
59 LBC 0 : default:
60 0 : type = "unknown command type";
61 UBC 0 : break;
62 EUB : }
63 :
64 GIC 186 : PG_RETURN_TEXT_P(cstring_to_text(type));
65 : }
66 ECB :
67 : /*
68 : * Return the command tag corresponding to a parse node contained in a
69 : * CollectedCommand struct.
70 : */
71 : Datum
72 GIC 186 : get_command_tag(PG_FUNCTION_ARGS)
73 : {
74 CBC 186 : CollectedCommand *cmd = (CollectedCommand *) PG_GETARG_POINTER(0);
75 :
76 186 : if (!cmd->parsetree)
77 GIC 9 : PG_RETURN_NULL();
78 ECB :
79 CBC 177 : PG_RETURN_TEXT_P(cstring_to_text(CreateCommandName(cmd->parsetree)));
80 : }
81 ECB :
82 : /*
83 : * Return a text array representation of the subcommands of an ALTER TABLE
84 : * command.
85 : */
86 : Datum
87 GNC 40 : get_altertable_subcmdinfo(PG_FUNCTION_ARGS)
88 : {
89 CBC 40 : CollectedCommand *cmd = (CollectedCommand *) PG_GETARG_POINTER(0);
90 ECB : ListCell *cell;
91 GNC 40 : ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
92 :
93 CBC 40 : if (cmd->type != SCT_AlterTable)
94 UIC 0 : elog(ERROR, "command is not ALTER TABLE");
95 ECB :
96 GNC 40 : InitMaterializedSRF(fcinfo, 0);
97 :
98 40 : if (cmd->d.alterTable.subcmds == NIL)
99 UNC 0 : elog(ERROR, "empty alter table subcommand list");
100 :
101 GBC 102 : foreach(cell, cmd->d.alterTable.subcmds)
102 : {
103 CBC 62 : CollectedATSubcmd *sub = lfirst(cell);
104 GIC 62 : AlterTableCmd *subcmd = castNode(AlterTableCmd, sub->parsetree);
105 GNC 62 : const char *strtype = "unrecognized";
106 : Datum values[2];
107 : bool nulls[2];
108 :
109 62 : memset(values, 0, sizeof(values));
110 62 : memset(nulls, 0, sizeof(nulls));
111 EUB :
112 GIC 62 : switch (subcmd->subtype)
113 ECB : {
114 GIC 1 : case AT_AddColumn:
115 CBC 1 : strtype = "ADD COLUMN";
116 1 : break;
117 UIC 0 : case AT_AddColumnToView:
118 LBC 0 : strtype = "ADD COLUMN TO VIEW";
119 0 : break;
120 GIC 3 : case AT_ColumnDefault:
121 CBC 3 : strtype = "ALTER COLUMN SET DEFAULT";
122 GIC 3 : break;
123 CBC 1 : case AT_CookedColumnDefault:
124 1 : strtype = "ALTER COLUMN SET DEFAULT (precooked)";
125 1 : break;
126 GBC 1 : case AT_DropNotNull:
127 1 : strtype = "DROP NOT NULL";
128 1 : break;
129 CBC 2 : case AT_SetNotNull:
130 2 : strtype = "SET NOT NULL";
131 2 : break;
132 GNC 10 : case AT_SetAttNotNull:
133 10 : strtype = "SET ATTNOTNULL";
134 10 : break;
135 1 : case AT_DropExpression:
136 1 : strtype = "DROP EXPRESSION";
137 1 : break;
138 LBC 0 : case AT_CheckNotNull:
139 0 : strtype = "CHECK NOT NULL";
140 0 : break;
141 CBC 3 : case AT_SetStatistics:
142 3 : strtype = "SET STATS";
143 3 : break;
144 LBC 0 : case AT_SetOptions:
145 0 : strtype = "SET OPTIONS";
146 0 : break;
147 0 : case AT_ResetOptions:
148 0 : strtype = "RESET OPTIONS";
149 0 : break;
150 CBC 3 : case AT_SetStorage:
151 3 : strtype = "SET STORAGE";
152 3 : break;
153 GNC 1 : case AT_SetCompression:
154 1 : strtype = "SET COMPRESSION";
155 1 : break;
156 UBC 0 : case AT_DropColumn:
157 0 : strtype = "DROP COLUMN";
158 0 : break;
159 GBC 1 : case AT_AddIndex:
160 1 : strtype = "ADD INDEX";
161 1 : break;
162 UBC 0 : case AT_ReAddIndex:
163 0 : strtype = "(re) ADD INDEX";
164 0 : break;
165 CBC 13 : case AT_AddConstraint:
166 13 : strtype = "ADD CONSTRAINT";
167 13 : break;
168 GBC 1 : case AT_ReAddConstraint:
169 1 : strtype = "(re) ADD CONSTRAINT";
170 1 : break;
171 GNC 1 : case AT_ReAddDomainConstraint:
172 1 : strtype = "(re) ADD DOMAIN CONSTRAINT";
173 1 : break;
174 LBC 0 : case AT_AlterConstraint:
175 0 : strtype = "ALTER CONSTRAINT";
176 0 : break;
177 UBC 0 : case AT_ValidateConstraint:
178 0 : strtype = "VALIDATE CONSTRAINT";
179 0 : break;
180 LBC 0 : case AT_AddIndexConstraint:
181 0 : strtype = "ADD CONSTRAINT (using index)";
182 0 : break;
183 0 : case AT_DropConstraint:
184 0 : strtype = "DROP CONSTRAINT";
185 0 : break;
186 UBC 0 : case AT_ReAddComment:
187 0 : strtype = "(re) ADD COMMENT";
188 0 : break;
189 GBC 4 : case AT_AlterColumnType:
190 4 : strtype = "ALTER COLUMN SET TYPE";
191 4 : break;
192 UBC 0 : case AT_AlterColumnGenericOptions:
193 0 : strtype = "ALTER COLUMN SET OPTIONS";
194 0 : break;
195 0 : case AT_ChangeOwner:
196 0 : strtype = "CHANGE OWNER";
197 0 : break;
198 CBC 1 : case AT_ClusterOn:
199 1 : strtype = "CLUSTER";
200 1 : break;
201 UBC 0 : case AT_DropCluster:
202 0 : strtype = "DROP CLUSTER";
203 0 : break;
204 GBC 1 : case AT_SetLogged:
205 1 : strtype = "SET LOGGED";
206 1 : break;
207 CBC 1 : case AT_SetUnLogged:
208 1 : strtype = "SET UNLOGGED";
209 1 : break;
210 UBC 0 : case AT_DropOids:
211 0 : strtype = "DROP OIDS";
212 0 : break;
213 UNC 0 : case AT_SetAccessMethod:
214 0 : strtype = "SET ACCESS METHOD";
215 0 : break;
216 LBC 0 : case AT_SetTableSpace:
217 0 : strtype = "SET TABLESPACE";
218 0 : break;
219 CBC 1 : case AT_SetRelOptions:
220 1 : strtype = "SET RELOPTIONS";
221 1 : break;
222 GBC 1 : case AT_ResetRelOptions:
223 1 : strtype = "RESET RELOPTIONS";
224 1 : break;
225 1 : case AT_ReplaceRelOptions:
226 1 : strtype = "REPLACE RELOPTIONS";
227 1 : break;
228 UBC 0 : case AT_EnableTrig:
229 0 : strtype = "ENABLE TRIGGER";
230 0 : break;
231 LBC 0 : case AT_EnableAlwaysTrig:
232 0 : strtype = "ENABLE TRIGGER (always)";
233 0 : break;
234 0 : case AT_EnableReplicaTrig:
235 0 : strtype = "ENABLE TRIGGER (replica)";
236 0 : break;
237 0 : case AT_DisableTrig:
238 0 : strtype = "DISABLE TRIGGER";
239 0 : break;
240 UBC 0 : case AT_EnableTrigAll:
241 0 : strtype = "ENABLE TRIGGER (all)";
242 0 : break;
243 0 : case AT_DisableTrigAll:
244 0 : strtype = "DISABLE TRIGGER (all)";
245 0 : break;
246 0 : case AT_EnableTrigUser:
247 0 : strtype = "ENABLE TRIGGER (user)";
248 0 : break;
249 0 : case AT_DisableTrigUser:
250 0 : strtype = "DISABLE TRIGGER (user)";
251 0 : break;
252 0 : case AT_EnableRule:
253 0 : strtype = "ENABLE RULE";
254 0 : break;
255 0 : case AT_EnableAlwaysRule:
256 0 : strtype = "ENABLE RULE (always)";
257 0 : break;
258 0 : case AT_EnableReplicaRule:
259 0 : strtype = "ENABLE RULE (replica)";
260 0 : break;
261 0 : case AT_DisableRule:
262 0 : strtype = "DISABLE RULE";
263 0 : break;
264 0 : case AT_AddInherit:
265 0 : strtype = "ADD INHERIT";
266 0 : break;
267 0 : case AT_DropInherit:
268 0 : strtype = "DROP INHERIT";
269 0 : break;
270 0 : case AT_AddOf:
271 0 : strtype = "OF";
272 0 : break;
273 0 : case AT_DropOf:
274 0 : strtype = "NOT OF";
275 0 : break;
276 0 : case AT_ReplicaIdentity:
277 0 : strtype = "REPLICA IDENTITY";
278 0 : break;
279 GBC 1 : case AT_EnableRowSecurity:
280 1 : strtype = "ENABLE ROW SECURITY";
281 1 : break;
282 1 : case AT_DisableRowSecurity:
283 1 : strtype = "DISABLE ROW SECURITY";
284 1 : break;
285 1 : case AT_ForceRowSecurity:
286 1 : strtype = "FORCE ROW SECURITY";
287 1 : break;
288 1 : case AT_NoForceRowSecurity:
289 1 : strtype = "NO FORCE ROW SECURITY";
290 1 : break;
291 LBC 0 : case AT_GenericOptions:
292 0 : strtype = "SET OPTIONS";
293 0 : break;
294 GNC 1 : case AT_DetachPartition:
295 1 : strtype = "DETACH PARTITION";
296 1 : break;
297 1 : case AT_AttachPartition:
298 1 : strtype = "ATTACH PARTITION";
299 1 : break;
300 UNC 0 : case AT_DetachPartitionFinalize:
301 0 : strtype = "DETACH PARTITION ... FINALIZE";
302 0 : break;
303 GNC 1 : case AT_AddIdentity:
304 1 : strtype = "ADD IDENTITY";
305 1 : break;
306 1 : case AT_SetIdentity:
307 1 : strtype = "SET IDENTITY";
308 1 : break;
309 1 : case AT_DropIdentity:
310 1 : strtype = "DROP IDENTITY";
311 1 : break;
312 1 : case AT_ReAddStatistics:
313 1 : strtype = "(re) ADD STATS";
314 CBC 1 : break;
315 ECB : }
316 :
317 GNC 62 : if (subcmd->recurse)
318 16 : values[0] = CStringGetTextDatum(psprintf("%s (and recurse)", strtype));
319 : else
320 46 : values[0] = CStringGetTextDatum(strtype);
321 62 : if (OidIsValid(sub->address.objectId))
322 : {
323 : char *objdesc;
324 :
325 43 : objdesc = getObjectDescription((const ObjectAddress *) &sub->address, false);
326 43 : values[1] = CStringGetTextDatum(objdesc);
327 : }
328 : else
329 19 : nulls[1] = true;
330 :
331 62 : tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
332 ECB : }
333 EUB :
334 GNC 40 : return (Datum) 0;
335 ECB : }
|