@@ 1321-1342 (lines=22) @@ | ||
1318 | * |
|
1319 | * @return A recordset |
|
1320 | */ |
|
1321 | public function getTableParents($table) |
|
1322 | { |
|
1323 | $c_schema = $this->_schema; |
|
1324 | $this->clean($c_schema); |
|
1325 | $this->clean($table); |
|
1326 | ||
1327 | $sql = " |
|
1328 | SELECT |
|
1329 | pn.nspname, relname |
|
1330 | FROM |
|
1331 | pg_catalog.pg_class pc, pg_catalog.pg_inherits pi, pg_catalog.pg_namespace pn |
|
1332 | WHERE |
|
1333 | pc.oid=pi.inhparent |
|
1334 | AND pc.relnamespace=pn.oid |
|
1335 | AND pi.inhrelid = (SELECT oid from pg_catalog.pg_class WHERE relname='{$table}' |
|
1336 | AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = '{$c_schema}')) |
|
1337 | ORDER BY |
|
1338 | pi.inhseqno |
|
1339 | "; |
|
1340 | ||
1341 | return $this->selectSet($sql); |
|
1342 | } |
|
1343 | ||
1344 | /** |
|
1345 | * Finds the names and schemas of child tables. |
|
@@ 1351-1370 (lines=20) @@ | ||
1348 | * |
|
1349 | * @return A recordset |
|
1350 | */ |
|
1351 | public function getTableChildren($table) |
|
1352 | { |
|
1353 | $c_schema = $this->_schema; |
|
1354 | $this->clean($c_schema); |
|
1355 | $this->clean($table); |
|
1356 | ||
1357 | $sql = " |
|
1358 | SELECT |
|
1359 | pn.nspname, relname |
|
1360 | FROM |
|
1361 | pg_catalog.pg_class pc, pg_catalog.pg_inherits pi, pg_catalog.pg_namespace pn |
|
1362 | WHERE |
|
1363 | pc.oid=pi.inhrelid |
|
1364 | AND pc.relnamespace=pn.oid |
|
1365 | AND pi.inhparent = (SELECT oid from pg_catalog.pg_class WHERE relname='{$table}' |
|
1366 | AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname = '{$c_schema}')) |
|
1367 | "; |
|
1368 | ||
1369 | return $this->selectSet($sql); |
|
1370 | } |
|
1371 | ||
1372 | /** |
|
1373 | * Returns the SQL definition for the table. |
|
@@ 1710-1730 (lines=21) @@ | ||
1707 | * |
|
1708 | * @return A recordset |
|
1709 | */ |
|
1710 | public function getTable($table) |
|
1711 | { |
|
1712 | $c_schema = $this->_schema; |
|
1713 | $this->clean($c_schema); |
|
1714 | $this->clean($table); |
|
1715 | ||
1716 | $sql = " |
|
1717 | SELECT |
|
1718 | c.relname, n.nspname, u.usename AS relowner, |
|
1719 | pg_catalog.obj_description(c.oid, 'pg_class') AS relcomment, |
|
1720 | (SELECT spcname FROM pg_catalog.pg_tablespace pt WHERE pt.oid=c.reltablespace) AS tablespace |
|
1721 | FROM pg_catalog.pg_class c |
|
1722 | LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner |
|
1723 | LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace |
|
1724 | WHERE c.relkind = 'r' |
|
1725 | AND n.nspname = '{$c_schema}' |
|
1726 | AND n.oid = c.relnamespace |
|
1727 | AND c.relname = '{$table}'"; |
|
1728 | ||
1729 | return $this->selectSet($sql); |
|
1730 | } |
|
1731 | ||
1732 | /** |
|
1733 | * Retrieve the attribute definition of a table. |
|
@@ 1812-1850 (lines=39) @@ | ||
1809 | * |
|
1810 | * @return A recordset |
|
1811 | */ |
|
1812 | public function getConstraints($table) |
|
1813 | { |
|
1814 | $c_schema = $this->_schema; |
|
1815 | $this->clean($c_schema); |
|
1816 | $this->clean($table); |
|
1817 | ||
1818 | // This SQL is greatly complicated by the need to retrieve |
|
1819 | // index clustering information for primary and unique constraints |
|
1820 | $sql = "SELECT |
|
1821 | pc.conname, |
|
1822 | pg_catalog.pg_get_constraintdef(pc.oid, true) AS consrc, |
|
1823 | pc.contype, |
|
1824 | CASE WHEN pc.contype='u' OR pc.contype='p' THEN ( |
|
1825 | SELECT |
|
1826 | indisclustered |
|
1827 | FROM |
|
1828 | pg_catalog.pg_depend pd, |
|
1829 | pg_catalog.pg_class pl, |
|
1830 | pg_catalog.pg_index pi |
|
1831 | WHERE |
|
1832 | pd.refclassid=pc.tableoid |
|
1833 | AND pd.refobjid=pc.oid |
|
1834 | AND pd.objid=pl.oid |
|
1835 | AND pl.oid=pi.indexrelid |
|
1836 | ) ELSE |
|
1837 | NULL |
|
1838 | END AS indisclustered |
|
1839 | FROM |
|
1840 | pg_catalog.pg_constraint pc |
|
1841 | WHERE |
|
1842 | pc.conrelid = (SELECT oid FROM pg_catalog.pg_class WHERE relname='{$table}' |
|
1843 | AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace |
|
1844 | WHERE nspname='{$c_schema}')) |
|
1845 | ORDER BY |
|
1846 | 1 |
|
1847 | "; |
|
1848 | ||
1849 | return $this->selectSet($sql); |
|
1850 | } |
|
1851 | ||
1852 | /** |
|
1853 | * Returns the SQL for changing the current user. |
|
@@ 2343-2365 (lines=23) @@ | ||
2340 | * |
|
2341 | * @return \PHPPgAdmin\Database\A recordset |
|
2342 | */ |
|
2343 | public function getTriggers($table = '') |
|
2344 | { |
|
2345 | $c_schema = $this->_schema; |
|
2346 | $this->clean($c_schema); |
|
2347 | $this->clean($table); |
|
2348 | ||
2349 | $sql = "SELECT |
|
2350 | t.tgname, pg_catalog.pg_get_triggerdef(t.oid) AS tgdef, |
|
2351 | CASE WHEN t.tgenabled = 'D' THEN FALSE ELSE TRUE END AS tgenabled, p.oid AS prooid, |
|
2352 | p.proname || ' (' || pg_catalog.oidvectortypes(p.proargtypes) || ')' AS proproto, |
|
2353 | ns.nspname AS pronamespace |
|
2354 | FROM pg_catalog.pg_trigger t, pg_catalog.pg_proc p, pg_catalog.pg_namespace ns |
|
2355 | WHERE t.tgrelid = (SELECT oid FROM pg_catalog.pg_class WHERE relname='{$table}' |
|
2356 | AND relnamespace=(SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='{$c_schema}')) |
|
2357 | AND ( tgconstraint = 0 OR NOT EXISTS |
|
2358 | (SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c |
|
2359 | ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) |
|
2360 | WHERE d.classid = t.tableoid AND d.objid = t.oid AND d.deptype = 'i' AND c.contype = 'f')) |
|
2361 | AND p.oid=t.tgfoid |
|
2362 | AND p.pronamespace = ns.oid"; |
|
2363 | ||
2364 | return $this->selectSet($sql); |
|
2365 | } |
|
2366 | ||
2367 | /** |
|
2368 | * Returns a list of all rules on a table OR view. |
|
@@ 2374-2389 (lines=16) @@ | ||
2371 | * |
|
2372 | * @return A recordset |
|
2373 | */ |
|
2374 | public function getRules($table) |
|
2375 | { |
|
2376 | $c_schema = $this->_schema; |
|
2377 | $this->clean($c_schema); |
|
2378 | $this->clean($table); |
|
2379 | ||
2380 | $sql = " |
|
2381 | SELECT * |
|
2382 | FROM pg_catalog.pg_rules |
|
2383 | WHERE |
|
2384 | schemaname='{$c_schema}' AND tablename='{$table}' |
|
2385 | ORDER BY rulename |
|
2386 | "; |
|
2387 | ||
2388 | return $this->selectSet($sql); |
|
2389 | } |
|
2390 | ||
2391 | /** |
|
2392 | * Creates a new table in the database. |
|
@@ 4477-4495 (lines=19) @@ | ||
4474 | * |
|
4475 | * @return true if the table has been already clustered |
|
4476 | */ |
|
4477 | public function alreadyClustered($table) |
|
4478 | { |
|
4479 | $c_schema = $this->_schema; |
|
4480 | $this->clean($c_schema); |
|
4481 | $this->clean($table); |
|
4482 | ||
4483 | $sql = "SELECT i.indisclustered |
|
4484 | FROM pg_catalog.pg_class c, pg_catalog.pg_index i |
|
4485 | WHERE c.relname = '{$table}' |
|
4486 | AND c.oid = i.indrelid AND i.indisclustered |
|
4487 | AND c.relnamespace = (SELECT oid FROM pg_catalog.pg_namespace |
|
4488 | WHERE nspname='{$c_schema}') |
|
4489 | "; |
|
4490 | ||
4491 | $v = $this->selectSet($sql); |
|
4492 | ||
4493 | return !($v->recordCount() == 0); |
|
4494 | } |
|
4495 | ||
4496 | /** |
|
4497 | * Creates an index. |
|
4498 | * |
|
@@ 5072-5105 (lines=34) @@ | ||
5069 | * |
|
5070 | * @return A recordset |
|
5071 | */ |
|
5072 | public function getReferrers($table) |
|
5073 | { |
|
5074 | $this->clean($table); |
|
5075 | ||
5076 | $status = $this->beginTransaction(); |
|
5077 | if ($status != 0) { |
|
5078 | return -1; |
|
5079 | } |
|
5080 | ||
5081 | $c_schema = $this->_schema; |
|
5082 | $this->clean($c_schema); |
|
5083 | ||
5084 | $sql = " |
|
5085 | SELECT |
|
5086 | pn.nspname, |
|
5087 | pl.relname, |
|
5088 | pc.conname, |
|
5089 | pg_catalog.pg_get_constraintdef(pc.oid) AS consrc |
|
5090 | FROM |
|
5091 | pg_catalog.pg_constraint pc, |
|
5092 | pg_catalog.pg_namespace pn, |
|
5093 | pg_catalog.pg_class pl |
|
5094 | WHERE |
|
5095 | pc.connamespace = pn.oid |
|
5096 | AND pc.conrelid = pl.oid |
|
5097 | AND pc.contype = 'f' |
|
5098 | AND confrelid = (SELECT oid FROM pg_catalog.pg_class WHERE relname='{$table}' |
|
5099 | AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace |
|
5100 | WHERE nspname='{$c_schema}')) |
|
5101 | ORDER BY 1,2,3 |
|
5102 | "; |
|
5103 | ||
5104 | return $this->selectSet($sql); |
|
5105 | } |
|
5106 | ||
5107 | // Type functions |
|
5108 | ||
@@ 6266-6281 (lines=16) @@ | ||
6263 | * |
|
6264 | * @return A recordset |
|
6265 | */ |
|
6266 | public function getTrigger($table, $trigger) |
|
6267 | { |
|
6268 | $c_schema = $this->_schema; |
|
6269 | $this->clean($c_schema); |
|
6270 | $this->clean($table); |
|
6271 | $this->clean($trigger); |
|
6272 | ||
6273 | $sql = " |
|
6274 | SELECT * FROM pg_catalog.pg_trigger t, pg_catalog.pg_class c |
|
6275 | WHERE t.tgrelid=c.oid AND c.relname='{$table}' AND t.tgname='{$trigger}' |
|
6276 | AND c.relnamespace=( |
|
6277 | SELECT oid FROM pg_catalog.pg_namespace |
|
6278 | WHERE nspname='{$c_schema}')"; |
|
6279 | ||
6280 | return $this->selectSet($sql); |
|
6281 | } |
|
6282 | ||
6283 | /** |
|
6284 | * A helper function for getTriggers that translates |
|
@@ 9569-9579 (lines=11) @@ | ||
9566 | * |
|
9567 | * @return A recordset |
|
9568 | */ |
|
9569 | public function getStatsTableTuples($table) |
|
9570 | { |
|
9571 | $c_schema = $this->_schema; |
|
9572 | $this->clean($c_schema); |
|
9573 | $this->clean($table); |
|
9574 | ||
9575 | $sql = "SELECT * FROM pg_stat_all_tables |
|
9576 | WHERE schemaname='{$c_schema}' AND relname='{$table}'"; |
|
9577 | ||
9578 | return $this->selectSet($sql); |
|
9579 | } |
|
9580 | ||
9581 | /** |
|
9582 | * Fetches I/0 statistics for a table. |
|
@@ 9588-9598 (lines=11) @@ | ||
9585 | * |
|
9586 | * @return A recordset |
|
9587 | */ |
|
9588 | public function getStatsTableIO($table) |
|
9589 | { |
|
9590 | $c_schema = $this->_schema; |
|
9591 | $this->clean($c_schema); |
|
9592 | $this->clean($table); |
|
9593 | ||
9594 | $sql = "SELECT * FROM pg_statio_all_tables |
|
9595 | WHERE schemaname='{$c_schema}' AND relname='{$table}'"; |
|
9596 | ||
9597 | return $this->selectSet($sql); |
|
9598 | } |
|
9599 | ||
9600 | /** |
|
9601 | * Fetches tuple statistics for all indexes on a table. |
|
@@ 9607-9617 (lines=11) @@ | ||
9604 | * |
|
9605 | * @return A recordset |
|
9606 | */ |
|
9607 | public function getStatsIndexTuples($table) |
|
9608 | { |
|
9609 | $c_schema = $this->_schema; |
|
9610 | $this->clean($c_schema); |
|
9611 | $this->clean($table); |
|
9612 | ||
9613 | $sql = "SELECT * FROM pg_stat_all_indexes |
|
9614 | WHERE schemaname='{$c_schema}' AND relname='{$table}' ORDER BY indexrelname"; |
|
9615 | ||
9616 | return $this->selectSet($sql); |
|
9617 | } |
|
9618 | ||
9619 | /** |
|
9620 | * Fetches I/0 statistics for all indexes on a table. |
|
@@ 9626-9637 (lines=12) @@ | ||
9623 | * |
|
9624 | * @return A recordset |
|
9625 | */ |
|
9626 | public function getStatsIndexIO($table) |
|
9627 | { |
|
9628 | $c_schema = $this->_schema; |
|
9629 | $this->clean($c_schema); |
|
9630 | $this->clean($table); |
|
9631 | ||
9632 | $sql = "SELECT * FROM pg_statio_all_indexes |
|
9633 | WHERE schemaname='{$c_schema}' AND relname='{$table}' |
|
9634 | ORDER BY indexrelname"; |
|
9635 | ||
9636 | return $this->selectSet($sql); |
|
9637 | } |
|
9638 | ||
9639 | public function hasAggregateSortOp() |
|
9640 | { |
@@ 377-395 (lines=19) @@ | ||
374 | * |
|
375 | * @return A recordset |
|
376 | */ |
|
377 | public function getTable($table) |
|
378 | { |
|
379 | $c_schema = $this->_schema; |
|
380 | $this->clean($c_schema); |
|
381 | $this->clean($table); |
|
382 | ||
383 | $sql = " |
|
384 | SELECT |
|
385 | c.relname, n.nspname, u.usename AS relowner, |
|
386 | pg_catalog.obj_description(c.oid, 'pg_class') AS relcomment |
|
387 | FROM pg_catalog.pg_class c |
|
388 | LEFT JOIN pg_catalog.pg_user u ON u.usesysid = c.relowner |
|
389 | LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace |
|
390 | WHERE c.relkind = 'r' |
|
391 | AND n.nspname = '{$c_schema}' |
|
392 | AND c.relname = '{$table}'"; |
|
393 | ||
394 | return $this->selectSet($sql); |
|
395 | } |
|
396 | ||
397 | /** |
|
398 | * Return all tables in current database (and schema). |
@@ 174-198 (lines=25) @@ | ||
171 | * |
|
172 | * @return A recordset |
|
173 | */ |
|
174 | public function getAggregate($name, $basetype) |
|
175 | { |
|
176 | $c_schema = $this->_schema; |
|
177 | $this->clean($c_schema); |
|
178 | $this->clean($name); |
|
179 | $this->clean($basetype); |
|
180 | ||
181 | $sql = " |
|
182 | SELECT p.proname, |
|
183 | CASE p.proargtypes[0] |
|
184 | WHEN 'pg_catalog.\"any\"'::pg_catalog.regtype THEN NULL |
|
185 | ELSE pg_catalog.format_type(p.proargtypes[0], NULL) |
|
186 | END AS proargtypes, a.aggtransfn, format_type(a.aggtranstype, NULL) AS aggstype, |
|
187 | a.aggfinalfn, a.agginitval, u.usename, pg_catalog.obj_description(p.oid, 'pg_proc') AS aggrcomment |
|
188 | FROM pg_catalog.pg_proc p, pg_catalog.pg_namespace n, pg_catalog.pg_user u, pg_catalog.pg_aggregate a |
|
189 | WHERE n.oid = p.pronamespace AND p.proowner=u.usesysid AND p.oid=a.aggfnoid |
|
190 | AND p.proisagg AND n.nspname='{$c_schema}' |
|
191 | AND p.proname='{$name}' |
|
192 | AND CASE p.proargtypes[0] |
|
193 | WHEN 'pg_catalog.\"any\"'::pg_catalog.regtype THEN '' |
|
194 | ELSE pg_catalog.format_type(p.proargtypes[0], NULL) |
|
195 | END ='{$basetype}'"; |
|
196 | ||
197 | return $this->selectSet($sql); |
|
198 | } |
|
199 | ||
200 | // Sequence functions |
|
201 |
@@ 133-154 (lines=22) @@ | ||
130 | * |
|
131 | * @return \PHPPgAdmin\Database\A recordset |
|
132 | */ |
|
133 | public function getTriggers($table = '') |
|
134 | { |
|
135 | $c_schema = $this->_schema; |
|
136 | $this->clean($c_schema); |
|
137 | $this->clean($table); |
|
138 | ||
139 | $sql = "SELECT |
|
140 | t.tgname, pg_catalog.pg_get_triggerdef(t.oid) AS tgdef, t.tgenabled, p.oid AS prooid, |
|
141 | p.proname || ' (' || pg_catalog.oidvectortypes(p.proargtypes) || ')' AS proproto, |
|
142 | ns.nspname AS pronamespace |
|
143 | FROM pg_catalog.pg_trigger t, pg_catalog.pg_proc p, pg_catalog.pg_namespace ns |
|
144 | WHERE t.tgrelid = (SELECT oid FROM pg_catalog.pg_class WHERE relname='{$table}' |
|
145 | AND relnamespace=(SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='{$c_schema}')) |
|
146 | AND (NOT tgisconstraint OR NOT EXISTS |
|
147 | (SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c |
|
148 | ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) |
|
149 | WHERE d.classid = t.tableoid AND d.objid = t.oid AND d.deptype = 'i' AND c.contype = 'f')) |
|
150 | AND p.oid=t.tgfoid |
|
151 | AND p.pronamespace = ns.oid"; |
|
152 | ||
153 | return $this->selectSet($sql); |
|
154 | } |
|
155 | ||
156 | // Function functions |
|
157 |
@@ 37-59 (lines=23) @@ | ||
34 | * |
|
35 | * @return \PHPPgAdmin\Database\A recordset |
|
36 | */ |
|
37 | public function getTriggers($table = '') |
|
38 | { |
|
39 | $c_schema = $this->_schema; |
|
40 | $this->clean($c_schema); |
|
41 | $this->clean($table); |
|
42 | ||
43 | $sql = "SELECT |
|
44 | t.tgname, pg_catalog.pg_get_triggerdef(t.oid) AS tgdef, |
|
45 | CASE WHEN t.tgenabled = 'D' THEN FALSE ELSE TRUE END AS tgenabled, p.oid AS prooid, |
|
46 | p.proname || ' (' || pg_catalog.oidvectortypes(p.proargtypes) || ')' AS proproto, |
|
47 | ns.nspname AS pronamespace |
|
48 | FROM pg_catalog.pg_trigger t, pg_catalog.pg_proc p, pg_catalog.pg_namespace ns |
|
49 | WHERE t.tgrelid = (SELECT oid FROM pg_catalog.pg_class WHERE relname='{$table}' |
|
50 | AND relnamespace=(SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='{$c_schema}')) |
|
51 | AND (NOT tgisconstraint OR NOT EXISTS |
|
52 | (SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c |
|
53 | ON (d.refclassid = c.tableoid AND d.refobjid = c.oid) |
|
54 | WHERE d.classid = t.tableoid AND d.objid = t.oid AND d.deptype = 'i' AND c.contype = 'f')) |
|
55 | AND p.oid=t.tgfoid |
|
56 | AND p.pronamespace = ns.oid"; |
|
57 | ||
58 | return $this->selectSet($sql); |
|
59 | } |
|
60 | ||
61 | /** |
|
62 | * Searches all system catalogs to find objects that match a certain name. |