Changeset: 11c6dd4fe1a4 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=11c6dd4fe1a4 Modified Files: java/src/main/java/nl/cwi/monetdb/jdbc/MonetDatabaseMetaData.java Branch: Jul2015 Log Message:
Optimize and simplify the construction of Metadata queries by using ILIKE instead of LIKE with LOWER() and toLowerCase() data processing. diffs (240 lines): 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 @@ -1681,15 +1681,13 @@ public class MonetDatabaseMetaData exten String types[] ) throws SQLException { - String select; - String orderby; String cat = getEnv("gdk_dbname"); // as of Jul2015 release the sys.tables.type values (0 through 6) is extended with new values 10, 11, 20, and 30 (for system and temp tables/views). // for correct behavior we need to know if the server is using the old (pre Jul2015) or new sys.tables.type values boolean preJul2015 = ("11.19.15".compareTo(getDatabaseProductVersion()) >= 0); /* for debug: System.out.println("getDatabaseProductVersion() is " + getDatabaseProductVersion() + " preJul2015 is " + preJul2015); */ - select = + String query = "SELECT * FROM ( " + "SELECT '" + cat + "' AS \"TABLE_CAT\", \"schemas\".\"name\" AS \"TABLE_SCHEM\", \"tables\".\"name\" AS \"TABLE_NAME\", " + "CASE WHEN \"tables\".\"system\" = true AND \"tables\".\"type\" = " + (preJul2015 ? "0" : "10") + " AND \"tables\".\"temporary\" = 0 THEN 'SYSTEM TABLE' " + @@ -1706,22 +1704,22 @@ public class MonetDatabaseMetaData exten ") AS \"tables\" WHERE 1 = 1 "; if (tableNamePattern != null) { - select += "AND LOWER(\"TABLE_NAME\") LIKE '" + escapeQuotes(tableNamePattern).toLowerCase() + "' "; + query += "AND \"TABLE_NAME\" ILIKE '" + escapeQuotes(tableNamePattern) + "' "; } if (schemaPattern != null) { - select += "AND LOWER(\"TABLE_SCHEM\") LIKE '" + escapeQuotes(schemaPattern).toLowerCase() + "' "; + query += "AND \"TABLE_SCHEM\" ILIKE '" + escapeQuotes(schemaPattern) + "' "; } if (types != null) { - select += "AND ("; + query += "AND ("; for (int i = 0; i < types.length; i++) { - select += (i == 0 ? "" : " OR ") + "LOWER(\"TABLE_TYPE\") LIKE '" + escapeQuotes(types[i]).toLowerCase() + "'"; + query += (i == 0 ? "" : " OR ") + "\"TABLE_TYPE\" ILIKE '" + escapeQuotes(types[i]) + "'"; } - select += ") "; + query += ") "; } - orderby = "ORDER BY \"TABLE_TYPE\", \"TABLE_SCHEM\", \"TABLE_NAME\" "; - - return getStmt().executeQuery(select + orderby); + query += "ORDER BY \"TABLE_TYPE\", \"TABLE_SCHEM\", \"TABLE_NAME\""; + + return getStmt().executeQuery(query); } /** @@ -1757,9 +1755,9 @@ public class MonetDatabaseMetaData exten "FROM \"sys\".\"schemas\" " + "WHERE 1 = 1 "; if (catalog != null) - query += "AND LOWER('" + cat + "') LIKE '" + escapeQuotes(catalog).toLowerCase() + "' "; + query += "AND '" + cat + "' ILIKE '" + escapeQuotes(catalog) + "' "; if (schemaPattern != null) - query += "AND LOWER(\"name\") LIKE '" + escapeQuotes(schemaPattern).toLowerCase() + "' "; + query += "AND \"name\" ILIKE '" + escapeQuotes(schemaPattern) + "' "; query += "ORDER BY \"TABLE_SCHEM\""; return getStmt().executeQuery(query); @@ -1942,13 +1940,13 @@ public class MonetDatabaseMetaData exten "AND \"tables\".\"schema_id\" = \"schemas\".\"id\" "; if (schemaPattern != null) { - query += "AND LOWER(\"schemas\".\"name\") LIKE '" + escapeQuotes(schemaPattern).toLowerCase() + "' "; + query += "AND \"schemas\".\"name\" ILIKE '" + escapeQuotes(schemaPattern) + "' "; } if (tableNamePattern != null) { - query += "AND LOWER(\"tables\".\"name\") LIKE '" + escapeQuotes(tableNamePattern).toLowerCase() + "' "; + query += "AND \"tables\".\"name\" ILIKE '" + escapeQuotes(tableNamePattern) + "' "; } if (columnNamePattern != null) { - query += "AND LOWER(\"columns\".\"name\") LIKE '" + escapeQuotes(columnNamePattern).toLowerCase() + "' "; + query += "AND \"columns\".\"name\" ILIKE '" + escapeQuotes(columnNamePattern) + "' "; } query += "ORDER BY \"TABLE_SCHEM\", \"TABLE_NAME\", \"ORDINAL_POSITION\""; @@ -2026,13 +2024,13 @@ public class MonetDatabaseMetaData exten "AND \"privileges\".\"grantor\" = \"grantors\".\"id\" "; if (schemaPattern != null) { - query += "AND LOWER(\"schemas\".\"name\") LIKE '" + escapeQuotes(schemaPattern).toLowerCase() + "' "; + query += "AND \"schemas\".\"name\" ILIKE '" + escapeQuotes(schemaPattern) + "' "; } if (tableNamePattern != null) { - query += "AND LOWER(\"tables\".\"name\") LIKE '" + escapeQuotes(tableNamePattern).toLowerCase() + "' "; + query += "AND \"tables\".\"name\" ILIKE '" + escapeQuotes(tableNamePattern) + "' "; } if (columnNamePattern != null) { - query += "AND LOWER(\"columns\".\"name\") LIKE '" + escapeQuotes(columnNamePattern).toLowerCase() + "' "; + query += "AND \"columns\".\"name\" ILIKE '" + escapeQuotes(columnNamePattern) + "' "; } query += "ORDER BY \"COLUMN_NAME\", \"PRIVILEGE\""; @@ -2106,10 +2104,10 @@ public class MonetDatabaseMetaData exten "AND \"privileges\".\"grantor\" = \"grantors\".\"id\" "; if (schemaPattern != null) { - query += "AND LOWER(\"schemas\".\"name\") LIKE '" + escapeQuotes(schemaPattern).toLowerCase() + "' "; + query += "AND \"schemas\".\"name\" ILIKE '" + escapeQuotes(schemaPattern) + "' "; } if (tableNamePattern != null) { - query += "AND LOWER(\"tables\".\"name\") LIKE '" + escapeQuotes(tableNamePattern).toLowerCase() + "' "; + query += "AND \"tables\".\"name\" ILIKE '" + escapeQuotes(tableNamePattern) + "' "; } query += "ORDER BY \"TABLE_SCHEM\", \"TABLE_NAME\", \"PRIVILEGE\""; @@ -2181,16 +2179,10 @@ public class MonetDatabaseMetaData exten "AND \"keys\".\"type\" IN (0, 1) "; // only primary keys (type = 0) and unique keys (type = 1), not fkeys (type = 2) if (schema != null) { - if (schema.contains("%") || schema.contains("_")) - query += "AND LOWER(\"schemas\".\"name\") LIKE '" + escapeQuotes(schema).toLowerCase() + "' "; - else - query += "AND \"schemas\".\"name\" = '" + escapeQuotes(schema) + "' "; + query += "AND \"schemas\".\"name\" ILIKE '" + escapeQuotes(schema) + "' "; } if (table != null) { - if (table.contains("%") || table.contains("_")) - query += "AND LOWER(\"tables\".\"name\") LIKE '" + escapeQuotes(table).toLowerCase() + "' "; - else - query += "AND \"tables\".\"name\" = '" + escapeQuotes(table) + "' "; + query += "AND \"tables\".\"name\" ILIKE '" + escapeQuotes(table) + "' "; } if (!nullable) { query += "AND \"columns\".\"null\" = false "; @@ -2302,10 +2294,10 @@ public class MonetDatabaseMetaData exten "AND \"keys\".\"type\" = 0 "; if (schema != null) { - query += "AND LOWER(\"schemas\".\"name\") LIKE '" + escapeQuotes(schema).toLowerCase() + "' "; + query += "AND \"schemas\".\"name\" ILIKE '" + escapeQuotes(schema) + "' "; } if (table != null) { - query += "AND LOWER(\"tables\".\"name\") LIKE '" + escapeQuotes(table).toLowerCase() + "' "; + query += "AND \"tables\".\"name\" ILIKE '" + escapeQuotes(table) + "' "; } query += "ORDER BY \"COLUMN_NAME\""; @@ -2398,10 +2390,10 @@ public class MonetDatabaseMetaData exten String query = keyQuery(cat); if (schema != null) { - query += "AND LOWER(\"fkschema\".\"name\") LIKE '" + escapeQuotes(schema).toLowerCase() + "' "; + query += "AND \"fkschema\".\"name\" ILIKE '" + escapeQuotes(schema) + "' "; } if (table != null) { - query += "AND LOWER(\"fktable\".\"name\") LIKE '" + escapeQuotes(table).toLowerCase() + "' "; + query += "AND \"fktable\".\"name\" ILIKE '" + escapeQuotes(table) + "' "; } query += "ORDER BY \"PKTABLE_CAT\", \"PKTABLE_SCHEM\", \"PKTABLE_NAME\", \"PK_NAME\", \"KEY_SEQ\""; @@ -2469,10 +2461,10 @@ public class MonetDatabaseMetaData exten String query = keyQuery(cat); if (schema != null) { - query += "AND LOWER(\"pkschema\".\"name\") LIKE '" + escapeQuotes(schema).toLowerCase() + "' "; + query += "AND \"pkschema\".\"name\" ILIKE '" + escapeQuotes(schema) + "' "; } if (table != null) { - query += "AND LOWER(\"pktable\".\"name\") LIKE '" + escapeQuotes(table).toLowerCase() + "' "; + query += "AND \"pktable\".\"name\" ILIKE '" + escapeQuotes(table) + "' "; } query += "ORDER BY \"FKTABLE_CAT\", \"FKTABLE_SCHEM\", \"FKTABLE_NAME\", \"FK_NAME\", \"KEY_SEQ\""; @@ -2555,16 +2547,16 @@ public class MonetDatabaseMetaData exten String query = keyQuery(cat); if (pschema != null) { - query += "AND LOWER(\"pkschema\".\"name\") LIKE '" + escapeQuotes(pschema).toLowerCase() + "' "; + query += "AND \"pkschema\".\"name\" ILIKE '" + escapeQuotes(pschema) + "' "; } if (ptable != null) { - query += "AND LOWER(\"pktable\".\"name\") LIKE '" + escapeQuotes(ptable).toLowerCase() + "' "; + query += "AND \"pktable\".\"name\" ILIKE '" + escapeQuotes(ptable) + "' "; } if (fschema != null) { - query += "AND LOWER(\"fkschema\".\"name\") LIKE '" + escapeQuotes(fschema).toLowerCase() + "' "; + query += "AND \"fkschema\".\"name\" ILIKE '" + escapeQuotes(fschema) + "' "; } if (ftable != null) { - query += "AND LOWER(\"fktable\".\"name\") LIKE '" + escapeQuotes(ftable).toLowerCase() + "' "; + query += "AND \"fktable\".\"name\" ILIKE '" + escapeQuotes(ftable) + "' "; } query += "ORDER BY \"FKTABLE_CAT\", \"FKTABLE_SCHEM\", \"FKTABLE_NAME\", \"FK_NAME\", \"KEY_SEQ\""; @@ -2755,10 +2747,10 @@ public class MonetDatabaseMetaData exten "WHERE 1 = 1 "; if (schema != null) { - query += "AND LOWER(\"TABLE_SCHEM\") LIKE '" + escapeQuotes(schema).toLowerCase() + "' "; + query += "AND \"TABLE_SCHEM\" ILIKE '" + escapeQuotes(schema) + "' "; } if (table != null) { - query += "AND LOWER(\"TABLE_NAME\") LIKE '" + escapeQuotes(table).toLowerCase() + "' "; + query += "AND \"TABLE_NAME\" ILIKE '" + escapeQuotes(table) + "' "; } if (unique) { query += "AND \"NON_UNIQUE\" = false "; @@ -3494,11 +3486,8 @@ public class MonetDatabaseMetaData exten String functionNamePattern) throws SQLException { - String select; - String orderby; String cat = getEnv("gdk_dbname"); - - select = + String select = "SELECT * FROM ( " + "SELECT '" + cat + "' AS \"FUNCTION_CAT\", " + "\"schemas\".\"name\" AS \"FUNCTION_SCHEM\", " + @@ -3510,18 +3499,18 @@ public class MonetDatabaseMetaData exten ") AS \"functions\" WHERE 1 = 1 "; if (catalog != null) { - select += "AND LOWER('" + cat + "') LIKE '" + escapeQuotes(catalog).toLowerCase() + "' "; + select += "AND '" + cat + "' ILIKE '" + escapeQuotes(catalog) + "' "; } if (schemaPattern != null) { - select += "AND LOWER(\"FUNCTION_SCHEM\") LIKE '" + escapeQuotes(schemaPattern).toLowerCase() + "' "; + select += "AND \"FUNCTION_SCHEM\" ILIKE '" + escapeQuotes(schemaPattern) + "' "; } if (functionNamePattern != null) { - select += "AND LOWER(\"FUNCTION_NAME\") LIKE '" + escapeQuotes(functionNamePattern).toLowerCase() + "' "; + select += "AND \"FUNCTION_NAME\" ILIKE '" + escapeQuotes(functionNamePattern) + "' "; } - orderby = "ORDER BY \"FUNCTION_SCHEM\", \"FUNCTION_NAME\", \"SPECIFIC_NAME\""; - - return getStmt().executeQuery(select + orderby); + select += "ORDER BY \"FUNCTION_SCHEM\", \"FUNCTION_NAME\", \"SPECIFIC_NAME\""; + + return getStmt().executeQuery(select); } /** _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list