@@ -1874,6 +1874,13 @@ selectDumpableProcLang(ProcLangInfo *plang, Archive *fout)
1874
1874
static void
1875
1875
selectDumpableAccessMethod(AccessMethodInfo *method, Archive *fout)
1876
1876
{
1877
+ /* see getAccessMethods() comment about v9.6. */
1878
+ if (fout->remoteVersion < 90600)
1879
+ {
1880
+ method->dobj.dump = DUMP_COMPONENT_NONE;
1881
+ return;
1882
+ }
1883
+
1877
1884
if (checkExtensionMembership(&method->dobj, fout))
1878
1885
return; /* extension membership overrides all else */
1879
1886
@@ -5496,6 +5503,8 @@ getOperators(Archive *fout, int *numOprs)
5496
5503
int i_oprnamespace;
5497
5504
int i_oprowner;
5498
5505
int i_oprkind;
5506
+ int i_oprleft;
5507
+ int i_oprright;
5499
5508
int i_oprcode;
5500
5509
5501
5510
/*
@@ -5507,6 +5516,8 @@ getOperators(Archive *fout, int *numOprs)
5507
5516
"oprnamespace, "
5508
5517
"oprowner, "
5509
5518
"oprkind, "
5519
+ "oprleft, "
5520
+ "oprright, "
5510
5521
"oprcode::oid AS oprcode "
5511
5522
"FROM pg_operator");
5512
5523
@@ -5523,6 +5534,8 @@ getOperators(Archive *fout, int *numOprs)
5523
5534
i_oprnamespace = PQfnumber(res, "oprnamespace");
5524
5535
i_oprowner = PQfnumber(res, "oprowner");
5525
5536
i_oprkind = PQfnumber(res, "oprkind");
5537
+ i_oprleft = PQfnumber(res, "oprleft");
5538
+ i_oprright = PQfnumber(res, "oprright");
5526
5539
i_oprcode = PQfnumber(res, "oprcode");
5527
5540
5528
5541
for (i = 0; i < ntups; i++)
@@ -5536,6 +5549,8 @@ getOperators(Archive *fout, int *numOprs)
5536
5549
findNamespace(atooid(PQgetvalue(res, i, i_oprnamespace)));
5537
5550
oprinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_oprowner));
5538
5551
oprinfo[i].oprkind = (PQgetvalue(res, i, i_oprkind))[0];
5552
+ oprinfo[i].oprleft = atooid(PQgetvalue(res, i, i_oprleft));
5553
+ oprinfo[i].oprright = atooid(PQgetvalue(res, i, i_oprright));
5539
5554
oprinfo[i].oprcode = atooid(PQgetvalue(res, i, i_oprcode));
5540
5555
5541
5556
/* Decide whether we want to dump it */
@@ -5569,6 +5584,7 @@ getCollations(Archive *fout, int *numCollations)
5569
5584
int i_collname;
5570
5585
int i_collnamespace;
5571
5586
int i_collowner;
5587
+ int i_collencoding;
5572
5588
5573
5589
query = createPQExpBuffer();
5574
5590
@@ -5579,7 +5595,8 @@ getCollations(Archive *fout, int *numCollations)
5579
5595
5580
5596
appendPQExpBuffer(query, "SELECT tableoid, oid, collname, "
5581
5597
"collnamespace, "
5582
- "collowner "
5598
+ "collowner, "
5599
+ "collencoding "
5583
5600
"FROM pg_collation");
5584
5601
5585
5602
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@@ -5594,6 +5611,7 @@ getCollations(Archive *fout, int *numCollations)
5594
5611
i_collname = PQfnumber(res, "collname");
5595
5612
i_collnamespace = PQfnumber(res, "collnamespace");
5596
5613
i_collowner = PQfnumber(res, "collowner");
5614
+ i_collencoding = PQfnumber(res, "collencoding");
5597
5615
5598
5616
for (i = 0; i < ntups; i++)
5599
5617
{
@@ -5605,6 +5623,7 @@ getCollations(Archive *fout, int *numCollations)
5605
5623
collinfo[i].dobj.namespace =
5606
5624
findNamespace(atooid(PQgetvalue(res, i, i_collnamespace)));
5607
5625
collinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_collowner));
5626
+ collinfo[i].collencoding = atoi(PQgetvalue(res, i, i_collencoding));
5608
5627
5609
5628
/* Decide whether we want to dump it */
5610
5629
selectDumpableObject(&(collinfo[i].dobj), fout);
@@ -5706,19 +5725,28 @@ getAccessMethods(Archive *fout, int *numAccessMethods)
5706
5725
int i_amhandler;
5707
5726
int i_amtype;
5708
5727
5709
- /* Before 9.6, there are no user-defined access methods */
5710
- if (fout->remoteVersion < 90600)
5711
- {
5712
- *numAccessMethods = 0;
5713
- return NULL;
5714
- }
5715
-
5716
5728
query = createPQExpBuffer();
5717
5729
5718
- /* Select all access methods from pg_am table */
5719
- appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, amtype, "
5720
- "amhandler::pg_catalog.regproc AS amhandler "
5721
- "FROM pg_am");
5730
+ /*
5731
+ * Select all access methods from pg_am table. v9.6 introduced CREATE
5732
+ * ACCESS METHOD, so earlier versions usually have only built-in access
5733
+ * methods. v9.6 also changed the access method API, replacing dozens of
5734
+ * pg_am columns with amhandler. Even if a user created an access method
5735
+ * by "INSERT INTO pg_am", we have no way to translate pre-v9.6 pg_am
5736
+ * columns to a v9.6+ CREATE ACCESS METHOD. Hence, before v9.6, read
5737
+ * pg_am just to facilitate findAccessMethodByOid() providing the
5738
+ * OID-to-name mapping.
5739
+ */
5740
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, ");
5741
+ if (fout->remoteVersion >= 90600)
5742
+ appendPQExpBufferStr(query,
5743
+ "amtype, "
5744
+ "amhandler::pg_catalog.regproc AS amhandler ");
5745
+ else
5746
+ appendPQExpBufferStr(query,
5747
+ "'i'::pg_catalog.\"char\" AS amtype, "
5748
+ "'-'::pg_catalog.regproc AS amhandler ");
5749
+ appendPQExpBufferStr(query, "FROM pg_am");
5722
5750
5723
5751
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
5724
5752
@@ -5773,6 +5801,7 @@ getOpclasses(Archive *fout, int *numOpclasses)
5773
5801
OpclassInfo *opcinfo;
5774
5802
int i_tableoid;
5775
5803
int i_oid;
5804
+ int i_opcmethod;
5776
5805
int i_opcname;
5777
5806
int i_opcnamespace;
5778
5807
int i_opcowner;
@@ -5782,7 +5811,7 @@ getOpclasses(Archive *fout, int *numOpclasses)
5782
5811
* system-defined opclasses at dump-out time.
5783
5812
*/
5784
5813
5785
- appendPQExpBuffer(query, "SELECT tableoid, oid, opcname, "
5814
+ appendPQExpBuffer(query, "SELECT tableoid, oid, opcmethod, opcname, "
5786
5815
"opcnamespace, "
5787
5816
"opcowner "
5788
5817
"FROM pg_opclass");
@@ -5796,6 +5825,7 @@ getOpclasses(Archive *fout, int *numOpclasses)
5796
5825
5797
5826
i_tableoid = PQfnumber(res, "tableoid");
5798
5827
i_oid = PQfnumber(res, "oid");
5828
+ i_opcmethod = PQfnumber(res, "opcmethod");
5799
5829
i_opcname = PQfnumber(res, "opcname");
5800
5830
i_opcnamespace = PQfnumber(res, "opcnamespace");
5801
5831
i_opcowner = PQfnumber(res, "opcowner");
@@ -5809,6 +5839,7 @@ getOpclasses(Archive *fout, int *numOpclasses)
5809
5839
opcinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opcname));
5810
5840
opcinfo[i].dobj.namespace =
5811
5841
findNamespace(atooid(PQgetvalue(res, i, i_opcnamespace)));
5842
+ opcinfo[i].opcmethod = atooid(PQgetvalue(res, i, i_opcmethod));
5812
5843
opcinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opcowner));
5813
5844
5814
5845
/* Decide whether we want to dump it */
@@ -5839,6 +5870,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies)
5839
5870
OpfamilyInfo *opfinfo;
5840
5871
int i_tableoid;
5841
5872
int i_oid;
5873
+ int i_opfmethod;
5842
5874
int i_opfname;
5843
5875
int i_opfnamespace;
5844
5876
int i_opfowner;
@@ -5850,7 +5882,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies)
5850
5882
* system-defined opfamilies at dump-out time.
5851
5883
*/
5852
5884
5853
- appendPQExpBuffer(query, "SELECT tableoid, oid, opfname, "
5885
+ appendPQExpBuffer(query, "SELECT tableoid, oid, opfmethod, opfname, "
5854
5886
"opfnamespace, "
5855
5887
"opfowner "
5856
5888
"FROM pg_opfamily");
@@ -5865,6 +5897,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies)
5865
5897
i_tableoid = PQfnumber(res, "tableoid");
5866
5898
i_oid = PQfnumber(res, "oid");
5867
5899
i_opfname = PQfnumber(res, "opfname");
5900
+ i_opfmethod = PQfnumber(res, "opfmethod");
5868
5901
i_opfnamespace = PQfnumber(res, "opfnamespace");
5869
5902
i_opfowner = PQfnumber(res, "opfowner");
5870
5903
@@ -5877,6 +5910,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies)
5877
5910
opfinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opfname));
5878
5911
opfinfo[i].dobj.namespace =
5879
5912
findNamespace(atooid(PQgetvalue(res, i, i_opfnamespace)));
5913
+ opfinfo[i].opfmethod = atooid(PQgetvalue(res, i, i_opfmethod));
5880
5914
opfinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opfowner));
5881
5915
5882
5916
/* Decide whether we want to dump it */
0 commit comments