@@ -2169,6 +2169,13 @@ selectDumpableProcLang(ProcLangInfo *plang, Archive *fout)
2169
2169
static void
2170
2170
selectDumpableAccessMethod(AccessMethodInfo *method, Archive *fout)
2171
2171
{
2172
+ /* see getAccessMethods() comment about v9.6. */
2173
+ if (fout->remoteVersion < 90600)
2174
+ {
2175
+ method->dobj.dump = DUMP_COMPONENT_NONE;
2176
+ return;
2177
+ }
2178
+
2172
2179
if (checkExtensionMembership(&method->dobj, fout))
2173
2180
return; /* extension membership overrides all else */
2174
2181
@@ -6183,6 +6190,8 @@ getOperators(Archive *fout)
6183
6190
int i_oprnamespace;
6184
6191
int i_oprowner;
6185
6192
int i_oprkind;
6193
+ int i_oprleft;
6194
+ int i_oprright;
6186
6195
int i_oprcode;
6187
6196
6188
6197
/*
@@ -6194,6 +6203,8 @@ getOperators(Archive *fout)
6194
6203
"oprnamespace, "
6195
6204
"oprowner, "
6196
6205
"oprkind, "
6206
+ "oprleft, "
6207
+ "oprright, "
6197
6208
"oprcode::oid AS oprcode "
6198
6209
"FROM pg_operator");
6199
6210
@@ -6209,6 +6220,8 @@ getOperators(Archive *fout)
6209
6220
i_oprnamespace = PQfnumber(res, "oprnamespace");
6210
6221
i_oprowner = PQfnumber(res, "oprowner");
6211
6222
i_oprkind = PQfnumber(res, "oprkind");
6223
+ i_oprleft = PQfnumber(res, "oprleft");
6224
+ i_oprright = PQfnumber(res, "oprright");
6212
6225
i_oprcode = PQfnumber(res, "oprcode");
6213
6226
6214
6227
for (i = 0; i < ntups; i++)
@@ -6222,6 +6235,8 @@ getOperators(Archive *fout)
6222
6235
findNamespace(atooid(PQgetvalue(res, i, i_oprnamespace)));
6223
6236
oprinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_oprowner));
6224
6237
oprinfo[i].oprkind = (PQgetvalue(res, i, i_oprkind))[0];
6238
+ oprinfo[i].oprleft = atooid(PQgetvalue(res, i, i_oprleft));
6239
+ oprinfo[i].oprright = atooid(PQgetvalue(res, i, i_oprright));
6225
6240
oprinfo[i].oprcode = atooid(PQgetvalue(res, i, i_oprcode));
6226
6241
6227
6242
/* Decide whether we want to dump it */
@@ -6250,6 +6265,7 @@ getCollations(Archive *fout)
6250
6265
int i_collname;
6251
6266
int i_collnamespace;
6252
6267
int i_collowner;
6268
+ int i_collencoding;
6253
6269
6254
6270
query = createPQExpBuffer();
6255
6271
@@ -6260,7 +6276,8 @@ getCollations(Archive *fout)
6260
6276
6261
6277
appendPQExpBufferStr(query, "SELECT tableoid, oid, collname, "
6262
6278
"collnamespace, "
6263
- "collowner "
6279
+ "collowner, "
6280
+ "collencoding "
6264
6281
"FROM pg_collation");
6265
6282
6266
6283
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@@ -6274,6 +6291,7 @@ getCollations(Archive *fout)
6274
6291
i_collname = PQfnumber(res, "collname");
6275
6292
i_collnamespace = PQfnumber(res, "collnamespace");
6276
6293
i_collowner = PQfnumber(res, "collowner");
6294
+ i_collencoding = PQfnumber(res, "collencoding");
6277
6295
6278
6296
for (i = 0; i < ntups; i++)
6279
6297
{
@@ -6285,6 +6303,7 @@ getCollations(Archive *fout)
6285
6303
collinfo[i].dobj.namespace =
6286
6304
findNamespace(atooid(PQgetvalue(res, i, i_collnamespace)));
6287
6305
collinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_collowner));
6306
+ collinfo[i].collencoding = atoi(PQgetvalue(res, i, i_collencoding));
6288
6307
6289
6308
/* Decide whether we want to dump it */
6290
6309
selectDumpableObject(&(collinfo[i].dobj), fout);
@@ -6375,16 +6394,28 @@ getAccessMethods(Archive *fout)
6375
6394
int i_amhandler;
6376
6395
int i_amtype;
6377
6396
6378
- /* Before 9.6, there are no user-defined access methods */
6379
- if (fout->remoteVersion < 90600)
6380
- return;
6381
-
6382
6397
query = createPQExpBuffer();
6383
6398
6384
- /* Select all access methods from pg_am table */
6385
- appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, amtype, "
6386
- "amhandler::pg_catalog.regproc AS amhandler "
6387
- "FROM pg_am");
6399
+ /*
6400
+ * Select all access methods from pg_am table. v9.6 introduced CREATE
6401
+ * ACCESS METHOD, so earlier versions usually have only built-in access
6402
+ * methods. v9.6 also changed the access method API, replacing dozens of
6403
+ * pg_am columns with amhandler. Even if a user created an access method
6404
+ * by "INSERT INTO pg_am", we have no way to translate pre-v9.6 pg_am
6405
+ * columns to a v9.6+ CREATE ACCESS METHOD. Hence, before v9.6, read
6406
+ * pg_am just to facilitate findAccessMethodByOid() providing the
6407
+ * OID-to-name mapping.
6408
+ */
6409
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, ");
6410
+ if (fout->remoteVersion >= 90600)
6411
+ appendPQExpBufferStr(query,
6412
+ "amtype, "
6413
+ "amhandler::pg_catalog.regproc AS amhandler ");
6414
+ else
6415
+ appendPQExpBufferStr(query,
6416
+ "'i'::pg_catalog.\"char\" AS amtype, "
6417
+ "'-'::pg_catalog.regproc AS amhandler ");
6418
+ appendPQExpBufferStr(query, "FROM pg_am");
6388
6419
6389
6420
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
6390
6421
@@ -6433,6 +6464,7 @@ getOpclasses(Archive *fout)
6433
6464
OpclassInfo *opcinfo;
6434
6465
int i_tableoid;
6435
6466
int i_oid;
6467
+ int i_opcmethod;
6436
6468
int i_opcname;
6437
6469
int i_opcnamespace;
6438
6470
int i_opcowner;
@@ -6442,7 +6474,7 @@ getOpclasses(Archive *fout)
6442
6474
* system-defined opclasses at dump-out time.
6443
6475
*/
6444
6476
6445
- appendPQExpBufferStr(query, "SELECT tableoid, oid, opcname, "
6477
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, opcmethod, opcname, "
6446
6478
"opcnamespace, "
6447
6479
"opcowner "
6448
6480
"FROM pg_opclass");
@@ -6455,6 +6487,7 @@ getOpclasses(Archive *fout)
6455
6487
6456
6488
i_tableoid = PQfnumber(res, "tableoid");
6457
6489
i_oid = PQfnumber(res, "oid");
6490
+ i_opcmethod = PQfnumber(res, "opcmethod");
6458
6491
i_opcname = PQfnumber(res, "opcname");
6459
6492
i_opcnamespace = PQfnumber(res, "opcnamespace");
6460
6493
i_opcowner = PQfnumber(res, "opcowner");
@@ -6468,6 +6501,7 @@ getOpclasses(Archive *fout)
6468
6501
opcinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opcname));
6469
6502
opcinfo[i].dobj.namespace =
6470
6503
findNamespace(atooid(PQgetvalue(res, i, i_opcnamespace)));
6504
+ opcinfo[i].opcmethod = atooid(PQgetvalue(res, i, i_opcmethod));
6471
6505
opcinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opcowner));
6472
6506
6473
6507
/* Decide whether we want to dump it */
@@ -6493,6 +6527,7 @@ getOpfamilies(Archive *fout)
6493
6527
OpfamilyInfo *opfinfo;
6494
6528
int i_tableoid;
6495
6529
int i_oid;
6530
+ int i_opfmethod;
6496
6531
int i_opfname;
6497
6532
int i_opfnamespace;
6498
6533
int i_opfowner;
@@ -6504,7 +6539,7 @@ getOpfamilies(Archive *fout)
6504
6539
* system-defined opfamilies at dump-out time.
6505
6540
*/
6506
6541
6507
- appendPQExpBufferStr(query, "SELECT tableoid, oid, opfname, "
6542
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, opfmethod, opfname, "
6508
6543
"opfnamespace, "
6509
6544
"opfowner "
6510
6545
"FROM pg_opfamily");
@@ -6518,6 +6553,7 @@ getOpfamilies(Archive *fout)
6518
6553
i_tableoid = PQfnumber(res, "tableoid");
6519
6554
i_oid = PQfnumber(res, "oid");
6520
6555
i_opfname = PQfnumber(res, "opfname");
6556
+ i_opfmethod = PQfnumber(res, "opfmethod");
6521
6557
i_opfnamespace = PQfnumber(res, "opfnamespace");
6522
6558
i_opfowner = PQfnumber(res, "opfowner");
6523
6559
@@ -6530,6 +6566,7 @@ getOpfamilies(Archive *fout)
6530
6566
opfinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opfname));
6531
6567
opfinfo[i].dobj.namespace =
6532
6568
findNamespace(atooid(PQgetvalue(res, i, i_opfnamespace)));
6569
+ opfinfo[i].opfmethod = atooid(PQgetvalue(res, i, i_opfmethod));
6533
6570
opfinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opfowner));
6534
6571
6535
6572
/* Decide whether we want to dump it */
0 commit comments