@@ -1970,6 +1970,13 @@ selectDumpableProcLang(ProcLangInfo *plang, Archive *fout)
1970
1970
static void
1971
1971
selectDumpableAccessMethod(AccessMethodInfo *method, Archive *fout)
1972
1972
{
1973
+ /* see getAccessMethods() comment about v9.6. */
1974
+ if (fout->remoteVersion < 90600)
1975
+ {
1976
+ method->dobj.dump = DUMP_COMPONENT_NONE;
1977
+ return;
1978
+ }
1979
+
1973
1980
if (checkExtensionMembership(&method->dobj, fout))
1974
1981
return; /* extension membership overrides all else */
1975
1982
@@ -5643,6 +5650,8 @@ getOperators(Archive *fout, int *numOprs)
5643
5650
int i_oprnamespace;
5644
5651
int i_oprowner;
5645
5652
int i_oprkind;
5653
+ int i_oprleft;
5654
+ int i_oprright;
5646
5655
int i_oprcode;
5647
5656
5648
5657
/*
@@ -5654,6 +5663,8 @@ getOperators(Archive *fout, int *numOprs)
5654
5663
"oprnamespace, "
5655
5664
"oprowner, "
5656
5665
"oprkind, "
5666
+ "oprleft, "
5667
+ "oprright, "
5657
5668
"oprcode::oid AS oprcode "
5658
5669
"FROM pg_operator");
5659
5670
@@ -5670,6 +5681,8 @@ getOperators(Archive *fout, int *numOprs)
5670
5681
i_oprnamespace = PQfnumber(res, "oprnamespace");
5671
5682
i_oprowner = PQfnumber(res, "oprowner");
5672
5683
i_oprkind = PQfnumber(res, "oprkind");
5684
+ i_oprleft = PQfnumber(res, "oprleft");
5685
+ i_oprright = PQfnumber(res, "oprright");
5673
5686
i_oprcode = PQfnumber(res, "oprcode");
5674
5687
5675
5688
for (i = 0; i < ntups; i++)
@@ -5683,6 +5696,8 @@ getOperators(Archive *fout, int *numOprs)
5683
5696
findNamespace(atooid(PQgetvalue(res, i, i_oprnamespace)));
5684
5697
oprinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_oprowner));
5685
5698
oprinfo[i].oprkind = (PQgetvalue(res, i, i_oprkind))[0];
5699
+ oprinfo[i].oprleft = atooid(PQgetvalue(res, i, i_oprleft));
5700
+ oprinfo[i].oprright = atooid(PQgetvalue(res, i, i_oprright));
5686
5701
oprinfo[i].oprcode = atooid(PQgetvalue(res, i, i_oprcode));
5687
5702
5688
5703
/* Decide whether we want to dump it */
@@ -5716,6 +5731,7 @@ getCollations(Archive *fout, int *numCollations)
5716
5731
int i_collname;
5717
5732
int i_collnamespace;
5718
5733
int i_collowner;
5734
+ int i_collencoding;
5719
5735
5720
5736
query = createPQExpBuffer();
5721
5737
@@ -5726,7 +5742,8 @@ getCollations(Archive *fout, int *numCollations)
5726
5742
5727
5743
appendPQExpBufferStr(query, "SELECT tableoid, oid, collname, "
5728
5744
"collnamespace, "
5729
- "collowner "
5745
+ "collowner, "
5746
+ "collencoding "
5730
5747
"FROM pg_collation");
5731
5748
5732
5749
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
@@ -5741,6 +5758,7 @@ getCollations(Archive *fout, int *numCollations)
5741
5758
i_collname = PQfnumber(res, "collname");
5742
5759
i_collnamespace = PQfnumber(res, "collnamespace");
5743
5760
i_collowner = PQfnumber(res, "collowner");
5761
+ i_collencoding = PQfnumber(res, "collencoding");
5744
5762
5745
5763
for (i = 0; i < ntups; i++)
5746
5764
{
@@ -5752,6 +5770,7 @@ getCollations(Archive *fout, int *numCollations)
5752
5770
collinfo[i].dobj.namespace =
5753
5771
findNamespace(atooid(PQgetvalue(res, i, i_collnamespace)));
5754
5772
collinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_collowner));
5773
+ collinfo[i].collencoding = atoi(PQgetvalue(res, i, i_collencoding));
5755
5774
5756
5775
/* Decide whether we want to dump it */
5757
5776
selectDumpableObject(&(collinfo[i].dobj), fout);
@@ -5853,19 +5872,28 @@ getAccessMethods(Archive *fout, int *numAccessMethods)
5853
5872
int i_amhandler;
5854
5873
int i_amtype;
5855
5874
5856
- /* Before 9.6, there are no user-defined access methods */
5857
- if (fout->remoteVersion < 90600)
5858
- {
5859
- *numAccessMethods = 0;
5860
- return NULL;
5861
- }
5862
-
5863
5875
query = createPQExpBuffer();
5864
5876
5865
- /* Select all access methods from pg_am table */
5866
- appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, amtype, "
5867
- "amhandler::pg_catalog.regproc AS amhandler "
5868
- "FROM pg_am");
5877
+ /*
5878
+ * Select all access methods from pg_am table. v9.6 introduced CREATE
5879
+ * ACCESS METHOD, so earlier versions usually have only built-in access
5880
+ * methods. v9.6 also changed the access method API, replacing dozens of
5881
+ * pg_am columns with amhandler. Even if a user created an access method
5882
+ * by "INSERT INTO pg_am", we have no way to translate pre-v9.6 pg_am
5883
+ * columns to a v9.6+ CREATE ACCESS METHOD. Hence, before v9.6, read
5884
+ * pg_am just to facilitate findAccessMethodByOid() providing the
5885
+ * OID-to-name mapping.
5886
+ */
5887
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, ");
5888
+ if (fout->remoteVersion >= 90600)
5889
+ appendPQExpBufferStr(query,
5890
+ "amtype, "
5891
+ "amhandler::pg_catalog.regproc AS amhandler ");
5892
+ else
5893
+ appendPQExpBufferStr(query,
5894
+ "'i'::pg_catalog.\"char\" AS amtype, "
5895
+ "'-'::pg_catalog.regproc AS amhandler ");
5896
+ appendPQExpBufferStr(query, "FROM pg_am");
5869
5897
5870
5898
res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK);
5871
5899
@@ -5920,6 +5948,7 @@ getOpclasses(Archive *fout, int *numOpclasses)
5920
5948
OpclassInfo *opcinfo;
5921
5949
int i_tableoid;
5922
5950
int i_oid;
5951
+ int i_opcmethod;
5923
5952
int i_opcname;
5924
5953
int i_opcnamespace;
5925
5954
int i_opcowner;
@@ -5929,7 +5958,7 @@ getOpclasses(Archive *fout, int *numOpclasses)
5929
5958
* system-defined opclasses at dump-out time.
5930
5959
*/
5931
5960
5932
- appendPQExpBufferStr(query, "SELECT tableoid, oid, opcname, "
5961
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, opcmethod, opcname, "
5933
5962
"opcnamespace, "
5934
5963
"opcowner "
5935
5964
"FROM pg_opclass");
@@ -5943,6 +5972,7 @@ getOpclasses(Archive *fout, int *numOpclasses)
5943
5972
5944
5973
i_tableoid = PQfnumber(res, "tableoid");
5945
5974
i_oid = PQfnumber(res, "oid");
5975
+ i_opcmethod = PQfnumber(res, "opcmethod");
5946
5976
i_opcname = PQfnumber(res, "opcname");
5947
5977
i_opcnamespace = PQfnumber(res, "opcnamespace");
5948
5978
i_opcowner = PQfnumber(res, "opcowner");
@@ -5956,6 +5986,7 @@ getOpclasses(Archive *fout, int *numOpclasses)
5956
5986
opcinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opcname));
5957
5987
opcinfo[i].dobj.namespace =
5958
5988
findNamespace(atooid(PQgetvalue(res, i, i_opcnamespace)));
5989
+ opcinfo[i].opcmethod = atooid(PQgetvalue(res, i, i_opcmethod));
5959
5990
opcinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opcowner));
5960
5991
5961
5992
/* Decide whether we want to dump it */
@@ -5986,6 +6017,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies)
5986
6017
OpfamilyInfo *opfinfo;
5987
6018
int i_tableoid;
5988
6019
int i_oid;
6020
+ int i_opfmethod;
5989
6021
int i_opfname;
5990
6022
int i_opfnamespace;
5991
6023
int i_opfowner;
@@ -5997,7 +6029,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies)
5997
6029
* system-defined opfamilies at dump-out time.
5998
6030
*/
5999
6031
6000
- appendPQExpBufferStr(query, "SELECT tableoid, oid, opfname, "
6032
+ appendPQExpBufferStr(query, "SELECT tableoid, oid, opfmethod, opfname, "
6001
6033
"opfnamespace, "
6002
6034
"opfowner "
6003
6035
"FROM pg_opfamily");
@@ -6012,6 +6044,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies)
6012
6044
i_tableoid = PQfnumber(res, "tableoid");
6013
6045
i_oid = PQfnumber(res, "oid");
6014
6046
i_opfname = PQfnumber(res, "opfname");
6047
+ i_opfmethod = PQfnumber(res, "opfmethod");
6015
6048
i_opfnamespace = PQfnumber(res, "opfnamespace");
6016
6049
i_opfowner = PQfnumber(res, "opfowner");
6017
6050
@@ -6024,6 +6057,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies)
6024
6057
opfinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opfname));
6025
6058
opfinfo[i].dobj.namespace =
6026
6059
findNamespace(atooid(PQgetvalue(res, i, i_opfnamespace)));
6060
+ opfinfo[i].opfmethod = atooid(PQgetvalue(res, i, i_opfmethod));
6027
6061
opfinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opfowner));
6028
6062
6029
6063
/* Decide whether we want to dump it */
0 commit comments