Changeset: 538030d8bdba for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=538030d8bdba Modified Files: java/ChangeLog java/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java Branch: default Log Message:
Method getFunctions() in DatabaseMetadata used to throw an SQLException: SELECT: no such column 'functions.sql' This has been corrected. It now returns a resultset as requested. diffs (93 lines): diff --git a/java/ChangeLog b/java/ChangeLog --- a/java/ChangeLog +++ b/java/ChangeLog @@ -2,6 +2,9 @@ # This file is updated with Maddlog * Thu Jan 28 2016 Martin van Dinther <martin.van.dint...@monetdbsolutions.com> +- Method getFunctions() in DatabaseMetadata used to throw an SQLException: + SELECT: no such column 'functions.sql' This has been corrected. It + now returns a resultset as requested. - The resultsets of DatabaseMetadata methods now no longer return a value for the *_CAT columns as MonetDB does not support Catalogs. diff --git a/java/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java b/java/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java --- a/java/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java +++ b/java/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java @@ -1670,6 +1670,26 @@ public class MonetDatabaseMetaData exten } /** + * Returns a SQL match part string where depending on the input value we + * compose an exact match (use =) or match with wildcards (use LIKE) + * + * @param in the string to match + * @return the SQL match part string + */ + private static final String composeMatchPart(String in) { + if (in == null) + return "IS NULL"; + + String sql; + // check if SQL wildcards are used in the input, if so use LIKE + if (in.contains("%") || in.contains("_")) + sql = "LIKE '" + escapeQuotes(in) + "'"; + else + sql = "= '" + escapeQuotes(in) + "'"; + return sql; + } + + /** * Returns the given string between two double quotes for usage as * exact column or table name in SQL queries. * @@ -3495,27 +3515,34 @@ public class MonetDatabaseMetaData exten String functionNamePattern) throws SQLException { - String select = - "SELECT * FROM ( " + - "SELECT cast(null as char(1)) AS \"FUNCTION_CAT\", " + - "\"schemas\".\"name\" AS \"FUNCTION_SCHEM\", " + - "\"functions\".\"name\" AS \"FUNCTION_NAME\", " + - "null AS \"REMARKS\", " + - DatabaseMetaData.functionResultUnknown + " AS \"FUNCTION_TYPE\", " + - "CASE WHEN \"functions\".\"sql\" = false THEN CAST(\"functions\"/\"mod\" || '.' || \"functions\".\"func\" AS CLOB) ELSE CAST(\"functions\".\"name\" AS CLOB) END AS \"SPECIFIC_NAME\" " + - "FROM \"sys\".\"functions\" AS \"functions\", \"sys\".\"schemas\" AS \"schemas\" WHERE \"functions\".\"schema_id\" = \"schemas\".\"id\" " + - ") AS \"functions\" WHERE 1 = 1 "; + StringBuilder query = new StringBuilder(800); + query.append("SELECT DISTINCT cast(null as char(1)) AS \"FUNCTION_CAT\", ") + .append("\"schemas\".\"name\" AS \"FUNCTION_SCHEM\", ") + .append("\"functions\".\"name\" AS \"FUNCTION_NAME\", ") + .append("cast(null as char(1)) AS \"REMARKS\", ") + .append("CASE \"functions\".\"type\"") + .append(" WHEN 1 THEN ").append(DatabaseMetaData.functionNoTable) + .append(" WHEN 2 THEN ").append(DatabaseMetaData.functionNoTable) + .append(" WHEN 3 THEN ").append(DatabaseMetaData.functionNoTable) + .append(" WHEN 4 THEN ").append(DatabaseMetaData.functionNoTable) + .append(" WHEN 5 THEN ").append(DatabaseMetaData.functionReturnsTable) + .append(" ELSE ").append(DatabaseMetaData.functionResultUnknown).append(" END AS \"FUNCTION_TYPE\", ") + .append("CAST(CASE \"functions\".\"language\" WHEN 0 THEN \"functions\".\"mod\" || '.' || \"functions\".\"func\" ELSE \"schemas\".\"name\" || '.' || \"functions\".\"name\" END AS VARCHAR(1500)) AS \"SPECIFIC_NAME\" ") + .append("FROM \"sys\".\"functions\", \"sys\".\"schemas\" ") + .append("WHERE \"functions\".\"schema_id\" = \"schemas\".\"id\" ") + // exclude procedures (type = 2). Those need to be returned via getProcedures() + .append("AND \"functions\".\"type\" <> 2"); if (schemaPattern != null) { - select += "AND \"FUNCTION_SCHEM\" ILIKE '" + escapeQuotes(schemaPattern) + "' "; + query.append(" AND \"schemas\".\"name\" ").append(composeMatchPart(schemaPattern)); } if (functionNamePattern != null) { - select += "AND \"FUNCTION_NAME\" ILIKE '" + escapeQuotes(functionNamePattern) + "' "; + query.append(" AND \"functions\".\"name\" ").append(composeMatchPart(functionNamePattern)); } - select += "ORDER BY \"FUNCTION_SCHEM\", \"FUNCTION_NAME\", \"SPECIFIC_NAME\""; - - return getStmt().executeQuery(select); + query.append(" ORDER BY \"FUNCTION_SCHEM\", \"FUNCTION_NAME\", \"SPECIFIC_NAME\""); + + return getStmt().executeQuery(query.toString()); } /** _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list