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

61int numattr;

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

148static List *Typ = NIL;

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)