]> granicus.if.org Git - postgresql/blob - src/backend/utils/adt/pg_upgrade_support.c
Update copyright for 2016
[postgresql] / src / backend / utils / adt / pg_upgrade_support.c
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-2016, 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/namespace.h"
16 #include "catalog/pg_type.h"
17 #include "commands/extension.h"
18 #include "miscadmin.h"
19 #include "utils/array.h"
20 #include "utils/builtins.h"
21
22
23 Datum           binary_upgrade_set_next_pg_type_oid(PG_FUNCTION_ARGS);
24 Datum           binary_upgrade_set_next_array_pg_type_oid(PG_FUNCTION_ARGS);
25 Datum           binary_upgrade_set_next_toast_pg_type_oid(PG_FUNCTION_ARGS);
26 Datum           binary_upgrade_set_next_heap_pg_class_oid(PG_FUNCTION_ARGS);
27 Datum           binary_upgrade_set_next_index_pg_class_oid(PG_FUNCTION_ARGS);
28 Datum           binary_upgrade_set_next_toast_pg_class_oid(PG_FUNCTION_ARGS);
29 Datum           binary_upgrade_set_next_pg_enum_oid(PG_FUNCTION_ARGS);
30 Datum           binary_upgrade_set_next_pg_authid_oid(PG_FUNCTION_ARGS);
31 Datum           binary_upgrade_create_empty_extension(PG_FUNCTION_ARGS);
32
33
34 #define CHECK_IS_BINARY_UPGRADE                                                                 \
35 do {                                                                                                                    \
36         if (!IsBinaryUpgrade)                                                                           \
37                 ereport(ERROR,                                                                                  \
38                                 (errcode(ERRCODE_CANT_CHANGE_RUNTIME_PARAM),    \
39                                  (errmsg("function can only be called when server is in binary upgrade mode")))); \
40 } while (0)
41
42 Datum
43 binary_upgrade_set_next_pg_type_oid(PG_FUNCTION_ARGS)
44 {
45         Oid                     typoid = PG_GETARG_OID(0);
46
47         CHECK_IS_BINARY_UPGRADE;
48         binary_upgrade_next_pg_type_oid = typoid;
49
50         PG_RETURN_VOID();
51 }
52
53 Datum
54 binary_upgrade_set_next_array_pg_type_oid(PG_FUNCTION_ARGS)
55 {
56         Oid                     typoid = PG_GETARG_OID(0);
57
58         CHECK_IS_BINARY_UPGRADE;
59         binary_upgrade_next_array_pg_type_oid = typoid;
60
61         PG_RETURN_VOID();
62 }
63
64 Datum
65 binary_upgrade_set_next_toast_pg_type_oid(PG_FUNCTION_ARGS)
66 {
67         Oid                     typoid = PG_GETARG_OID(0);
68
69         CHECK_IS_BINARY_UPGRADE;
70         binary_upgrade_next_toast_pg_type_oid = typoid;
71
72         PG_RETURN_VOID();
73 }
74
75 Datum
76 binary_upgrade_set_next_heap_pg_class_oid(PG_FUNCTION_ARGS)
77 {
78         Oid                     reloid = PG_GETARG_OID(0);
79
80         CHECK_IS_BINARY_UPGRADE;
81         binary_upgrade_next_heap_pg_class_oid = reloid;
82
83         PG_RETURN_VOID();
84 }
85
86 Datum
87 binary_upgrade_set_next_index_pg_class_oid(PG_FUNCTION_ARGS)
88 {
89         Oid                     reloid = PG_GETARG_OID(0);
90
91         CHECK_IS_BINARY_UPGRADE;
92         binary_upgrade_next_index_pg_class_oid = reloid;
93
94         PG_RETURN_VOID();
95 }
96
97 Datum
98 binary_upgrade_set_next_toast_pg_class_oid(PG_FUNCTION_ARGS)
99 {
100         Oid                     reloid = PG_GETARG_OID(0);
101
102         CHECK_IS_BINARY_UPGRADE;
103         binary_upgrade_next_toast_pg_class_oid = reloid;
104
105         PG_RETURN_VOID();
106 }
107
108 Datum
109 binary_upgrade_set_next_pg_enum_oid(PG_FUNCTION_ARGS)
110 {
111         Oid                     enumoid = PG_GETARG_OID(0);
112
113         CHECK_IS_BINARY_UPGRADE;
114         binary_upgrade_next_pg_enum_oid = enumoid;
115
116         PG_RETURN_VOID();
117 }
118
119 Datum
120 binary_upgrade_set_next_pg_authid_oid(PG_FUNCTION_ARGS)
121 {
122         Oid                     authoid = PG_GETARG_OID(0);
123
124         CHECK_IS_BINARY_UPGRADE;
125         binary_upgrade_next_pg_authid_oid = authoid;
126         PG_RETURN_VOID();
127 }
128
129 Datum
130 binary_upgrade_create_empty_extension(PG_FUNCTION_ARGS)
131 {
132         text       *extName = PG_GETARG_TEXT_PP(0);
133         text       *schemaName = PG_GETARG_TEXT_PP(1);
134         bool            relocatable = PG_GETARG_BOOL(2);
135         text       *extVersion = PG_GETARG_TEXT_PP(3);
136         Datum           extConfig;
137         Datum           extCondition;
138         List       *requiredExtensions;
139
140         CHECK_IS_BINARY_UPGRADE;
141
142         if (PG_ARGISNULL(4))
143                 extConfig = PointerGetDatum(NULL);
144         else
145                 extConfig = PG_GETARG_DATUM(4);
146
147         if (PG_ARGISNULL(5))
148                 extCondition = PointerGetDatum(NULL);
149         else
150                 extCondition = PG_GETARG_DATUM(5);
151
152         requiredExtensions = NIL;
153         if (!PG_ARGISNULL(6))
154         {
155                 ArrayType  *textArray = PG_GETARG_ARRAYTYPE_P(6);
156                 Datum      *textDatums;
157                 int                     ndatums;
158                 int                     i;
159
160                 deconstruct_array(textArray,
161                                                   TEXTOID, -1, false, 'i',
162                                                   &textDatums, NULL, &ndatums);
163                 for (i = 0; i < ndatums; i++)
164                 {
165                         text       *txtname = DatumGetTextPP(textDatums[i]);
166                         char       *extName = text_to_cstring(txtname);
167                         Oid                     extOid = get_extension_oid(extName, false);
168
169                         requiredExtensions = lappend_oid(requiredExtensions, extOid);
170                 }
171         }
172
173         InsertExtensionTuple(text_to_cstring(extName),
174                                                  GetUserId(),
175                                            get_namespace_oid(text_to_cstring(schemaName), false),
176                                                  relocatable,
177                                                  text_to_cstring(extVersion),
178                                                  extConfig,
179                                                  extCondition,
180                                                  requiredExtensions);
181
182         PG_RETURN_VOID();
183 }