PostgreSQL Source Code  git master
pg_upgrade_support.c
Go to the documentation of this file.
1 /*
2  * pg_upgrade_support.c
3  *
4  * server-side functions to set backend global variables
5  * to control oid and relfilenode assignment, and do other special
6  * hacks needed for pg_upgrade.
7  *
8  * Copyright (c) 2010-2021, PostgreSQL Global Development Group
9  * src/backend/utils/adt/pg_upgrade_support.c
10  */
11 
12 #include "postgres.h"
13 
14 #include "catalog/binary_upgrade.h"
15 #include "catalog/heap.h"
16 #include "catalog/namespace.h"
17 #include "catalog/pg_type.h"
18 #include "commands/extension.h"
19 #include "miscadmin.h"
20 #include "utils/array.h"
21 #include "utils/builtins.h"
22 
23 
24 #define CHECK_IS_BINARY_UPGRADE \
25 do { \
26  if (!IsBinaryUpgrade) \
27  ereport(ERROR, \
28  (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM), \
29  errmsg("function can only be called when server is in binary upgrade mode"))); \
30 } while (0)
31 
32 Datum
34 {
35  Oid typoid = PG_GETARG_OID(0);
36 
39 
41 }
42 
43 Datum
45 {
46  Oid typoid = PG_GETARG_OID(0);
47 
50 
52 }
53 
54 Datum
56 {
57  Oid typoid = PG_GETARG_OID(0);
58 
61 
63 }
64 
65 Datum
67 {
68  Oid typoid = PG_GETARG_OID(0);
69 
72 
74 }
75 
76 Datum
78 {
79  Oid reloid = PG_GETARG_OID(0);
80 
83 
85 }
86 
87 Datum
89 {
90  Oid reloid = PG_GETARG_OID(0);
91 
94 
96 }
97 
98 Datum
100 {
101  Oid reloid = PG_GETARG_OID(0);
102 
105 
106  PG_RETURN_VOID();
107 }
108 
109 Datum
111 {
112  Oid enumoid = PG_GETARG_OID(0);
113 
116 
117  PG_RETURN_VOID();
118 }
119 
120 Datum
122 {
123  Oid authoid = PG_GETARG_OID(0);
124 
127  PG_RETURN_VOID();
128 }
129 
130 Datum
132 {
133  text *extName;
134  text *schemaName;
135  bool relocatable;
136  text *extVersion;
137  Datum extConfig;
138  Datum extCondition;
139  List *requiredExtensions;
140 
142 
143  /* We must check these things before dereferencing the arguments */
144  if (PG_ARGISNULL(0) ||
145  PG_ARGISNULL(1) ||
146  PG_ARGISNULL(2) ||
147  PG_ARGISNULL(3))
148  elog(ERROR, "null argument to binary_upgrade_create_empty_extension is not allowed");
149 
150  extName = PG_GETARG_TEXT_PP(0);
151  schemaName = PG_GETARG_TEXT_PP(1);
152  relocatable = PG_GETARG_BOOL(2);
153  extVersion = PG_GETARG_TEXT_PP(3);
154 
155  if (PG_ARGISNULL(4))
156  extConfig = PointerGetDatum(NULL);
157  else
158  extConfig = PG_GETARG_DATUM(4);
159 
160  if (PG_ARGISNULL(5))
161  extCondition = PointerGetDatum(NULL);
162  else
163  extCondition = PG_GETARG_DATUM(5);
164 
165  requiredExtensions = NIL;
166  if (!PG_ARGISNULL(6))
167  {
168  ArrayType *textArray = PG_GETARG_ARRAYTYPE_P(6);
169  Datum *textDatums;
170  int ndatums;
171  int i;
172 
173  deconstruct_array(textArray,
174  TEXTOID, -1, false, TYPALIGN_INT,
175  &textDatums, NULL, &ndatums);
176  for (i = 0; i < ndatums; i++)
177  {
178  char *extName = TextDatumGetCString(textDatums[i]);
179  Oid extOid = get_extension_oid(extName, false);
180 
181  requiredExtensions = lappend_oid(requiredExtensions, extOid);
182  }
183  }
184 
186  GetUserId(),
187  get_namespace_oid(text_to_cstring(schemaName), false),
188  relocatable,
189  text_to_cstring(extVersion),
190  extConfig,
191  extCondition,
192  requiredExtensions);
193 
194  PG_RETURN_VOID();
195 }
196 
197 Datum
199 {
200  bool record_init_privs = PG_GETARG_BOOL(0);
201 
203  binary_upgrade_record_init_privs = record_init_privs;
204 
205  PG_RETURN_VOID();
206 }
207 
208 Datum
210 {
211  Oid table_id = PG_GETARG_OID(0);
214  char *cattname = text_to_cstring(attname);
215  char *cvalue = text_to_cstring(value);
216 
218  SetAttrMissing(table_id, cattname, cvalue);
219 
220  PG_RETURN_VOID();
221 }
#define NIL
Definition: pg_list.h:65
Oid get_namespace_oid(const char *nspname, bool missing_ok)
Definition: namespace.c:3042
Oid binary_upgrade_next_pg_authid_oid
Definition: user.c:42
static struct @142 value
Oid binary_upgrade_next_heap_pg_class_oid
Definition: heap.c:93
bool binary_upgrade_record_init_privs
Definition: aclchk.c:101
Oid GetUserId(void)
Definition: miscinit.c:478
Oid binary_upgrade_next_toast_pg_class_oid
Definition: heap.c:94
#define PointerGetDatum(X)
Definition: postgres.h:600
#define PG_GETARG_DATUM(n)
Definition: fmgr.h:268
Oid binary_upgrade_next_index_pg_class_oid
Definition: index.c:88
Datum binary_upgrade_set_next_index_pg_class_oid(PG_FUNCTION_ARGS)
#define PG_GETARG_BOOL(n)
Definition: fmgr.h:274
void SetAttrMissing(Oid relid, char *attname, char *value)
Definition: heap.c:2150
unsigned int Oid
Definition: postgres_ext.h:31
List * lappend_oid(List *list, Oid datum)
Definition: list.c:372
#define PG_GETARG_TEXT_PP(n)
Definition: fmgr.h:309
#define PG_GETARG_ARRAYTYPE_P(n)
Definition: array.h:256
#define ERROR
Definition: elog.h:46
NameData attname
Definition: pg_attribute.h:41
Datum binary_upgrade_create_empty_extension(PG_FUNCTION_ARGS)
Datum binary_upgrade_set_next_multirange_array_pg_type_oid(PG_FUNCTION_ARGS)
Oid binary_upgrade_next_pg_enum_oid
Definition: pg_enum.c:36
#define PG_GETARG_OID(n)
Definition: fmgr.h:275
Oid binary_upgrade_next_pg_type_oid
Definition: pg_type.c:44
Datum binary_upgrade_set_next_toast_pg_class_oid(PG_FUNCTION_ARGS)
#define TextDatumGetCString(d)
Definition: builtins.h:83
uintptr_t Datum
Definition: postgres.h:411
Datum binary_upgrade_set_next_multirange_pg_type_oid(PG_FUNCTION_ARGS)
#define PG_RETURN_VOID()
Definition: fmgr.h:349
Datum binary_upgrade_set_missing_value(PG_FUNCTION_ARGS)
#define PG_ARGISNULL(n)
Definition: fmgr.h:209
Datum binary_upgrade_set_next_pg_type_oid(PG_FUNCTION_ARGS)
ObjectAddress InsertExtensionTuple(const char *extName, Oid extOwner, Oid schemaOid, bool relocatable, const char *extVersion, Datum extConfig, Datum extCondition, List *requiredExtensions)
Definition: extension.c:1787
Oid binary_upgrade_next_mrng_pg_type_oid
Definition: typecmds.c:110
Oid binary_upgrade_next_array_pg_type_oid
Definition: typecmds.c:109
Datum binary_upgrade_set_next_heap_pg_class_oid(PG_FUNCTION_ARGS)
void deconstruct_array(ArrayType *array, Oid elmtype, int elmlen, bool elmbyval, char elmalign, Datum **elemsp, bool **nullsp, int *nelemsp)
Definition: arrayfuncs.c:3490
char * text_to_cstring(const text *t)
Definition: varlena.c:223
Oid get_extension_oid(const char *extname, bool missing_ok)
Definition: extension.c:140
Datum binary_upgrade_set_next_array_pg_type_oid(PG_FUNCTION_ARGS)
Datum binary_upgrade_set_next_pg_enum_oid(PG_FUNCTION_ARGS)
#define PG_GETARG_TEXT_P(n)
Definition: fmgr.h:336
#define elog(elevel,...)
Definition: elog.h:232
int i
Definition: c.h:621
#define PG_FUNCTION_ARGS
Definition: fmgr.h:193
Datum binary_upgrade_set_record_init_privs(PG_FUNCTION_ARGS)
Oid binary_upgrade_next_mrng_array_pg_type_oid
Definition: typecmds.c:111
Datum binary_upgrade_set_next_pg_authid_oid(PG_FUNCTION_ARGS)
Definition: pg_list.h:50
#define CHECK_IS_BINARY_UPGRADE