Code Duplication    Length = 140-142 lines in 3 locations

src/database/Postgres.php 1 location

@@ 847-988 (lines=142) @@
844
     * @param $filter The object type to restrict to ('' means no restriction)
845
     * @return A recordset
846
     */
847
    public function findObject($term, $filter)
848
    {
849
        $conf = $this->conf;
850
851
        /*about escaping:
852
         * SET standard_conforming_string is not available before 8.2
853
         * So we must use PostgreSQL specific notation :/
854
         * E'' notation is not available before 8.1
855
         * $$ is available since 8.0
856
         * Nothing specific from 7.4
857
         */
858
859
        // Escape search term for ILIKE match
860
        $this->clean($term);
861
        $this->clean($filter);
862
        $term = str_replace('_', '\_', $term);
863
        $term = str_replace('%', '\%', $term);
864
865
        // Exclude system relations if necessary
866
        if (!$conf['show_system']) {
867
            // XXX: The mention of information_schema here is in the wrong place, but
868
            // it's the quickest fix to exclude the info schema from 7.4
869
            $where     = " AND pn.nspname NOT LIKE \$_PATERN_\$pg\_%\$_PATERN_\$ AND pn.nspname != 'information_schema'";
870
            $lan_where = 'AND pl.lanispl';
871
        } else {
872
            $where     = '';
873
            $lan_where = '';
874
        }
875
876
        // Apply outer filter
877
        $sql = '';
878
        if ($filter != '') {
879
            $sql = 'SELECT * FROM (';
880
        }
881
882
        $term = "\$_PATERN_\$%{$term}%\$_PATERN_\$";
883
884
        $sql .= "
885
			SELECT 'SCHEMA' AS type, oid, NULL AS schemaname, NULL AS relname, nspname AS name
886
				FROM pg_catalog.pg_namespace pn WHERE nspname ILIKE {$term} {$where}
887
			UNION ALL
888
			SELECT CASE WHEN relkind='r' THEN 'TABLE' WHEN relkind='v' THEN 'VIEW' WHEN relkind='S' THEN 'SEQUENCE' END, pc.oid,
889
				pn.nspname, NULL, pc.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn
890
				WHERE pc.relnamespace=pn.oid AND relkind IN ('r', 'v', 'S') AND relname ILIKE {$term} {$where}
891
			UNION ALL
892
			SELECT CASE WHEN pc.relkind='r' THEN 'COLUMNTABLE' ELSE 'COLUMNVIEW' END, NULL, pn.nspname, pc.relname, pa.attname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn,
893
				pg_catalog.pg_attribute pa WHERE pc.relnamespace=pn.oid AND pc.oid=pa.attrelid
894
				AND pa.attname ILIKE {$term} AND pa.attnum > 0 AND NOT pa.attisdropped AND pc.relkind IN ('r', 'v') {$where}
895
			UNION ALL
896
			SELECT 'FUNCTION', pp.oid, pn.nspname, NULL, pp.proname || '(' || pg_catalog.oidvectortypes(pp.proargtypes) || ')' FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pn
897
				WHERE pp.pronamespace=pn.oid AND NOT pp.proisagg AND pp.proname ILIKE {$term} {$where}
898
			UNION ALL
899
			SELECT 'INDEX', NULL, pn.nspname, pc.relname, pc2.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn,
900
				pg_catalog.pg_index pi, pg_catalog.pg_class pc2 WHERE pc.relnamespace=pn.oid AND pc.oid=pi.indrelid
901
				AND pi.indexrelid=pc2.oid
902
				AND NOT EXISTS (
903
					SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c
904
					ON (d.refclassid = c.tableoid AND d.refobjid = c.oid)
905
					WHERE d.classid = pc2.tableoid AND d.objid = pc2.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p')
906
				)
907
				AND pc2.relname ILIKE {$term} {$where}
908
			UNION ALL
909
			SELECT 'CONSTRAINTTABLE', NULL, pn.nspname, pc.relname, pc2.conname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn,
910
				pg_catalog.pg_constraint pc2 WHERE pc.relnamespace=pn.oid AND pc.oid=pc2.conrelid AND pc2.conrelid != 0
911
				AND CASE WHEN pc2.contype IN ('f', 'c') THEN TRUE ELSE NOT EXISTS (
912
					SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c
913
					ON (d.refclassid = c.tableoid AND d.refobjid = c.oid)
914
					WHERE d.classid = pc2.tableoid AND d.objid = pc2.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p')
915
				) END
916
				AND pc2.conname ILIKE {$term} {$where}
917
			UNION ALL
918
			SELECT 'CONSTRAINTDOMAIN', pt.oid, pn.nspname, pt.typname, pc.conname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn,
919
				pg_catalog.pg_constraint pc WHERE pt.typnamespace=pn.oid AND pt.oid=pc.contypid AND pc.contypid != 0
920
				AND pc.conname ILIKE {$term} {$where}
921
			UNION ALL
922
			SELECT 'TRIGGER', NULL, pn.nspname, pc.relname, pt.tgname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn,
923
				pg_catalog.pg_trigger pt WHERE pc.relnamespace=pn.oid AND pc.oid=pt.tgrelid
924
					AND ( pt.tgconstraint = 0 OR NOT EXISTS
925
					(SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c
926
					ON (d.refclassid = c.tableoid AND d.refobjid = c.oid)
927
					WHERE d.classid = pt.tableoid AND d.objid = pt.oid AND d.deptype = 'i' AND c.contype = 'f'))
928
				AND pt.tgname ILIKE {$term} {$where}
929
			UNION ALL
930
			SELECT 'RULETABLE', NULL, pn.nspname AS schemaname, c.relname AS tablename, r.rulename FROM pg_catalog.pg_rewrite r
931
				JOIN pg_catalog.pg_class c ON c.oid = r.ev_class
932
				LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = c.relnamespace
933
				WHERE c.relkind='r' AND r.rulename != '_RETURN' AND r.rulename ILIKE {$term} {$where}
934
			UNION ALL
935
			SELECT 'RULEVIEW', NULL, pn.nspname AS schemaname, c.relname AS tablename, r.rulename FROM pg_catalog.pg_rewrite r
936
				JOIN pg_catalog.pg_class c ON c.oid = r.ev_class
937
				LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = c.relnamespace
938
				WHERE c.relkind='v' AND r.rulename != '_RETURN' AND r.rulename ILIKE {$term} {$where}
939
		";
940
941
        // Add advanced objects if show_advanced is set
942
        if ($conf['show_advanced']) {
943
            $sql .= "
944
				UNION ALL
945
				SELECT CASE WHEN pt.typtype='d' THEN 'DOMAIN' ELSE 'TYPE' END, pt.oid, pn.nspname, NULL,
946
					pt.typname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn
947
					WHERE pt.typnamespace=pn.oid AND typname ILIKE {$term}
948
					AND (pt.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = pt.typrelid))
949
					{$where}
950
			 	UNION ALL
951
				SELECT 'OPERATOR', po.oid, pn.nspname, NULL, po.oprname FROM pg_catalog.pg_operator po, pg_catalog.pg_namespace pn
952
					WHERE po.oprnamespace=pn.oid AND oprname ILIKE {$term} {$where}
953
				UNION ALL
954
				SELECT 'CONVERSION', pc.oid, pn.nspname, NULL, pc.conname FROM pg_catalog.pg_conversion pc,
955
					pg_catalog.pg_namespace pn WHERE pc.connamespace=pn.oid AND conname ILIKE {$term} {$where}
956
				UNION ALL
957
				SELECT 'LANGUAGE', pl.oid, NULL, NULL, pl.lanname FROM pg_catalog.pg_language pl
958
					WHERE lanname ILIKE {$term} {$lan_where}
959
				UNION ALL
960
				SELECT DISTINCT ON (p.proname) 'AGGREGATE', p.oid, pn.nspname, NULL, p.proname FROM pg_catalog.pg_proc p
961
					LEFT JOIN pg_catalog.pg_namespace pn ON p.pronamespace=pn.oid
962
					WHERE p.proisagg AND p.proname ILIKE {$term} {$where}
963
				UNION ALL
964
				SELECT DISTINCT ON (po.opcname) 'OPCLASS', po.oid, pn.nspname, NULL, po.opcname FROM pg_catalog.pg_opclass po,
965
					pg_catalog.pg_namespace pn WHERE po.opcnamespace=pn.oid
966
					AND po.opcname ILIKE {$term} {$where}
967
			";
968
        } // Otherwise just add domains
969
        else {
970
            $sql .= "
971
				UNION ALL
972
				SELECT 'DOMAIN', pt.oid, pn.nspname, NULL,
973
					pt.typname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn
974
					WHERE pt.typnamespace=pn.oid AND pt.typtype='d' AND typname ILIKE {$term}
975
					AND (pt.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = pt.typrelid))
976
					{$where}
977
			";
978
        }
979
980
        if ($filter != '') {
981
            // We use like to make RULE, CONSTRAINT and COLUMN searches work
982
            $sql .= ") AS sub WHERE type LIKE '{$filter}%' ";
983
        }
984
985
        $sql .= 'ORDER BY type, schemaname, relname, name';
986
987
        return $this->selectSet($sql);
988
    }
989
990
    /**
991
     * Returns all available variable information.

src/database/Postgres74.php 1 location

@@ 104-243 (lines=140) @@
101
         * @param $filter The object type to restrict to ('' means no restriction)
102
         * @return A recordset
103
         */
104
        public function findObject($term, $filter)
105
        {
106
            $conf = $this->conf;
107
108
            /*about escaping:
109
             * SET standard_conforming_string is not available before 8.2
110
             * So we must use PostgreSQL specific notation :/
111
             * E'' notation is not available before 8.1
112
             * $$ is available since 8.0
113
             * Nothing specific from 7.4
114
             */
115
116
            // Escape search term for ILIKE match
117
            $term = str_replace('_', '\\_', $term);
118
            $term = str_replace('%', '\\%', $term);
119
            $this->clean($term);
120
            $this->clean($filter);
121
122
            // Exclude system relations if necessary
123
            if (!$conf['show_system']) {
124
                // XXX: The mention of information_schema here is in the wrong place, but
125
                // it's the quickest fix to exclude the info schema from 7.4
126
                $where     = " AND pn.nspname NOT LIKE 'pg\\\\_%' AND pn.nspname != 'information_schema'";
127
                $lan_where = 'AND pl.lanispl';
128
            } else {
129
                $where     = '';
130
                $lan_where = '';
131
            }
132
133
            // Apply outer filter
134
            $sql = '';
135
            if ($filter != '') {
136
                $sql = 'SELECT * FROM (';
137
            }
138
139
            $sql .= "
140
			SELECT 'SCHEMA' AS type, oid, NULL AS schemaname, NULL AS relname, nspname AS name
141
				FROM pg_catalog.pg_namespace pn WHERE nspname ILIKE '%{$term}%' {$where}
142
			UNION ALL
143
			SELECT CASE WHEN relkind='r' THEN 'TABLE' WHEN relkind='v' THEN 'VIEW' WHEN relkind='S' THEN 'SEQUENCE' END, pc.oid,
144
				pn.nspname, NULL, pc.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn
145
				WHERE pc.relnamespace=pn.oid AND relkind IN ('r', 'v', 'S') AND relname ILIKE '%{$term}%' {$where}
146
			UNION ALL
147
			SELECT CASE WHEN pc.relkind='r' THEN 'COLUMNTABLE' ELSE 'COLUMNVIEW' END, NULL, pn.nspname, pc.relname, pa.attname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn,
148
				pg_catalog.pg_attribute pa WHERE pc.relnamespace=pn.oid AND pc.oid=pa.attrelid
149
				AND pa.attname ILIKE '%{$term}%' AND pa.attnum > 0 AND NOT pa.attisdropped AND pc.relkind IN ('r', 'v') {$where}
150
			UNION ALL
151
			SELECT 'FUNCTION', pp.oid, pn.nspname, NULL, pp.proname || '(' || pg_catalog.oidvectortypes(pp.proargtypes) || ')' FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pn
152
				WHERE pp.pronamespace=pn.oid AND NOT pp.proisagg AND pp.proname ILIKE '%{$term}%' {$where}
153
			UNION ALL
154
			SELECT 'INDEX', NULL, pn.nspname, pc.relname, pc2.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn,
155
				pg_catalog.pg_index pi, pg_catalog.pg_class pc2 WHERE pc.relnamespace=pn.oid AND pc.oid=pi.indrelid
156
				AND pi.indexrelid=pc2.oid
157
				AND NOT EXISTS (
158
					SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c
159
					ON (d.refclassid = c.tableoid AND d.refobjid = c.oid)
160
					WHERE d.classid = pc2.tableoid AND d.objid = pc2.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p')
161
				)
162
				AND pc2.relname ILIKE '%{$term}%' {$where}
163
			UNION ALL
164
			SELECT 'CONSTRAINTTABLE', NULL, pn.nspname, pc.relname, pc2.conname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn,
165
				pg_catalog.pg_constraint pc2 WHERE pc.relnamespace=pn.oid AND pc.oid=pc2.conrelid AND pc2.conrelid != 0
166
				AND CASE WHEN pc2.contype IN ('f', 'c') THEN TRUE ELSE NOT EXISTS (
167
					SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c
168
					ON (d.refclassid = c.tableoid AND d.refobjid = c.oid)
169
					WHERE d.classid = pc2.tableoid AND d.objid = pc2.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p')
170
				) END
171
				AND pc2.conname ILIKE '%{$term}%' {$where}
172
			UNION ALL
173
			SELECT 'CONSTRAINTDOMAIN', pt.oid, pn.nspname, pt.typname, pc.conname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn,
174
				pg_catalog.pg_constraint pc WHERE pt.typnamespace=pn.oid AND pt.oid=pc.contypid AND pc.contypid != 0
175
				AND pc.conname ILIKE '%{$term}%' {$where}
176
			UNION ALL
177
			SELECT 'TRIGGER', NULL, pn.nspname, pc.relname, pt.tgname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn,
178
				pg_catalog.pg_trigger pt WHERE pc.relnamespace=pn.oid AND pc.oid=pt.tgrelid
179
					AND ( pt.tgisconstraint = 'f' OR NOT EXISTS
180
					(SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c
181
					ON (d.refclassid = c.tableoid AND d.refobjid = c.oid)
182
					WHERE d.classid = pt.tableoid AND d.objid = pt.oid AND d.deptype = 'i' AND c.contype = 'f'))
183
				AND pt.tgname ILIKE '%{$term}%' {$where}
184
			UNION ALL
185
			SELECT 'RULETABLE', NULL, pn.nspname AS schemaname, c.relname AS tablename, r.rulename FROM pg_catalog.pg_rewrite r
186
				JOIN pg_catalog.pg_class c ON c.oid = r.ev_class
187
				LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = c.relnamespace
188
				WHERE c.relkind='r' AND r.rulename != '_RETURN' AND r.rulename ILIKE '%{$term}%' {$where}
189
			UNION ALL
190
			SELECT 'RULEVIEW', NULL, pn.nspname AS schemaname, c.relname AS tablename, r.rulename FROM pg_catalog.pg_rewrite r
191
				JOIN pg_catalog.pg_class c ON c.oid = r.ev_class
192
				LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = c.relnamespace
193
				WHERE c.relkind='v' AND r.rulename != '_RETURN' AND r.rulename ILIKE '%{$term}%' {$where}
194
		";
195
196
            // Add advanced objects if show_advanced is set
197
            if ($conf['show_advanced']) {
198
                $sql .= "
199
				UNION ALL
200
				SELECT CASE WHEN pt.typtype='d' THEN 'DOMAIN' ELSE 'TYPE' END, pt.oid, pn.nspname, NULL,
201
					pt.typname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn
202
					WHERE pt.typnamespace=pn.oid AND typname ILIKE '%{$term}%'
203
					AND (pt.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = pt.typrelid))
204
					{$where}
205
				UNION ALL
206
				SELECT 'OPERATOR', po.oid, pn.nspname, NULL, po.oprname FROM pg_catalog.pg_operator po, pg_catalog.pg_namespace pn
207
					WHERE po.oprnamespace=pn.oid AND oprname ILIKE '%{$term}%' {$where}
208
				UNION ALL
209
				SELECT 'CONVERSION', pc.oid, pn.nspname, NULL, pc.conname FROM pg_catalog.pg_conversion pc,
210
					pg_catalog.pg_namespace pn WHERE pc.connamespace=pn.oid AND conname ILIKE '%{$term}%' {$where}
211
				UNION ALL
212
				SELECT 'LANGUAGE', pl.oid, NULL, NULL, pl.lanname FROM pg_catalog.pg_language pl
213
					WHERE lanname ILIKE '%{$term}%' {$lan_where}
214
				UNION ALL
215
				SELECT DISTINCT ON (p.proname) 'AGGREGATE', p.oid, pn.nspname, NULL, p.proname FROM pg_catalog.pg_proc p
216
					LEFT JOIN pg_catalog.pg_namespace pn ON p.pronamespace=pn.oid
217
					WHERE p.proisagg AND p.proname ILIKE '%{$term}%' {$where}
218
				UNION ALL
219
				SELECT DISTINCT ON (po.opcname) 'OPCLASS', po.oid, pn.nspname, NULL, po.opcname FROM pg_catalog.pg_opclass po,
220
					pg_catalog.pg_namespace pn WHERE po.opcnamespace=pn.oid
221
					AND po.opcname ILIKE '%{$term}%' {$where}
222
			";
223
            } // Otherwise just add domains
224
            else {
225
                $sql .= "
226
				UNION ALL
227
				SELECT 'DOMAIN', pt.oid, pn.nspname, NULL,
228
					pt.typname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn
229
					WHERE pt.typnamespace=pn.oid AND pt.typtype='d' AND typname ILIKE '%{$term}%'
230
					AND (pt.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = pt.typrelid))
231
					{$where}
232
			";
233
            }
234
235
            if ($filter != '') {
236
                // We use like to make RULE, CONSTRAINT and COLUMN searches work
237
                $sql .= ") AS sub WHERE type LIKE '{$filter}%' ";
238
            }
239
240
            $sql .= 'ORDER BY type, schemaname, relname, name';
241
242
            return $this->selectSet($sql);
243
        }
244
245
        /**
246
         * Returns table locks information in the current database

src/database/Postgres84.php 1 location

@@ 68-209 (lines=142) @@
65
         * @param $filter The object type to restrict to ('' means no restriction)
66
         * @return A recordset
67
         */
68
        public function findObject($term, $filter)
69
        {
70
            $conf = $this->conf;
71
72
            /*about escaping:
73
             * SET standard_conforming_string is not available before 8.2
74
             * So we must use PostgreSQL specific notation :/
75
             * E'' notation is not available before 8.1
76
             * $$ is available since 8.0
77
             * Nothing specific from 7.4
78
             */
79
80
            // Escape search term for ILIKE match
81
            $this->clean($term);
82
            $this->clean($filter);
83
            $term = str_replace('_', '\_', $term);
84
            $term = str_replace('%', '\%', $term);
85
86
            // Exclude system relations if necessary
87
            if (!$conf['show_system']) {
88
                // XXX: The mention of information_schema here is in the wrong place, but
89
                // it's the quickest fix to exclude the info schema from 7.4
90
                $where     = " AND pn.nspname NOT LIKE \$_PATERN_\$pg\_%\$_PATERN_\$ AND pn.nspname != 'information_schema'";
91
                $lan_where = 'AND pl.lanispl';
92
            } else {
93
                $where     = '';
94
                $lan_where = '';
95
            }
96
97
            // Apply outer filter
98
            $sql = '';
99
            if ($filter != '') {
100
                $sql = 'SELECT * FROM (';
101
            }
102
103
            $term = "\$_PATERN_\$%{$term}%\$_PATERN_\$";
104
105
            $sql .= "
106
			SELECT 'SCHEMA' AS type, oid, NULL AS schemaname, NULL AS relname, nspname AS name
107
				FROM pg_catalog.pg_namespace pn WHERE nspname ILIKE {$term} {$where}
108
			UNION ALL
109
			SELECT CASE WHEN relkind='r' THEN 'TABLE' WHEN relkind='v' THEN 'VIEW' WHEN relkind='S' THEN 'SEQUENCE' END, pc.oid,
110
				pn.nspname, NULL, pc.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn
111
				WHERE pc.relnamespace=pn.oid AND relkind IN ('r', 'v', 'S') AND relname ILIKE {$term} {$where}
112
			UNION ALL
113
			SELECT CASE WHEN pc.relkind='r' THEN 'COLUMNTABLE' ELSE 'COLUMNVIEW' END, NULL, pn.nspname, pc.relname, pa.attname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn,
114
				pg_catalog.pg_attribute pa WHERE pc.relnamespace=pn.oid AND pc.oid=pa.attrelid
115
				AND pa.attname ILIKE {$term} AND pa.attnum > 0 AND NOT pa.attisdropped AND pc.relkind IN ('r', 'v') {$where}
116
			UNION ALL
117
			SELECT 'FUNCTION', pp.oid, pn.nspname, NULL, pp.proname || '(' || pg_catalog.oidvectortypes(pp.proargtypes) || ')' FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pn
118
				WHERE pp.pronamespace=pn.oid AND NOT pp.proisagg AND pp.proname ILIKE {$term} {$where}
119
			UNION ALL
120
			SELECT 'INDEX', NULL, pn.nspname, pc.relname, pc2.relname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn,
121
				pg_catalog.pg_index pi, pg_catalog.pg_class pc2 WHERE pc.relnamespace=pn.oid AND pc.oid=pi.indrelid
122
				AND pi.indexrelid=pc2.oid
123
				AND NOT EXISTS (
124
					SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c
125
					ON (d.refclassid = c.tableoid AND d.refobjid = c.oid)
126
					WHERE d.classid = pc2.tableoid AND d.objid = pc2.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p')
127
				)
128
				AND pc2.relname ILIKE {$term} {$where}
129
			UNION ALL
130
			SELECT 'CONSTRAINTTABLE', NULL, pn.nspname, pc.relname, pc2.conname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn,
131
				pg_catalog.pg_constraint pc2 WHERE pc.relnamespace=pn.oid AND pc.oid=pc2.conrelid AND pc2.conrelid != 0
132
				AND CASE WHEN pc2.contype IN ('f', 'c') THEN TRUE ELSE NOT EXISTS (
133
					SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c
134
					ON (d.refclassid = c.tableoid AND d.refobjid = c.oid)
135
					WHERE d.classid = pc2.tableoid AND d.objid = pc2.oid AND d.deptype = 'i' AND c.contype IN ('u', 'p')
136
				) END
137
				AND pc2.conname ILIKE {$term} {$where}
138
			UNION ALL
139
			SELECT 'CONSTRAINTDOMAIN', pt.oid, pn.nspname, pt.typname, pc.conname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn,
140
				pg_catalog.pg_constraint pc WHERE pt.typnamespace=pn.oid AND pt.oid=pc.contypid AND pc.contypid != 0
141
				AND pc.conname ILIKE {$term} {$where}
142
			UNION ALL
143
			SELECT 'TRIGGER', NULL, pn.nspname, pc.relname, pt.tgname FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pn,
144
				pg_catalog.pg_trigger pt WHERE pc.relnamespace=pn.oid AND pc.oid=pt.tgrelid
145
					AND ( NOT pt.tgisconstraint OR NOT EXISTS
146
					(SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c
147
					ON (d.refclassid = c.tableoid AND d.refobjid = c.oid)
148
					WHERE d.classid = pt.tableoid AND d.objid = pt.oid AND d.deptype = 'i' AND c.contype = 'f'))
149
				AND pt.tgname ILIKE {$term} {$where}
150
			UNION ALL
151
			SELECT 'RULETABLE', NULL, pn.nspname AS schemaname, c.relname AS tablename, r.rulename FROM pg_catalog.pg_rewrite r
152
				JOIN pg_catalog.pg_class c ON c.oid = r.ev_class
153
				LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = c.relnamespace
154
				WHERE c.relkind='r' AND r.rulename != '_RETURN' AND r.rulename ILIKE {$term} {$where}
155
			UNION ALL
156
			SELECT 'RULEVIEW', NULL, pn.nspname AS schemaname, c.relname AS tablename, r.rulename FROM pg_catalog.pg_rewrite r
157
				JOIN pg_catalog.pg_class c ON c.oid = r.ev_class
158
				LEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = c.relnamespace
159
				WHERE c.relkind='v' AND r.rulename != '_RETURN' AND r.rulename ILIKE {$term} {$where}
160
		";
161
162
            // Add advanced objects if show_advanced is set
163
            if ($conf['show_advanced']) {
164
                $sql .= "
165
				UNION ALL
166
				SELECT CASE WHEN pt.typtype='d' THEN 'DOMAIN' ELSE 'TYPE' END, pt.oid, pn.nspname, NULL,
167
					pt.typname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn
168
					WHERE pt.typnamespace=pn.oid AND typname ILIKE {$term}
169
					AND (pt.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = pt.typrelid))
170
					{$where}
171
			 	UNION ALL
172
				SELECT 'OPERATOR', po.oid, pn.nspname, NULL, po.oprname FROM pg_catalog.pg_operator po, pg_catalog.pg_namespace pn
173
					WHERE po.oprnamespace=pn.oid AND oprname ILIKE {$term} {$where}
174
				UNION ALL
175
				SELECT 'CONVERSION', pc.oid, pn.nspname, NULL, pc.conname FROM pg_catalog.pg_conversion pc,
176
					pg_catalog.pg_namespace pn WHERE pc.connamespace=pn.oid AND conname ILIKE {$term} {$where}
177
				UNION ALL
178
				SELECT 'LANGUAGE', pl.oid, NULL, NULL, pl.lanname FROM pg_catalog.pg_language pl
179
					WHERE lanname ILIKE {$term} {$lan_where}
180
				UNION ALL
181
				SELECT DISTINCT ON (p.proname) 'AGGREGATE', p.oid, pn.nspname, NULL, p.proname FROM pg_catalog.pg_proc p
182
					LEFT JOIN pg_catalog.pg_namespace pn ON p.pronamespace=pn.oid
183
					WHERE p.proisagg AND p.proname ILIKE {$term} {$where}
184
				UNION ALL
185
				SELECT DISTINCT ON (po.opcname) 'OPCLASS', po.oid, pn.nspname, NULL, po.opcname FROM pg_catalog.pg_opclass po,
186
					pg_catalog.pg_namespace pn WHERE po.opcnamespace=pn.oid
187
					AND po.opcname ILIKE {$term} {$where}
188
			";
189
            } // Otherwise just add domains
190
            else {
191
                $sql .= "
192
				UNION ALL
193
				SELECT 'DOMAIN', pt.oid, pn.nspname, NULL,
194
					pt.typname FROM pg_catalog.pg_type pt, pg_catalog.pg_namespace pn
195
					WHERE pt.typnamespace=pn.oid AND pt.typtype='d' AND typname ILIKE {$term}
196
					AND (pt.typrelid = 0 OR (SELECT c.relkind = 'c' FROM pg_catalog.pg_class c WHERE c.oid = pt.typrelid))
197
					{$where}
198
			";
199
            }
200
201
            if ($filter != '') {
202
                // We use like to make RULE, CONSTRAINT and COLUMN searches work
203
                $sql .= ") AS sub WHERE type LIKE '{$filter}%' ";
204
            }
205
206
            $sql .= 'ORDER BY type, schemaname, relname, name';
207
208
            return $this->selectSet($sql);
209
        }
210
211
        // Capabilities
212