Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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("");
}

Expand Down
2 changes: 2 additions & 0 deletions ql/src/java/org/apache/hadoop/hive/ql/udf/UDFLike.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ public static String likePatternToRegExp(String likePattern, boolean literalize,
sb.append(".");
} else if (n == '%') {
sb.append(greedyMatch ? ".*" : ".*?");
} else if (n == '*' && !literalize) {
sb.append(greedyMatch ? ".*" : ".*?");
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe combine these together?
Also add a small comment explaining the condition

} else {
sb.append(literalize ? Pattern.quote(Character.toString(n)) : n);
}
Expand Down
21 changes: 21 additions & 0 deletions ql/src/test/queries/clientpositive/show_columns_inconsistency.q
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: A more relevant name for this? show_columns_like.q ?

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
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
);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we add columns here to tests case insensitivity? Since we are using Pattern.CASE_INSENSITIVE



SHOW TABLES LIKE 'wild%';
SHOW TABLES LIKE 'wild*';
SHOW TABLES LIKE 'none|wildcard_table';
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These seem out of scope as this PR is fixing SHOW COLUMNS ... LIKE.


SHOW COLUMNS FROM wildcard_table LIKE 'id%';
SHOW COLUMNS FROM wildcard_table LIKE 'name_%';
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here we are really testing %, and not _. Can we add more tests for the single char wildcard?
Also add more tests for empty results, like abc%, id__, for example.

SHOW COLUMNS FROM wildcard_table LIKE 'id*';
SHOW COLUMNS FROM wildcard_table LIKE 'id_primary|name_first';

DROP DATABASE col_test_db CASCADE;
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
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
)
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
)
POSTHOOK: type: CREATETABLE
POSTHOOK: Output: col_test_db@wildcard_table
POSTHOOK: Output: database:col_test_db
PREHOOK: query: SHOW TABLES LIKE 'wild%'
PREHOOK: type: SHOWTABLES
PREHOOK: Input: database:col_test_db
POSTHOOK: query: SHOW TABLES LIKE 'wild%'
POSTHOOK: type: SHOWTABLES
POSTHOOK: Input: database:col_test_db
wildcard_table
PREHOOK: query: SHOW TABLES LIKE 'wild*'
PREHOOK: type: SHOWTABLES
PREHOOK: Input: database:col_test_db
POSTHOOK: query: SHOW TABLES LIKE 'wild*'
POSTHOOK: type: SHOWTABLES
POSTHOOK: Input: database:col_test_db
wildcard_table
PREHOOK: query: SHOW TABLES LIKE 'none|wildcard_table'
PREHOOK: type: SHOWTABLES
PREHOOK: Input: database:col_test_db
POSTHOOK: query: SHOW TABLES LIKE 'none|wildcard_table'
POSTHOOK: type: SHOWTABLES
POSTHOOK: Input: database: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
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 '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: 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
Loading