22
22
*
23
23
*
24
24
* IDENTIFICATION
25
- * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.168 2000/09/18 06:47:46 pjw Exp $
25
+ * $Header: /cvsroot/pgsql/src/bin/pg_dump/pg_dump.c,v 1.169 2000/10/10 13:55:28 pjw Exp $
26
26
*
27
27
* Modifications - 6/10/96 - dave@bensoft.com - version 1.13.dhb
28
28
*
87
87
* Remove 'isViewRule' since we check the relkind when getting tables.
88
88
* Now uses temp table 'pgdump_oid' rather than 'pg_dump_oid' (errors otherwise).
89
89
*
90
+ * Modifications - 02-Oct-2000 - pjw@rhyme.com.au
91
+ *
92
+ * - Be more paranoid when getting views: call get_viewdef in separate statement
93
+ * so we can be more informative in error messages.
94
+ * - Support for 'isstrict' procedure attribute.
95
+ * - Disable --blobs and --table since (a) it's a pain to get ONLY the blobs for the
96
+ * table with the currently implementation, and (b) it's not clear how to restore
97
+ * a partial BLOB backup (given the current OID-based BLOB implementation).
98
+ *
90
99
*-------------------------------------------------------------------------
91
100
*/
92
101
@@ -702,6 +711,7 @@ main(int argc, char **argv)
702
711
case 'a' : /* Dump data only */
703
712
dataOnly = true;
704
713
break ;
714
+
705
715
case 'b' : /* Dump blobs */
706
716
outputBlobs = true;
707
717
break ;
@@ -719,48 +729,63 @@ main(int argc, char **argv)
719
729
case 'd' : /* dump data as proper insert strings */
720
730
dumpData = true;
721
731
break ;
732
+
722
733
case 'D' : /* dump data as proper insert strings with
723
734
* attr names */
724
735
dumpData = true;
725
736
attrNames = true;
726
737
break ;
738
+
727
739
case 'f' :
728
740
filename = optarg ;
729
741
break ;
742
+
730
743
case 'F' :
731
744
format = optarg ;
732
745
break ;
746
+
733
747
case 'h' : /* server host */
734
748
pghost = optarg ;
735
749
break ;
750
+
736
751
case 'i' : /* ignore database version mismatch */
737
752
ignore_version = true;
738
753
break ;
754
+
739
755
case 'n' : /* Do not force double-quotes on
740
756
* identifiers */
741
757
force_quotes = false;
742
758
break ;
759
+
743
760
case 'N' : /* Force double-quotes on identifiers */
744
761
force_quotes = true;
745
762
break ;
763
+
746
764
case 'o' : /* Dump oids */
747
765
oids = true;
748
766
break ;
767
+
768
+
749
769
case 'O' : /* Don't reconnect to match owner */
750
770
outputNoOwner = 1 ;
751
771
break ;
772
+
752
773
case 'p' : /* server port */
753
774
pgport = optarg ;
754
775
break ;
776
+
755
777
case 'R' : /* No reconnect */
756
778
outputNoReconnect = 1 ;
757
779
break ;
780
+
758
781
case 's' : /* dump schema only */
759
782
schemaOnly = true;
760
783
break ;
784
+
761
785
case 'S' : /* Username for superuser in plain text output */
762
786
outputSuperuser = strdup (optarg );
763
787
break ;
788
+
764
789
case 't' : /* Dump data for this table only */
765
790
{
766
791
int i ;
@@ -787,22 +812,28 @@ main(int argc, char **argv)
787
812
}
788
813
}
789
814
break ;
815
+
790
816
case 'u' :
791
817
use_password = true;
792
818
break ;
819
+
793
820
case 'v' : /* verbose */
794
821
g_verbose = true;
795
822
break ;
823
+
796
824
case 'x' : /* skip ACL dump */
797
825
aclsSkip = true;
798
826
break ;
827
+
799
828
case 'Z' : /* Compression Level */
800
829
compressLevel = atoi (optarg );
801
830
break ;
831
+
802
832
case 'V' :
803
833
version ();
804
834
exit (0 );
805
835
break ;
836
+
806
837
case '?' :
807
838
808
839
/*
@@ -841,6 +872,14 @@ main(int argc, char **argv)
841
872
exit (1 );
842
873
}
843
874
875
+ if (outputBlobs && (tablename != NULL ) )
876
+ {
877
+ fprintf (stderr ,
878
+ "%s: BLOB output is not supported for a single table. Use a full dump instead.\n" ,
879
+ progname );
880
+ exit (1 );
881
+ }
882
+
844
883
if (dumpData == true && oids == true)
845
884
{
846
885
fprintf (stderr ,
@@ -1713,6 +1752,7 @@ getFuncs(int *numFuncs)
1713
1752
int i_prosrc ;
1714
1753
int i_probin ;
1715
1754
int i_iscachable ;
1755
+ int i_isstrict ;
1716
1756
int i_usename ;
1717
1757
1718
1758
/* find all user-defined funcs */
@@ -1721,7 +1761,7 @@ getFuncs(int *numFuncs)
1721
1761
"SELECT pg_proc.oid, proname, prolang, pronargs, prorettype, "
1722
1762
"proretset, proargtypes, prosrc, probin, "
1723
1763
"(select usename from pg_user where proowner = usesysid) as usename, "
1724
- "proiscachable "
1764
+ "proiscachable, proisstrict "
1725
1765
"from pg_proc "
1726
1766
"where pg_proc.oid > '%u'::oid" ,
1727
1767
g_last_builtin_oid );
@@ -1753,6 +1793,7 @@ getFuncs(int *numFuncs)
1753
1793
i_prosrc = PQfnumber (res , "prosrc" );
1754
1794
i_probin = PQfnumber (res , "probin" );
1755
1795
i_iscachable = PQfnumber (res , "proiscachable" );
1796
+ i_isstrict = PQfnumber (res , "proisstrict" );
1756
1797
i_usename = PQfnumber (res , "usename" );
1757
1798
1758
1799
for (i = 0 ; i < ntups ; i ++ )
@@ -1769,6 +1810,7 @@ getFuncs(int *numFuncs)
1769
1810
finfo [i ].lang = atoi (PQgetvalue (res , i , i_prolang ));
1770
1811
finfo [i ].usename = strdup (PQgetvalue (res , i , i_usename ));
1771
1812
finfo [i ].iscachable = (strcmp (PQgetvalue (res , i , i_iscachable ),"t" ) == 0 );
1813
+ finfo [i ].isstrict = (strcmp (PQgetvalue (res , i , i_isstrict ),"t" ) == 0 );
1772
1814
1773
1815
if (strlen (finfo [i ].usename ) == 0 )
1774
1816
fprintf (stderr , "WARNING: owner of function '%s' appears to be invalid\n" ,
@@ -1819,7 +1861,6 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
1819
1861
int i_relchecks ;
1820
1862
int i_reltriggers ;
1821
1863
int i_relhasindex ;
1822
- int i_viewdef ;
1823
1864
1824
1865
char relkindview [2 ];
1825
1866
@@ -1839,9 +1880,7 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
1839
1880
appendPQExpBuffer (query ,
1840
1881
"SELECT pg_class.oid, relname, relkind, relacl, "
1841
1882
"(select usename from pg_user where relowner = usesysid) as usename, "
1842
- "relchecks, reltriggers, relhasindex, "
1843
- "Case When relkind = '%c' then pg_get_viewdef(relname) "
1844
- "Else NULL End as viewdef "
1883
+ "relchecks, reltriggers, relhasindex "
1845
1884
"from pg_class "
1846
1885
"where relname !~ '^pg_' "
1847
1886
"and relkind in ('%c', '%c', '%c') "
@@ -1872,7 +1911,6 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
1872
1911
i_relchecks = PQfnumber (res , "relchecks" );
1873
1912
i_reltriggers = PQfnumber (res , "reltriggers" );
1874
1913
i_relhasindex = PQfnumber (res , "relhasindex" );
1875
- i_viewdef = PQfnumber (res , "viewdef" );
1876
1914
1877
1915
for (i = 0 ; i < ntups ; i ++ )
1878
1916
{
@@ -1883,16 +1921,52 @@ getTables(int *numTables, FuncInfo *finfo, int numFuncs)
1883
1921
tblinfo [i ].usename = strdup (PQgetvalue (res , i , i_usename ));
1884
1922
tblinfo [i ].ncheck = atoi (PQgetvalue (res , i , i_relchecks ));
1885
1923
tblinfo [i ].ntrig = atoi (PQgetvalue (res , i , i_reltriggers ));
1886
- if (strcmp (PQgetvalue (res , i , i_relkind ), relkindview ) == 0 ) {
1887
- tblinfo [i ].viewdef = strdup (PQgetvalue (res , i , i_viewdef ));
1888
- } else {
1889
- tblinfo [i ].viewdef = NULL ;
1890
- }
1891
1924
1892
1925
if (strlen (tblinfo [i ].usename ) == 0 )
1893
1926
fprintf (stderr , "WARNING: owner of table '%s' appears to be invalid\n" ,
1894
1927
tblinfo [i ].relname );
1895
1928
1929
+ /* Get view definition */
1930
+ if (strcmp (PQgetvalue (res , i , i_relkind ), relkindview ) == 0 )
1931
+ {
1932
+ PGresult * res2 ;
1933
+
1934
+ resetPQExpBuffer (query );
1935
+ appendPQExpBuffer (query , "SELECT pg_get_viewdef('%s') as viewdef " , tblinfo [i ].relname );
1936
+ res2 = PQexec (g_conn , query -> data );
1937
+ if (!res2 || PQresultStatus (res2 ) != PGRES_TUPLES_OK )
1938
+ {
1939
+ fprintf (stderr , "getTables(): SELECT (for VIEW DEFINITION) failed. "
1940
+ "Explanation from backend: %s" ,
1941
+ PQerrorMessage (g_conn ));
1942
+ exit_nicely (g_conn );
1943
+ }
1944
+
1945
+ if (PQntuples (res2 ) != 1 )
1946
+ {
1947
+ if (PQntuples (res2 ) < 1 )
1948
+ {
1949
+ fprintf (stderr , "getTables(): SELECT (for VIEW %s) returned no definitions" ,
1950
+ tblinfo [i ].relname );
1951
+ } else {
1952
+ fprintf (stderr , "getTables(): SELECT (for VIEW %s) returned more than 1 definition" ,
1953
+ tblinfo [i ].relname );
1954
+ }
1955
+ exit_nicely (g_conn );
1956
+ }
1957
+
1958
+ tblinfo [i ].viewdef = strdup (PQgetvalue (res2 , 0 , 0 ));
1959
+
1960
+ if (strlen (tblinfo [i ].viewdef ) == 0 )
1961
+ {
1962
+ fprintf (stderr , "getTables(): SELECT (for VIEW %s) returned empty definition" ,
1963
+ tblinfo [i ].relname );
1964
+ exit_nicely (g_conn );
1965
+ }
1966
+ }
1967
+ else
1968
+ tblinfo [i ].viewdef = NULL ;
1969
+
1896
1970
/*
1897
1971
* Exclude inherited CHECKs from CHECK constraints total. If a
1898
1972
* constraint matches by name and condition with a constraint
@@ -2888,6 +2962,10 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i,
2888
2962
int i_lanname ;
2889
2963
char query [256 ];
2890
2964
2965
+ char * listSep ;
2966
+ char * listSepComma = "," ;
2967
+ char * listSepNone = "" ;
2968
+
2891
2969
if (finfo [i ].dumped )
2892
2970
return ;
2893
2971
else
@@ -2961,9 +3039,21 @@ dumpOneFunc(Archive *fout, FuncInfo *finfo, int i,
2961
3039
findTypeByOid (tinfo , numTypes , finfo [i ].prorettype , zeroAsOpaque ),
2962
3040
asPart -> data , func_lang );
2963
3041
2964
- if (finfo [i ].iscachable ) /* OR in new attrs here */
3042
+ if (finfo [i ].iscachable || finfo [ i ]. isstrict ) /* OR in new attrs here */
2965
3043
{
2966
- appendPQExpBuffer (q , " WITH (iscachable)" );
3044
+ appendPQExpBuffer (q , " WITH (" );
3045
+ listSep = listSepNone ;
3046
+
3047
+ if (finfo [i ].iscachable ) {
3048
+ appendPQExpBuffer (q , "%s iscachable" , listSep );
3049
+ listSep = listSepComma ;
3050
+ }
3051
+
3052
+ if (finfo [i ].isstrict ) {
3053
+ appendPQExpBuffer (q , "%s isstrict" , listSep );
3054
+ listSep = listSepComma ;
3055
+ }
3056
+ appendPQExpBuffer (q , " )" );
2967
3057
}
2968
3058
2969
3059
appendPQExpBuffer (q , ";\n" );
0 commit comments