@Override public ResultSet getSchemas(String catalog, String schemaPattern) throws SQLException { String sql; sql = "SELECT nspname AS TABLE_SCHEM, NULL AS TABLE_CATALOG FROM pg_catalog.pg_namespace " + " WHERE nspname <> 'pg_toast' AND (nspname !~ '^pg_temp_' " + " OR nspname = (pg_catalog.current_schemas(true))[1]) AND (nspname !~ '^pg_toast_temp_' " + " OR nspname = replace((pg_catalog.current_schemas(true))[1], 'pg_temp_', 'pg_toast_temp_')) "; if (schemaPattern != null && !schemaPattern.isEmpty()) { sql += " AND nspname LIKE " + escapeQuotes(schemaPattern); } sql += " ORDER BY TABLE_SCHEM"; return createMetaDataStatement().executeQuery(sql); }
public ResultSet getCrossReference(String primaryCatalog, String primarySchema, String primaryTable, String foreignCatalog, String foreignSchema, String foreignTable) throws SQLException { return getImportedExportedKeys(primaryCatalog, primarySchema, primaryTable, foreignCatalog, foreignSchema, foreignTable); }
public int getMaxColumnsInIndex() throws SQLException { return getMaxIndexKeys(); }
sql += " AND n.nspname = " + escapeQuotes(schema); sql += " AND c.relname = " + escapeQuotes(table); sql += " AND a.attname LIKE " + escapeQuotes(columnNamePattern); Map<String, Map<String, List<String[]>>> permissions = parseACL(relAcl, owner); Map<String, Map<String, List<String[]>>> relPermissions = parseACL(acl, owner); permissions.putAll(relPermissions); stmt.close(); return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v);
+ " pg_catalog.pg_namespace fkn, pg_catalog.pg_class fkc, pg_catalog.pg_attribute fka, " + " pg_catalog.pg_constraint con, " + " pg_catalog.generate_series(1, " + getMaxIndexKeys() + ") pos(n), " + " pg_catalog.pg_class pkic"; sql += " AND pkn.nspname = " + escapeQuotes(primarySchema); sql += " AND fkn.nspname = " + escapeQuotes(foreignSchema); sql += " AND pkc.relname = " + escapeQuotes(primaryTable); sql += " AND fkc.relname = " + escapeQuotes(foreignTable); return createMetaDataStatement().executeQuery(sql);
public int getMaxProcedureNameLength() throws SQLException { return getMaxNameLength(); }
/** * Take the a String representing an array of ACLs and return a Map mapping the SQL permission * name to a List of usernames who have that permission. * For instance: {@code SELECT -> user1 -> list of [grantor, grantable]} * * @param aclArray ACL array * @param owner owner * @return a Map mapping the SQL permission name */ public Map<String, Map<String, List<String[]>>> parseACL(String aclArray, String owner) { if (aclArray == null) { // arwdxt -- 8.2 Removed the separate RULE permission // arwdDxt -- 8.4 Added a separate TRUNCATE permission String perms = connection.haveMinimumServerVersion(ServerVersion.v8_4) ? "arwdDxt" : "arwdxt"; aclArray = "{" + owner + "=" + perms + "/" + owner + "}"; } List<String> acls = parseACLArray(aclArray); Map<String, Map<String, List<String[]>>> privileges = new HashMap<String, Map<String, List<String[]>>>(); for (String acl : acls) { addACLPrivileges(acl, privileges); } return privileges; }
@Override public ResultSet getClientInfoProperties() throws SQLException { Field[] f = new Field[4]; f[0] = new Field("NAME", Oid.VARCHAR); f[1] = new Field("MAX_LEN", Oid.INT4); f[2] = new Field("DEFAULT_VALUE", Oid.VARCHAR); f[3] = new Field("DESCRIPTION", Oid.VARCHAR); List<byte[][]> v = new ArrayList<byte[][]>(); if (connection.haveMinimumServerVersion(ServerVersion.v9_0)) { byte[][] tuple = new byte[4][]; tuple[0] = connection.encodeString("ApplicationName"); tuple[1] = connection.encodeString(Integer.toString(getMaxNameLength())); tuple[2] = connection.encodeString(""); tuple[3] = connection .encodeString("The name of the application currently utilizing the connection."); v.add(tuple); } return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v); }
@Override public ResultSet getTableTypes() throws SQLException { String[] types = tableTypeClauses.keySet().toArray(new String[0]); Arrays.sort(types); Field[] f = new Field[1]; List<byte[][]> v = new ArrayList<byte[][]>(); f[0] = new Field("TABLE_TYPE", Oid.VARCHAR); for (String type : types) { byte[][] tuple = new byte[1][]; tuple[0] = connection.encodeString(type); v.add(tuple); } return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v); }
public ResultSet getFunctionColumns(String catalog, String schemaPattern, String functionNamePattern, String columnNamePattern) throws SQLException { return getProcedureColumns(catalog, schemaPattern, functionNamePattern, columnNamePattern); }
@Override public ResultSet getSchemas() throws SQLException { return getSchemas(null, null); }
@Override public DatabaseMetaData getMetaData() throws SQLException { checkClosed(); if (metadata == null) { metadata = new PgDatabaseMetaData(this); } return metadata; }
sql += " AND n.nspname LIKE " + escapeQuotes(schemaPattern); sql += " AND c.relname LIKE " + escapeQuotes(tableNamePattern); String owner = rs.getString("rolname"); String acl = rs.getString("relacl"); Map<String, Map<String, List<String[]>>> permissions = parseACL(acl, owner); String[] permNames = permissions.keySet().toArray(new String[0]); Arrays.sort(permNames); stmt.close(); return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v);
public int getMaxColumnNameLength() throws SQLException { return getMaxNameLength(); }
/** * PostgreSQL does not support multiple catalogs from a single connection, so to reduce confusion * we only return the current catalog. {@inheritDoc} */ @Override public ResultSet getCatalogs() throws SQLException { Field[] f = new Field[1]; List<byte[][]> v = new ArrayList<byte[][]>(); f[0] = new Field("TABLE_CAT", Oid.VARCHAR); byte[][] tuple = new byte[1][]; tuple[0] = connection.encodeString(connection.getCatalog()); v.add(tuple); return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v); }
public ResultSet getProcedures(String catalog, String schemaPattern, String procedureNamePattern) throws SQLException { String sql; sql = "SELECT NULL AS PROCEDURE_CAT, n.nspname AS PROCEDURE_SCHEM, p.proname AS PROCEDURE_NAME, " + "NULL, NULL, NULL, d.description AS REMARKS, " + DatabaseMetaData.procedureReturnsResult + " AS PROCEDURE_TYPE, " + " p.proname || '_' || p.oid AS SPECIFIC_NAME " + " FROM pg_catalog.pg_namespace n, pg_catalog.pg_proc p " + " LEFT JOIN pg_catalog.pg_description d ON (p.oid=d.objoid) " + " LEFT JOIN pg_catalog.pg_class c ON (d.classoid=c.oid AND c.relname='pg_proc') " + " LEFT JOIN pg_catalog.pg_namespace pn ON (c.relnamespace=pn.oid AND pn.nspname='pg_catalog') " + " WHERE p.pronamespace=n.oid "; if (schemaPattern != null && !schemaPattern.isEmpty()) { sql += " AND n.nspname LIKE " + escapeQuotes(schemaPattern); } if (procedureNamePattern != null && !procedureNamePattern.isEmpty()) { sql += " AND p.proname LIKE " + escapeQuotes(procedureNamePattern); } sql += " ORDER BY PROCEDURE_SCHEM, PROCEDURE_NAME, p.oid::text "; return createMetaDataStatement().executeQuery(sql); }
public int getMaxSchemaNameLength() throws SQLException { return getMaxNameLength(); }
return ((BaseStatement) createMetaDataStatement()).createDriverResultSet(f, v);
public ResultSet getExportedKeys(String catalog, String schema, String table) throws SQLException { return getImportedExportedKeys(catalog, schema, table, null, null, null); }
public ResultSet getPrimaryKeys(String catalog, String schema, String table) throws SQLException { String sql; sql = "SELECT NULL AS TABLE_CAT, n.nspname AS TABLE_SCHEM, " + " ct.relname AS TABLE_NAME, a.attname AS COLUMN_NAME, " + " (i.keys).n AS KEY_SEQ, ci.relname AS PK_NAME " + "FROM pg_catalog.pg_class ct " + " JOIN pg_catalog.pg_attribute a ON (ct.oid = a.attrelid) " + " JOIN pg_catalog.pg_namespace n ON (ct.relnamespace = n.oid) " + " JOIN (SELECT i.indexrelid, i.indrelid, i.indisprimary, " + " information_schema._pg_expandarray(i.indkey) AS keys " + " FROM pg_catalog.pg_index i) i " + " ON (a.attnum = (i.keys).x AND a.attrelid = i.indrelid) " + " JOIN pg_catalog.pg_class ci ON (ci.oid = i.indexrelid) " + "WHERE true "; if (schema != null && !schema.isEmpty()) { sql += " AND n.nspname = " + escapeQuotes(schema); } if (table != null && !table.isEmpty()) { sql += " AND ct.relname = " + escapeQuotes(table); } sql += " AND i.indisprimary " + " ORDER BY table_name, pk_name, key_seq"; return createMetaDataStatement().executeQuery(sql); }