diff --git a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/column/show/ShowColumnsOperation.java b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/column/show/ShowColumnsOperation.java index 289479b7ee79..cd40dc919668 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/column/show/ShowColumnsOperation.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/column/show/ShowColumnsOperation.java @@ -36,6 +36,7 @@ import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.metadata.Table; import org.apache.hadoop.hive.ql.session.SessionState; +import org.apache.hadoop.hive.ql.udf.UDFLike; /** * Operation process of showing the columns. @@ -77,10 +78,9 @@ private Matcher getMatcher() { if (columnPattern == null) { columnPattern = "*"; } - columnPattern = columnPattern.toLowerCase(); - columnPattern = columnPattern.replaceAll("\\*", ".*"); - Pattern pattern = Pattern.compile(columnPattern); + String regex = UDFLike.likePatternToRegExp(columnPattern, false, true); + Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); return pattern.matcher(""); } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLike.java b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLike.java index b455e91b452e..12becaa8e7cb 100755 --- a/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLike.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLike.java @@ -83,7 +83,8 @@ public static String likePatternToRegExp(String likePattern, boolean literalize, if (n == '_') { sb.append("."); - } else if (n == '%') { + } else if (n == '%' || (n == '*' && !literalize)) { + // Both % and * (when not literalized) are treated as standard regex .* sb.append(greedyMatch ? ".*" : ".*?"); } else { sb.append(literalize ? Pattern.quote(Character.toString(n)) : n); diff --git a/ql/src/test/queries/clientpositive/show_columns_like.q b/ql/src/test/queries/clientpositive/show_columns_like.q new file mode 100644 index 000000000000..3fba48083327 --- /dev/null +++ b/ql/src/test/queries/clientpositive/show_columns_like.q @@ -0,0 +1,27 @@ +CREATE DATABASE IF NOT EXISTS col_test_db; +USE col_test_db; + +CREATE TABLE wildcard_table ( + id_primary INT, + id_secondary INT, + name_first STRING, + name_last STRING, + MixedCaseColumn INT, + another_Mixed_Col STRING +); + +SHOW COLUMNS FROM wildcard_table LIKE 'id%'; +SHOW COLUMNS FROM wildcard_table LIKE 'name_%'; +-- Case Insensitivity test +SHOW COLUMNS FROM wildcard_table LIKE 'mixedcase%'; +SHOW COLUMNS FROM wildcard_table LIKE 'another_mixed_col'; +SHOW COLUMNS FROM wildcard_table LIKE 'id*'; +SHOW COLUMNS FROM wildcard_table LIKE 'id_primary|name_first'; + +-- Additional tests for '_' and empty results +SHOW COLUMNS FROM wildcard_table LIKE 'id_secondar_'; +SHOW COLUMNS FROM wildcard_table LIKE 'id__rimary'; +SHOW COLUMNS FROM wildcard_table LIKE 'abc%'; +SHOW COLUMNS FROM wildcard_table LIKE 'id__'; + +DROP DATABASE col_test_db CASCADE; diff --git a/ql/src/test/results/clientpositive/llap/show_columns_like.q.out b/ql/src/test/results/clientpositive/llap/show_columns_like.q.out new file mode 100644 index 000000000000..269d3cb4e350 --- /dev/null +++ b/ql/src/test/results/clientpositive/llap/show_columns_like.q.out @@ -0,0 +1,116 @@ +PREHOOK: query: CREATE DATABASE IF NOT EXISTS col_test_db +PREHOOK: type: CREATEDATABASE +PREHOOK: Output: database:col_test_db +POSTHOOK: query: CREATE DATABASE IF NOT EXISTS col_test_db +POSTHOOK: type: CREATEDATABASE +POSTHOOK: Output: database:col_test_db +PREHOOK: query: USE col_test_db +PREHOOK: type: SWITCHDATABASE +PREHOOK: Input: database:col_test_db +POSTHOOK: query: USE col_test_db +POSTHOOK: type: SWITCHDATABASE +POSTHOOK: Input: database:col_test_db +PREHOOK: query: CREATE TABLE wildcard_table ( + id_primary INT, + id_secondary INT, + name_first STRING, + name_last STRING, + MixedCaseColumn INT, + another_Mixed_Col STRING +) +PREHOOK: type: CREATETABLE +PREHOOK: Output: col_test_db@wildcard_table +PREHOOK: Output: database:col_test_db +POSTHOOK: query: CREATE TABLE wildcard_table ( + id_primary INT, + id_secondary INT, + name_first STRING, + name_last STRING, + MixedCaseColumn INT, + another_Mixed_Col STRING +) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: col_test_db@wildcard_table +POSTHOOK: Output: database:col_test_db +PREHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'id%' +PREHOOK: type: SHOWCOLUMNS +PREHOOK: Input: col_test_db@wildcard_table +POSTHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'id%' +POSTHOOK: type: SHOWCOLUMNS +POSTHOOK: Input: col_test_db@wildcard_table +id_primary +id_secondary +PREHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'name_%' +PREHOOK: type: SHOWCOLUMNS +PREHOOK: Input: col_test_db@wildcard_table +POSTHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'name_%' +POSTHOOK: type: SHOWCOLUMNS +POSTHOOK: Input: col_test_db@wildcard_table +name_first +name_last +PREHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'mixedcase%' +PREHOOK: type: SHOWCOLUMNS +PREHOOK: Input: col_test_db@wildcard_table +POSTHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'mixedcase%' +POSTHOOK: type: SHOWCOLUMNS +POSTHOOK: Input: col_test_db@wildcard_table +mixedcasecolumn +PREHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'another_mixed_col' +PREHOOK: type: SHOWCOLUMNS +PREHOOK: Input: col_test_db@wildcard_table +POSTHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'another_mixed_col' +POSTHOOK: type: SHOWCOLUMNS +POSTHOOK: Input: col_test_db@wildcard_table +another_mixed_col +PREHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'id*' +PREHOOK: type: SHOWCOLUMNS +PREHOOK: Input: col_test_db@wildcard_table +POSTHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'id*' +POSTHOOK: type: SHOWCOLUMNS +POSTHOOK: Input: col_test_db@wildcard_table +id_primary +id_secondary +PREHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'id_primary|name_first' +PREHOOK: type: SHOWCOLUMNS +PREHOOK: Input: col_test_db@wildcard_table +POSTHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'id_primary|name_first' +POSTHOOK: type: SHOWCOLUMNS +POSTHOOK: Input: col_test_db@wildcard_table +id_primary +name_first +PREHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'id_secondar_' +PREHOOK: type: SHOWCOLUMNS +PREHOOK: Input: col_test_db@wildcard_table +POSTHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'id_secondar_' +POSTHOOK: type: SHOWCOLUMNS +POSTHOOK: Input: col_test_db@wildcard_table +id_secondary +PREHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'id__rimary' +PREHOOK: type: SHOWCOLUMNS +PREHOOK: Input: col_test_db@wildcard_table +POSTHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'id__rimary' +POSTHOOK: type: SHOWCOLUMNS +POSTHOOK: Input: col_test_db@wildcard_table +id_primary +PREHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'abc%' +PREHOOK: type: SHOWCOLUMNS +PREHOOK: Input: col_test_db@wildcard_table +POSTHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'abc%' +POSTHOOK: type: SHOWCOLUMNS +POSTHOOK: Input: col_test_db@wildcard_table +PREHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'id__' +PREHOOK: type: SHOWCOLUMNS +PREHOOK: Input: col_test_db@wildcard_table +POSTHOOK: query: SHOW COLUMNS FROM wildcard_table LIKE 'id__' +POSTHOOK: type: SHOWCOLUMNS +POSTHOOK: Input: col_test_db@wildcard_table +PREHOOK: query: DROP DATABASE col_test_db CASCADE +PREHOOK: type: DROPDATABASE +PREHOOK: Input: database:col_test_db +PREHOOK: Output: col_test_db@wildcard_table +PREHOOK: Output: database:col_test_db +POSTHOOK: query: DROP DATABASE col_test_db CASCADE +POSTHOOK: type: DROPDATABASE +POSTHOOK: Input: database:col_test_db +POSTHOOK: Output: col_test_db@wildcard_table +POSTHOOK: Output: database:col_test_db