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

Reply via email to