PostgreSQL Source Code: src/backend/bootstrap/bootstrap.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
16
18#include <signal.h>
19
39#include "utils/fmgroids.h"
44
45
52
53
54
55
56
57
59
62
63
64
65
66
67
68
69
70
71
72
74{
85};
86
88 {"bool", BOOLOID, 0, 1, true, TYPALIGN_CHAR, TYPSTORAGE_PLAIN, InvalidOid,
89 F_BOOLIN, F_BOOLOUT},
90 {"bytea", BYTEAOID, 0, -1, false, TYPALIGN_INT, TYPSTORAGE_EXTENDED, InvalidOid,
91 F_BYTEAIN, F_BYTEAOUT},
92 {"char", CHAROID, 0, 1, true, TYPALIGN_CHAR, TYPSTORAGE_PLAIN, InvalidOid,
93 F_CHARIN, F_CHAROUT},
94 {"int2", INT2OID, 0, 2, true, TYPALIGN_SHORT, TYPSTORAGE_PLAIN, InvalidOid,
95 F_INT2IN, F_INT2OUT},
96 {"int4", INT4OID, 0, 4, true, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
97 F_INT4IN, F_INT4OUT},
98 {"float4", FLOAT4OID, 0, 4, true, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
99 F_FLOAT4IN, F_FLOAT4OUT},
100 {"name", NAMEOID, CHAROID, NAMEDATALEN, false, TYPALIGN_CHAR, TYPSTORAGE_PLAIN, C_COLLATION_OID,
101 F_NAMEIN, F_NAMEOUT},
102 {"regclass", REGCLASSOID, 0, 4, true, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
103 F_REGCLASSIN, F_REGCLASSOUT},
104 {"regproc", REGPROCOID, 0, 4, true, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
105 F_REGPROCIN, F_REGPROCOUT},
106 {"regtype", REGTYPEOID, 0, 4, true, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
107 F_REGTYPEIN, F_REGTYPEOUT},
108 {"regrole", REGROLEOID, 0, 4, true, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
109 F_REGROLEIN, F_REGROLEOUT},
110 {"regnamespace", REGNAMESPACEOID, 0, 4, true, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
111 F_REGNAMESPACEIN, F_REGNAMESPACEOUT},
112 {"text", TEXTOID, 0, -1, false, TYPALIGN_INT, TYPSTORAGE_EXTENDED, DEFAULT_COLLATION_OID,
113 F_TEXTIN, F_TEXTOUT},
114 {"oid", OIDOID, 0, 4, true, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
115 F_OIDIN, F_OIDOUT},
116 {"tid", TIDOID, 0, 6, false, TYPALIGN_SHORT, TYPSTORAGE_PLAIN, InvalidOid,
117 F_TIDIN, F_TIDOUT},
118 {"xid", XIDOID, 0, 4, true, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
119 F_XIDIN, F_XIDOUT},
120 {"cid", CIDOID, 0, 4, true, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
121 F_CIDIN, F_CIDOUT},
122 {"pg_node_tree", PG_NODE_TREEOID, 0, -1, false, TYPALIGN_INT, TYPSTORAGE_EXTENDED, DEFAULT_COLLATION_OID,
123 F_PG_NODE_TREE_IN, F_PG_NODE_TREE_OUT},
124 {"int2vector", INT2VECTOROID, INT2OID, -1, false, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
125 F_INT2VECTORIN, F_INT2VECTOROUT},
126 {"oidvector", OIDVECTOROID, OIDOID, -1, false, TYPALIGN_INT, TYPSTORAGE_PLAIN, InvalidOid,
127 F_OIDVECTORIN, F_OIDVECTOROUT},
128 {"_int4", INT4ARRAYOID, INT4OID, -1, false, TYPALIGN_INT, TYPSTORAGE_EXTENDED, InvalidOid,
129 F_ARRAY_IN, F_ARRAY_OUT},
130 {"_text", 1009, TEXTOID, -1, false, TYPALIGN_INT, TYPSTORAGE_EXTENDED, DEFAULT_COLLATION_OID,
131 F_ARRAY_IN, F_ARRAY_OUT},
132 {"_oid", 1028, OIDOID, -1, false, TYPALIGN_INT, TYPSTORAGE_EXTENDED, InvalidOid,
133 F_ARRAY_IN, F_ARRAY_OUT},
134 {"_char", 1002, CHAROID, -1, false, TYPALIGN_INT, TYPSTORAGE_EXTENDED, InvalidOid,
135 F_ARRAY_IN, F_ARRAY_OUT},
136 {"_aclitem", 1034, ACLITEMOID, -1, false, TYPALIGN_INT, TYPSTORAGE_EXTENDED, InvalidOid,
137 F_ARRAY_IN, F_ARRAY_OUT}
138};
139
141
143{
146};
147
150
153
155
156
157
158
159
160
161
163{
169
171
172
173
174
175
176
177
178
179static void
181{
183}
184
185
186
187
188
189
190
191
192
193
194
195
196
197void
199{
200 int i;
204 uint32 bootstrap_data_checksum_version = 0;
206
208
210
211
213
214
216 && (strcmp(argv[1], "--boot") == 0
217 || strcmp(argv[1], "--check") == 0));
218 argv++;
219 argc--;
220
221 while ((flag = getopt(argc, argv, "B:c:d:D:Fkr:X:-:")) != -1)
222 {
223 switch (flag)
224 {
225 case 'B':
227 break;
228 case '-':
229
230
231
232
233
234
235
238 (errcode(ERRCODE_SYNTAX_ERROR),
239 errmsg("--%s must be first argument", optarg)));
240
241
242 case 'c':
243 {
246
249 {
250 if (flag == '-')
252 (errcode(ERRCODE_SYNTAX_ERROR),
253 errmsg("--%s requires a value",
255 else
257 (errcode(ERRCODE_SYNTAX_ERROR),
258 errmsg("-c %s requires a value",
260 }
261
265 break;
266 }
267 case 'D':
269 break;
270 case 'd':
271 {
272
273 char *debugstr;
274
281 }
282 break;
283 case 'F':
285 break;
286 case 'k':
288 break;
289 case 'r':
291 break;
292 case 'X':
294 break;
295 default:
296 write_stderr("Try \"%s --help\" for more information.\n",
299 break;
300 }
301 }
302
304 {
307 }
308
309
312
313
314
315
316
319
321
324
326
327
328
329
330
331
333
335
337
338
339
340
341
343
344
345
346
347
348
349 if (check_only)
350 {
353 abort();
354 }
355
356
357
358
360
362
365
366
367
368
369
371 elog(ERROR, "backend is incorrectly linked to frontend functions");
372
374
375
377 {
380 }
381
383 elog(ERROR, "yylex_init() failed: %m");
384
385
386
387
391
392
393
394
395
397
398
401}
402
403
404
405
406
407
408
409
410
411
412static void
414{
416
417
418
419
420
421
426}
427
428
429
430
431
432
433
434
435
436
437
438
439void
441{
442 int i;
443
446
447
448
449
450
453
456
457 elog(DEBUG4, "open relation %s, attrsize %d",
459
463 {
469
470 {
472
473 elog(DEBUG4, "create attribute %d name %s len %d num %d type %u",
474 i, NameStr(at->attname), at->attlen, at->attnum,
475 at->atttypid);
476 }
477 }
478}
479
480
481
482
483
484void
486{
488 {
490 {
492 elog(ERROR, "close of %s when %s was expected",
494 }
495 else
496 elog(ERROR, "close of %s before any relation was opened",
498 }
499
501 elog(ERROR, "no open relation to close");
502 else
503 {
508 }
509}
510
511
512
513
514
515
516
517
518
519
520
521void
523{
524 Oid typeoid;
525
527 {
528 elog(WARNING, "no open relations allowed with CREATE command");
530 }
531
535
539
541
543 {
551
554 else
556 }
557 else
558 {
566
570 else
572 }
573
574
575
576
577
578
579
582
585
587 {
589 }
591 {
593 }
594 else
595 {
597
598
599
600
601
602
604 {
605 int i;
606
607
609 {
612 break;
613 }
616 }
617 }
618}
619
620
621
622
623
624
625
626
627
628void
630{
633 int i;
634
636
639 pfree(tupDesc);
640
644
645
646
647
650}
651
652
653
654
655
656void
658{
659 Oid typoid;
661 bool typbyval;
663 char typdelim;
664 Oid typioparam;
665 Oid typinput;
666 Oid typoutput;
667
669
671
673
675 &typlen, &typbyval, &typalign,
676 &typdelim, &typioparam,
677 &typinput, &typoutput);
678
680
681
682
683
684
688}
689
690
691
692
693
694void
696{
697 elog(DEBUG4, "inserting column %d NULL", i);
701 "NULL value specified for not-null column \"%s\" of relation \"%s\"",
706}
707
708
709
710
711
712static void
714{
717}
718
719
720
721
722
723
724
725static void
727{
732
734
739 {
741 struct typmap *newtyp;
742
745
746 newtyp->am_oid = typForm->oid;
747 memcpy(&newtyp->am_typ, typForm, sizeof(newtyp->am_typ));
748 }
752}
753
754
755
756
757
758
759
760
761
762
763
764
765static Oid
767{
769 {
771
772 foreach(lc, Typ)
773 {
775
777 {
778 Ap = app;
780 }
781 }
782
783
784
785
786
787
791
792
793
794
795
796 foreach(lc, Typ)
797 {
799
801 {
802 Ap = app;
804 }
805 }
806 }
807 else
808 {
809 int i;
810
812 {
814 return i;
815 }
816
820 }
822
823 return 0;
824}
825
826
827
828
829
830
831
832
833
834
835
836void
839 bool *typbyval,
841 char *typdelim,
842 Oid *typioparam,
843 Oid *typinput,
844 Oid *typoutput)
845{
847 {
848
849 struct typmap *ap = NULL;
851
852 foreach(lc, Typ)
853 {
855 if (ap->am_oid == typid)
856 break;
857 }
858
859 if (!ap || ap->am_oid != typid)
860 elog(ERROR, "type OID %u not found in Typ list", typid);
861
862 *typlen = ap->am_typ.typlen;
863 *typbyval = ap->am_typ.typbyval;
865 *typdelim = ap->am_typ.typdelim;
866
867
869 *typioparam = ap->am_typ.typelem;
870 else
871 *typioparam = typid;
872
873 *typinput = ap->am_typ.typinput;
874 *typoutput = ap->am_typ.typoutput;
875 }
876 else
877 {
878
879 int typeindex;
880
881 for (typeindex = 0; typeindex < n_types; typeindex++)
882 {
883 if (TypInfo[typeindex].oid == typid)
884 break;
885 }
886 if (typeindex >= n_types)
887 elog(ERROR, "type OID %u not found in TypInfo", typid);
888
892
893 *typdelim = ',';
894
895
898 else
899 *typioparam = typid;
900
903 }
904}
905
906
907
908
909
910
911
912
915{
918}
919
920
921
922
923
924
925
926
927
928
929
930
931void
935{
938
939
940
941
942
943
944
945 if (nogc == NULL)
947 "BootstrapNoGC",
949
951
956
958
962
966
970
973
975}
976
977
978
979
980
981void
983{
985 {
988
989
992
994
997 }
998}
#define write_stderr(str)
static Oid gettype(char *type)
static Datum values[MAXATTR]
void closerel(char *relname)
static void populate_typ_list(void)
static void CheckerModeMain(void)
void InsertOneValue(char *value, int i)
static void cleanup(void)
void InsertOneNull(int i)
static const struct typinfo TypInfo[]
static struct typmap * Ap
void InsertOneTuple(void)
struct _IndexList IndexList
static void bootstrap_signals(void)
Form_pg_attribute attrtypes[MAXATTR]
void boot_get_type_io_data(Oid typid, int16 *typlen, bool *typbyval, char *typalign, char *typdelim, Oid *typioparam, Oid *typinput, Oid *typoutput)
static Form_pg_attribute AllocateAttribute(void)
static MemoryContext nogc
void BootstrapModeMain(int argc, char *argv[], bool check_only)
void DefineAttr(char *name, char *type, int attnum, int nullness)
static bool Nulls[MAXATTR]
void index_register(Oid heap, Oid ind, const IndexInfo *indexInfo)
void boot_openrel(char *relname)
static IndexList * ILHead
#define BOOTCOL_NULL_FORCE_NULL
int boot_yylex_init(yyscan_t *yyscannerp)
#define BOOTCOL_NULL_FORCE_NOT_NULL
#define BOOTCOL_NULL_AUTO
int boot_yyparse(yyscan_t yyscanner)
#define PG_DATA_CHECKSUM_VERSION
#define MemSet(start, val, len)
#define OidIsValid(objectId)
int errmsg_internal(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
void set_max_safe_fds(void)
Datum OidInputFunctionCall(Oid functionId, char *str, Oid typioparam, int32 typmod)
char * OidOutputFunctionCall(Oid functionId, Datum val)
char OutputFileName[MAXPGPATH]
void SetConfigOption(const char *name, const char *value, GucContext context, GucSource source)
bool SelectConfigFiles(const char *userDoption, const char *progname)
void ParseLongOption(const char *string, char **name, char **value)
void InitializeGUCOptions(void)
Assert(PointerIsAligned(start, uint64))
HeapTuple heap_getnext(TableScanDesc sscan, ScanDirection direction)
void simple_heap_insert(Relation relation, HeapTuple tup)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
void heap_freetuple(HeapTuple htup)
static void * GETSTRUCT(const HeapTupleData *tuple)
void index_build(Relation heapRelation, Relation indexRelation, IndexInfo *indexInfo, bool isreindex, bool parallel)
void index_close(Relation relation, LOCKMODE lockmode)
Relation index_open(Oid relationId, LOCKMODE lockmode)
void CreateSharedMemoryAndSemaphores(void)
bool pg_link_canary_is_frontend(void)
List * lappend(List *list, void *datum)
void list_free_deep(List *list)
DispatchOption parse_dispatch_option(const char *name)
RangeVar * makeRangeVar(char *schemaname, char *relname, int location)
void * MemoryContextAllocZero(MemoryContext context, Size size)
char * pstrdup(const char *in)
void pfree(void *pointer)
MemoryContext TopMemoryContext
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define SetProcessingMode(mode)
void ChangeToDataDir(void)
void InitStandaloneProcess(const char *argv0)
void CreateDataDirLockFile(bool amPostmaster)
void namestrcpy(Name name, const char *str)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define ATTRIBUTE_FIXED_PART_SIZE
FormData_pg_attribute * Form_pg_attribute
int getopt(int nargc, char *const *nargv, const char *ostr)
PGDLLIMPORT char * optarg
FormData_pg_type * Form_pg_type
void InitPostmasterChildSlots(void)
size_t strlcpy(char *dst, const char *src, size_t siz)
static const char * userDoption
static Datum PointerGetDatum(const void *X)
void InitializeMaxBackends(void)
void InitializeFastPathLocks(void)
void InitPostgres(const char *in_dbname, Oid dboid, const char *username, Oid useroid, bits32 flags, char *out_dbname)
char * psprintf(const char *fmt,...)
#define RelationGetNumberOfAttributes(relation)
#define RelationGetRelationName(relation)
void RelationMapFinishBootstrap(void)
uint16 * ii_ExclusionStrats
ExprState * ii_PredicateState
List * ii_ExpressionsState
struct _IndexList * il_next
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
Relation table_openrv(const RangeVar *relation, LOCKMODE lockmode)
TableScanDesc table_beginscan_catalog(Relation relation, int nkeys, struct ScanKeyData *key)
static void table_endscan(TableScanDesc scan)
#define InvalidCompressionMethod
TupleDesc CreateTupleDesc(int natts, Form_pg_attribute *attrs)
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
void StartTransactionCommand(void)
void CommitTransactionCommand(void)
void BootStrapXLOG(uint32 data_checksum_version)