@@ -2207,6 +2207,13 @@ selectDumpableProcLang(ProcLangInfo *plang, Archive *fout)
2207
2207
static void
2208
2208
selectDumpableAccessMethod(AccessMethodInfo *method, Archive *fout)
2209
2209
{
2210
+ /* see getAccessMethods() comment about v9.6. */
2211
+ if (fout->remoteVersion < 90600)
2212
+ {
2213
+ method->dobj.dump = DUMP_COMPONENT_NONE;
2214
+ return;
2215
+ }
2216
+
2210
2217
if (checkExtensionMembership(&method->dobj, fout))
2211
2218
return; /* extension membership overrides all else */
2212
2219
@@ -6262,6 +6269,8 @@ getOperators(Archive *fout)
6262
6269
int i_oprnamespace;
6263
6270
int i_oprowner;
6264
6271
int i_oprkind;
6272
+ int i_oprleft;
6273
+ int i_oprright;
6265
6274
int i_oprcode;
6266
6275
6267
6276
/*
@@ -6273,6 +6282,8 @@ getOperators(Archive *fout)
6273
6282
"oprnamespace, "
6274
6283
"oprowner, "
6275
6284
"oprkind, "
6285
+ "oprleft, "
6286
+ "oprright, "
6276
6287
"oprcode::oid AS oprcode "
6277
6288
"FROM pg_operator");
6278
6289
@@ -6288,6 +6299,8 @@ getOperators(Archive *fout)
6288
6299
i_oprnamespace = PQfnumber(res, "oprnamespace");
6289
6300
i_oprowner = PQfnumber(res, "oprowner");
6290
6301
i_oprkind = PQfnumber(res, "oprkind");
6302
+ i_oprleft = PQfnumber(res, "oprleft");
6303
+ i_oprright = PQfnumber(res, "oprright");
6291
6304
i_oprcode = PQfnumber(res, "oprcode");
6292
6305
6293
6306
for (i = 0; i < ntups; i++)
@@ -6301,6 +6314,8 @@ getOperators(Archive *fout)
6301
6314
findNamespace(atooid(PQgetvalue(res, i, i_oprnamespace)));
6302
6315
oprinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_oprowner));
6303
6316
oprinfo[i].oprkind = (PQgetvalue(res, i, i_oprkind))[0];
6317
+ oprinfo[i].oprleft = atooid(PQgetvalue(res, i, i_oprleft));
6318
+ oprinfo[i].oprright = atooid(PQgetvalue(res, i, i_oprright));
6304
6319
oprinfo[i].oprcode = atooid(PQgetvalue(res, i, i_oprcode));
6305
6320
6306
6321
/* Decide whether we want to dump it */
@@ -6329,6 +6344,7 @@ getCollations(Archive *fout)
6329
6344
int i_collname;
6330
6345
int i_collnamespace;
6331
6346
int i_collowner;
6347
+ int i_collencoding;
6332
6348
6333
6349
query = createPQExpBuffer();
6334
6350
@@ -6339,7 +6355,8 @@ getCollations(Archive *fout)
6339
6355
6340
6356
appendPQExpBufferStr(query, "SELECT tableoid, oid, collname, "
6341
6357
"collnamespace, "
6342
- "collowner "
6358
+ "collowner, "
6359
+ "collencoding "
6343
6360
"FROM pg_collation");
6344
6361
6345
6362
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@@ -6353,6 +6370,7 @@ getCollations(Archive *fout)
6353
6370
i_collname = PQfnumber(res, "collname");
6354
6371
i_collnamespace = PQfnumber(res, "collnamespace");
6355
6372
i_collowner = PQfnumber(res, "collowner");
6373
+ i_collencoding = PQfnumber(res, "collencoding");
6356
6374
6357
6375
for (i = 0; i < ntups; i++)
6358
6376
{
@@ -6364,6 +6382,7 @@ getCollations(Archive *fout)
6364
6382
collinfo[i].dobj.namespace =
6365
6383
findNamespace(atooid(PQgetvalue(res, i, i_collnamespace)));
6366
6384
collinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_collowner));
6385
+ collinfo[i].collencoding = atoi(PQgetvalue(res, i, i_collencoding));
6367
6386
6368
6387
/* Decide whether we want to dump it */
6369
6388
selectDumpableObject(&(collinfo[i].dobj), fout);
@@ -6454,16 +6473,28 @@ getAccessMethods(Archive *fout)
6454
6473
int i_amhandler;
6455
6474
int i_amtype;
6456
6475
6457
- /* Before 9.6, there are no user-defined access methods */
6458
- if (fout->remoteVersion < 90600)
6459
- return;
6460
-
6461
6476
query = createPQExpBuffer();
6462
6477
6463
- /* Select all access methods from pg_am table */
6464
- appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, amtype, "
6465
- "amhandler::pg_catalog.regproc AS amhandler "
6466
- "FROM pg_am");
6478
+ /*
6479
+ * Select all access methods from pg_am table. v9.6 introduced CREATE
6480
+ * ACCESS METHOD, so earlier versions usually have only built-in access
6481
+ * methods. v9.6 also changed the access method API, replacing dozens of
6482
+ * pg_am columns with amhandler. Even if a user created an access method
6483
+ * by "INSERT INTO pg_am", we have no way to translate pre-v9.6 pg_am
6484
+ * columns to a v9.6+ CREATE ACCESS METHOD. Hence, before v9.6, read
6485
+ * pg_am just to facilitate findAccessMethodByOid() providing the
6486
+ * OID-to-name mapping.
6487
+ */
6488
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, ");
6489
+ if (fout->remoteVersion >= 90600)
6490
+ appendPQExpBufferStr(query,
6491
+ "amtype, "
6492
+ "amhandler::pg_catalog.regproc AS amhandler ");
6493
+ else
6494
+ appendPQExpBufferStr(query,
6495
+ "'i'::pg_catalog.\"char\" AS amtype, "
6496
+ "'-'::pg_catalog.regproc AS amhandler ");
6497
+ appendPQExpBufferStr(query, "FROM pg_am");
6467
6498
6468
6499
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
6469
6500
@@ -6512,6 +6543,7 @@ getOpclasses(Archive *fout)
6512
6543
OpclassInfo *opcinfo;
6513
6544
int i_tableoid;
6514
6545
int i_oid;
6546
+ int i_opcmethod;
6515
6547
int i_opcname;
6516
6548
int i_opcnamespace;
6517
6549
int i_opcowner;
@@ -6521,7 +6553,7 @@ getOpclasses(Archive *fout)
6521
6553
* system-defined opclasses at dump-out time.
6522
6554
*/
6523
6555
6524
- appendPQExpBufferStr(query, "SELECT tableoid, oid, opcname, "
6556
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, opcmethod, opcname, "
6525
6557
"opcnamespace, "
6526
6558
"opcowner "
6527
6559
"FROM pg_opclass");
@@ -6534,6 +6566,7 @@ getOpclasses(Archive *fout)
6534
6566
6535
6567
i_tableoid = PQfnumber(res, "tableoid");
6536
6568
i_oid = PQfnumber(res, "oid");
6569
+ i_opcmethod = PQfnumber(res, "opcmethod");
6537
6570
i_opcname = PQfnumber(res, "opcname");
6538
6571
i_opcnamespace = PQfnumber(res, "opcnamespace");
6539
6572
i_opcowner = PQfnumber(res, "opcowner");
@@ -6547,6 +6580,7 @@ getOpclasses(Archive *fout)
6547
6580
opcinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opcname));
6548
6581
opcinfo[i].dobj.namespace =
6549
6582
findNamespace(atooid(PQgetvalue(res, i, i_opcnamespace)));
6583
+ opcinfo[i].opcmethod = atooid(PQgetvalue(res, i, i_opcmethod));
6550
6584
opcinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opcowner));
6551
6585
6552
6586
/* Decide whether we want to dump it */
@@ -6572,6 +6606,7 @@ getOpfamilies(Archive *fout)
6572
6606
OpfamilyInfo *opfinfo;
6573
6607
int i_tableoid;
6574
6608
int i_oid;
6609
+ int i_opfmethod;
6575
6610
int i_opfname;
6576
6611
int i_opfnamespace;
6577
6612
int i_opfowner;
@@ -6583,7 +6618,7 @@ getOpfamilies(Archive *fout)
6583
6618
* system-defined opfamilies at dump-out time.
6584
6619
*/
6585
6620
6586
- appendPQExpBufferStr(query, "SELECT tableoid, oid, opfname, "
6621
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, opfmethod, opfname, "
6587
6622
"opfnamespace, "
6588
6623
"opfowner "
6589
6624
"FROM pg_opfamily");
@@ -6597,6 +6632,7 @@ getOpfamilies(Archive *fout)
6597
6632
i_tableoid = PQfnumber(res, "tableoid");
6598
6633
i_oid = PQfnumber(res, "oid");
6599
6634
i_opfname = PQfnumber(res, "opfname");
6635
+ i_opfmethod = PQfnumber(res, "opfmethod");
6600
6636
i_opfnamespace = PQfnumber(res, "opfnamespace");
6601
6637
i_opfowner = PQfnumber(res, "opfowner");
6602
6638
@@ -6609,6 +6645,7 @@ getOpfamilies(Archive *fout)
6609
6645
opfinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opfname));
6610
6646
opfinfo[i].dobj.namespace =
6611
6647
findNamespace(atooid(PQgetvalue(res, i, i_opfnamespace)));
6648
+ opfinfo[i].opfmethod = atooid(PQgetvalue(res, i, i_opfmethod));
6612
6649
opfinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opfowner));
6613
6650
6614
6651
/* Decide whether we want to dump it */
0 commit comments