[DBD::Pg 01/14] table_info() explicit SYSTEM TABLE|VIEW support

[email protected] Sun, 27 Jul 2014 05:14:02 +0000
Newsgroups perl.dbd.pg.changes
Message-ID <[email protected]>
Committed by pilcrow <[email protected]>

Subject: [DBD::Pg 01/14] table_info() explicit SYSTEM TABLE|VIEW support

---
 Pg.pm | 60 ++++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 36 insertions(+), 24 deletions(-)

diff --git a/Pg.pm b/Pg.pm
index f1e951c..c4a9fb7 100644
--- a/Pg.pm
+++ b/Pg.pm
@@ -1171,19 +1171,28 @@ use 5.008001;
 					 and (defined $type and $type eq '%')
 					) {
 			$tbl_sql = qq{
-                    SELECT
-                       NULL::text AS "TABLE_CAT"
-                     , NULL::text AS "TABLE_SCHEM"
-                     , NULL::text AS "TABLE_NAME"
-                     , 'TABLE'    AS "TABLE_TYPE"
-                     , 'relkind: r' AS "REMARKS" $extracols
-                    UNION
-                    SELECT
-                       NULL::text AS "TABLE_CAT"
-                     , NULL::text AS "TABLE_SCHEM"
-                     , NULL::text AS "TABLE_NAME"
-                     , 'VIEW'     AS "TABLE_TYPE"
-                     , 'relkind: v' AS "REMARKS" $extracols
+                    SELECT "TABLE_CAT"
+                         , "TABLE_SCHEM"
+                         , "TABLE_NAME"
+                         , "TABLE_TYPE"
+                         , "REMARKS"
+                    FROM
+                      (SELECT NULL::text AS "TABLE_CAT"
+                            , NULL::text AS "TABLE_SCHEM"
+                            , NULL::text AS "TABLE_NAME") dummy_cols
+                    CROSS JOIN
+                      (SELECT 'TABLE'        AS "TABLE_TYPE"
+                            , 'relkind: r'   AS "REMARKS"
+                       UNION
+                       SELECT 'SYSTEM TABLE'
+                            , 'relkind: r; nspname ~ ^pg_'
+                       UNION
+                       SELECT 'VIEW'
+                            , 'relkind: v'
+                       UNION
+                       SELECT 'SYSTEM VIEW'
+                            , 'relkind: v; nspname ~ ^pg_') type_info
+                     ORDER BY "TABLE_TYPE" ASC
                 };
 		}
 		else {
@@ -1202,17 +1211,20 @@ use 5.008001;
 			if (defined $table and length $table) {
 					push @search, 'c.relname ' . ($table =~ /[_%]/ ? 'LIKE ' : '= ') . $dbh->quote($table);
 			}
-			## All we can see is "table" or "view". Default is both
-			my $typesearch = q{IN ('r','v')};
-			if (defined $type and length $type) {
-				if ($type =~ /\btable\b/i and $type !~ /\bview\b/i) {
-					$typesearch = q{= 'r'};
-				}
-				elsif ($type =~ /\bview\b/i and $type !~ /\btable\b/i) {
-					$typesearch = q{= 'v'};
-				}
-			}
-			push @search, "c.relkind $typesearch";
+
+      my %typesearch = (
+          TABLE          => q{c.relkind = 'r' AND n.nspname !~ '^pg_'},
+          VIEW           => q{c.relkind = 'v' AND n.nspname !~ '^pg_'},
+          'SYSTEM TABLE' => q{c.relkind = 'r' AND n.nspname  ~ '^pg_'},
+          'SYSTEM VIEW'  => q{c.relkind = 'v' AND n.nspname  ~ '^pg_'},
+      );
+			my $typespec = join ' OR ' =>
+			                 map { s/^'//g; s/'$//g; $typesearch{uc($_)} }
+			                   split(',', $type);
+			$typespec = $typespec
+			            ? "($typespec)"
+									: "c.relkind IN ('r', 'v')"; # default any table/view
+			push @search, $typespec;
 
 			my $TSJOIN = 'pg_catalog.pg_tablespace t ON (t.oid = c.reltablespace)';
 			if ($dbh->{private_dbdpg}{version} < 80000) {
-- 
1.8.4