Age Owner Branch data 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-2024, 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 : :
3261 alvherre@alvh.no-ip. 20 :CBC 21 : PG_MODULE_MAGIC;
21 : :
22 : 21 : PG_FUNCTION_INFO_V1(get_command_type);
23 : 21 : PG_FUNCTION_INFO_V1(get_command_tag);
623 michael@paquier.xyz 24 : 4 : PG_FUNCTION_INFO_V1(get_altertable_subcmdinfo);
25 : :
26 : : /*
27 : : * Return the textual representation of the struct type used to represent a
28 : : * command in struct CollectedCommand format.
29 : : */
30 : : Datum
3261 alvherre@alvh.no-ip. 31 : 191 : get_command_type(PG_FUNCTION_ARGS)
32 : : {
33 : 191 : CollectedCommand *cmd = (CollectedCommand *) PG_GETARG_POINTER(0);
34 : : const char *type;
35 : :
36 [ + + + + : 191 : switch (cmd->type)
+ + + - ]
37 : : {
38 : 136 : case SCT_Simple:
39 : 136 : type = "simple";
40 : 136 : break;
41 : 40 : case SCT_AlterTable:
42 : 40 : type = "alter table";
43 : 40 : break;
44 : 11 : case SCT_Grant:
45 : 11 : type = "grant";
46 : 11 : 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;
3261 alvherre@alvh.no-ip. 59 :UBC 0 : default:
60 : 0 : type = "unknown command type";
61 : 0 : break;
62 : : }
63 : :
3261 alvherre@alvh.no-ip. 64 :CBC 191 : PG_RETURN_TEXT_P(cstring_to_text(type));
65 : : }
66 : :
67 : : /*
68 : : * Return the command tag corresponding to a parse node contained in a
69 : : * CollectedCommand struct.
70 : : */
71 : : Datum
72 : 191 : get_command_tag(PG_FUNCTION_ARGS)
73 : : {
74 : 191 : CollectedCommand *cmd = (CollectedCommand *) PG_GETARG_POINTER(0);
75 : :
76 [ + + ]: 191 : if (!cmd->parsetree)
77 : 11 : PG_RETURN_NULL();
78 : :
1504 79 : 180 : PG_RETURN_TEXT_P(cstring_to_text(CreateCommandName(cmd->parsetree)));
80 : : }
81 : :
82 : : /*
83 : : * Return a text array representation of the subcommands of an ALTER TABLE
84 : : * command.
85 : : */
86 : : Datum
623 michael@paquier.xyz 87 : 40 : get_altertable_subcmdinfo(PG_FUNCTION_ARGS)
88 : : {
3261 alvherre@alvh.no-ip. 89 : 40 : CollectedCommand *cmd = (CollectedCommand *) PG_GETARG_POINTER(0);
90 : : ListCell *cell;
623 michael@paquier.xyz 91 : 40 : ReturnSetInfo *rsinfo = (ReturnSetInfo *) fcinfo->resultinfo;
92 : :
3261 alvherre@alvh.no-ip. 93 [ - + ]: 40 : if (cmd->type != SCT_AlterTable)
3261 alvherre@alvh.no-ip. 94 [ # # ]:UBC 0 : elog(ERROR, "command is not ALTER TABLE");
95 : :
544 michael@paquier.xyz 96 :CBC 40 : InitMaterializedSRF(fcinfo, 0);
97 : :
606 tgl@sss.pgh.pa.us 98 [ - + ]: 40 : if (cmd->d.alterTable.subcmds == NIL)
623 michael@paquier.xyz 99 [ # # ]:UBC 0 : elog(ERROR, "empty alter table subcommand list");
100 : :
3261 alvherre@alvh.no-ip. 101 [ + - + + :CBC 103 : foreach(cell, cmd->d.alterTable.subcmds)
+ + ]
102 : : {
103 : 63 : CollectedATSubcmd *sub = lfirst(cell);
2609 peter_e@gmx.net 104 : 63 : AlterTableCmd *subcmd = castNode(AlterTableCmd, sub->parsetree);
623 michael@paquier.xyz 105 : 63 : const char *strtype = "unrecognized";
106 : : Datum values[2];
107 : : bool nulls[2];
108 : :
109 : 63 : memset(values, 0, sizeof(values));
110 : 63 : memset(nulls, 0, sizeof(nulls));
111 : :
3261 alvherre@alvh.no-ip. 112 [ + - + + : 63 : switch (subcmd->subtype)
+ + + - +
+ - - + +
- + - + +
+ - - - -
- + - - +
- + + - -
- + + + -
- - - - -
- - - - -
- - - - -
- + + + +
- + + - -
- + + + +
- ]
113 : : {
114 : 1 : case AT_AddColumn:
115 : 1 : strtype = "ADD COLUMN";
116 : 1 : break;
3261 alvherre@alvh.no-ip. 117 :UBC 0 : case AT_AddColumnToView:
118 : 0 : strtype = "ADD COLUMN TO VIEW";
119 : 0 : break;
3261 alvherre@alvh.no-ip. 120 :CBC 3 : case AT_ColumnDefault:
121 : 3 : strtype = "ALTER COLUMN SET DEFAULT";
122 : 3 : break;
1332 tgl@sss.pgh.pa.us 123 : 1 : case AT_CookedColumnDefault:
124 : 1 : strtype = "ALTER COLUMN SET DEFAULT (precooked)";
125 : 1 : break;
3261 alvherre@alvh.no-ip. 126 : 1 : case AT_DropNotNull:
127 : 1 : strtype = "DROP NOT NULL";
128 : 1 : break;
129 : 2 : case AT_SetNotNull:
130 : 2 : strtype = "SET NOT NULL";
131 : 2 : break;
233 alvherre@alvh.no-ip. 132 :GNC 11 : case AT_SetAttNotNull:
133 : 11 : strtype = "SET ATTNOTNULL";
134 : 11 : break;
101 peter@eisentraut.org 135 :UNC 0 : case AT_SetExpression:
136 : 0 : strtype = "SET EXPRESSION";
137 : 0 : break;
623 michael@paquier.xyz 138 :CBC 1 : case AT_DropExpression:
139 : 1 : strtype = "DROP EXPRESSION";
140 : 1 : break;
3261 alvherre@alvh.no-ip. 141 : 3 : case AT_SetStatistics:
142 : 3 : strtype = "SET STATS";
143 : 3 : break;
3261 alvherre@alvh.no-ip. 144 :UBC 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;
3261 alvherre@alvh.no-ip. 150 :CBC 3 : case AT_SetStorage:
151 : 3 : strtype = "SET STORAGE";
152 : 3 : break;
623 michael@paquier.xyz 153 : 1 : case AT_SetCompression:
154 : 1 : strtype = "SET COMPRESSION";
155 : 1 : break;
3261 alvherre@alvh.no-ip. 156 :UBC 0 : case AT_DropColumn:
157 : 0 : strtype = "DROP COLUMN";
158 : 0 : break;
3261 alvherre@alvh.no-ip. 159 :CBC 1 : case AT_AddIndex:
160 : 1 : strtype = "ADD INDEX";
161 : 1 : break;
3261 alvherre@alvh.no-ip. 162 :UBC 0 : case AT_ReAddIndex:
163 : 0 : strtype = "(re) ADD INDEX";
164 : 0 : break;
3261 alvherre@alvh.no-ip. 165 :CBC 13 : case AT_AddConstraint:
166 : 13 : strtype = "ADD CONSTRAINT";
167 : 13 : break;
3261 alvherre@alvh.no-ip. 168 :GBC 1 : case AT_ReAddConstraint:
169 : 1 : strtype = "(re) ADD CONSTRAINT";
170 : 1 : break;
623 michael@paquier.xyz 171 :CBC 1 : case AT_ReAddDomainConstraint:
172 : 1 : strtype = "(re) ADD DOMAIN CONSTRAINT";
173 : 1 : break;
3261 alvherre@alvh.no-ip. 174 :UBC 0 : case AT_AlterConstraint:
175 : 0 : strtype = "ALTER CONSTRAINT";
176 : 0 : break;
177 : 0 : case AT_ValidateConstraint:
178 : 0 : strtype = "VALIDATE CONSTRAINT";
179 : 0 : break;
180 : 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;
3191 heikki.linnakangas@i 186 : 0 : case AT_ReAddComment:
187 : 0 : strtype = "(re) ADD COMMENT";
188 : 0 : break;
3261 alvherre@alvh.no-ip. 189 :CBC 4 : case AT_AlterColumnType:
190 : 4 : strtype = "ALTER COLUMN SET TYPE";
191 : 4 : break;
3261 alvherre@alvh.no-ip. 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;
3261 alvherre@alvh.no-ip. 198 :CBC 1 : case AT_ClusterOn:
199 : 1 : strtype = "CLUSTER";
200 : 1 : break;
3261 alvherre@alvh.no-ip. 201 :UBC 0 : case AT_DropCluster:
202 : 0 : strtype = "DROP CLUSTER";
203 : 0 : break;
3261 alvherre@alvh.no-ip. 204 :CBC 1 : case AT_SetLogged:
205 : 1 : strtype = "SET LOGGED";
206 : 1 : break;
207 : 1 : case AT_SetUnLogged:
208 : 1 : strtype = "SET UNLOGGED";
209 : 1 : break;
3261 alvherre@alvh.no-ip. 210 :UBC 0 : case AT_DropOids:
211 : 0 : strtype = "DROP OIDS";
212 : 0 : break;
623 michael@paquier.xyz 213 : 0 : case AT_SetAccessMethod:
214 : 0 : strtype = "SET ACCESS METHOD";
215 : 0 : break;
3261 alvherre@alvh.no-ip. 216 : 0 : case AT_SetTableSpace:
217 : 0 : strtype = "SET TABLESPACE";
218 : 0 : break;
3261 alvherre@alvh.no-ip. 219 :CBC 1 : case AT_SetRelOptions:
220 : 1 : strtype = "SET RELOPTIONS";
221 : 1 : break;
222 : 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;
3261 alvherre@alvh.no-ip. 228 :UBC 0 : case AT_EnableTrig:
229 : 0 : strtype = "ENABLE TRIGGER";
230 : 0 : break;
231 : 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 : 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;
3261 alvherre@alvh.no-ip. 279 :CBC 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;
3115 sfrost@snowman.net 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;
3261 alvherre@alvh.no-ip. 291 :UBC 0 : case AT_GenericOptions:
292 : 0 : strtype = "SET OPTIONS";
293 : 0 : break;
623 michael@paquier.xyz 294 :CBC 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;
623 michael@paquier.xyz 300 :UBC 0 : case AT_DetachPartitionFinalize:
301 : 0 : strtype = "DETACH PARTITION ... FINALIZE";
302 : 0 : break;
7 akorotkov@postgresql 303 :UNC 0 : case AT_SplitPartition:
304 : 0 : strtype = "SPLIT PARTITION";
305 : 0 : break;
306 : 0 : case AT_MergePartitions:
307 : 0 : strtype = "MERGE PARTITIONS";
308 : 0 : break;
623 michael@paquier.xyz 309 :CBC 1 : case AT_AddIdentity:
310 : 1 : strtype = "ADD IDENTITY";
311 : 1 : break;
312 : 1 : case AT_SetIdentity:
313 : 1 : strtype = "SET IDENTITY";
314 : 1 : break;
315 : 1 : case AT_DropIdentity:
316 : 1 : strtype = "DROP IDENTITY";
317 : 1 : break;
318 : 1 : case AT_ReAddStatistics:
319 : 1 : strtype = "(re) ADD STATS";
3191 alvherre@alvh.no-ip. 320 : 1 : break;
321 : : }
322 : :
489 323 [ + + ]: 63 : if (subcmd->recurse)
324 : 19 : values[0] = CStringGetTextDatum(psprintf("%s (and recurse)", strtype));
325 : : else
326 : 44 : values[0] = CStringGetTextDatum(strtype);
623 michael@paquier.xyz 327 [ + + ]: 63 : if (OidIsValid(sub->address.objectId))
328 : : {
329 : : char *objdesc;
330 : :
331 : 47 : objdesc = getObjectDescription((const ObjectAddress *) &sub->address, false);
332 : 47 : values[1] = CStringGetTextDatum(objdesc);
333 : : }
334 : : else
335 : 16 : nulls[1] = true;
336 : :
337 : 63 : tuplestore_putvalues(rsinfo->setResult, rsinfo->setDesc, values, nulls);
338 : : }
339 : :
340 : 40 : return (Datum) 0;
341 : : }
|