This is an automated email from the ASF dual-hosted git repository.
soumyakanti3578 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new a1c1a12b278 HIVE-29618: fix multiline string matches for vectorization
too (follows up on HIVE-22008) (#6494)
a1c1a12b278 is described below
commit a1c1a12b2788ae54825d94e4c18f3d711d2d9f5c
Author: konstantinb <[email protected]>
AuthorDate: Tue May 19 11:25:51 2026 -0700
HIVE-29618: fix multiline string matches for vectorization too (follows up
on HIVE-22008) (#6494)
---
.../AbstractFilterStringColLikeStringScalar.java | 2 +-
.../expressions/TestVectorStringExpressions.java | 27 +++++
ql/src/test/queries/clientpositive/udf_like.q | 33 ++++++
.../results/clientpositive/llap/udf_like.q.out | 129 +++++++++++++++++++++
4 files changed, 190 insertions(+), 1 deletion(-)
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/AbstractFilterStringColLikeStringScalar.java
b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/AbstractFilterStringColLikeStringScalar.java
index 542c6b38149..f26c1910387 100644
---
a/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/AbstractFilterStringColLikeStringScalar.java
+++
b/ql/src/java/org/apache/hadoop/hive/ql/exec/vector/expressions/AbstractFilterStringColLikeStringScalar.java
@@ -419,7 +419,7 @@ protected static final class ComplexChecker implements
Checker {
FastUTF8Decoder decoder;
public ComplexChecker(String pattern) {
- compiledPattern = Pattern.compile(pattern);
+ compiledPattern = Pattern.compile(pattern, Pattern.DOTALL);
matcher = compiledPattern.matcher("");
decoder = new FastUTF8Decoder();
}
diff --git
a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorStringExpressions.java
b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorStringExpressions.java
index 22ac562c43a..001996182c4 100644
---
a/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorStringExpressions.java
+++
b/ql/src/test/org/apache/hadoop/hive/ql/exec/vector/expressions/TestVectorStringExpressions.java
@@ -4407,6 +4407,33 @@ public void testStringLikePatternType() throws
HiveException {
expr.checker.getClass());
}
+ // Regression: vec ComplexChecker must apply Pattern.DOTALL (mirroring
HIVE-22008).
+ @Test
+ public void testStringLikeComplexCheckerMultiLine() throws HiveException {
+ VectorizedRowBatch batch = new VectorizedRowBatch(1);
+ BytesColumnVector col = new BytesColumnVector();
+ batch.cols[0] = col;
+ byte[] rowA = "first\nsecond".getBytes(StandardCharsets.UTF_8);
+ byte[] rowB = "first_second\nthird".getBytes(StandardCharsets.UTF_8);
+ col.setRef(0, rowA, 0, rowA.length);
+ col.setRef(1, rowB, 0, rowB.length);
+ col.isNull[0] = false;
+ col.isNull[1] = false;
+ col.noNulls = true;
+ batch.size = 2;
+
+ FilterStringColLikeStringScalar expr =
+ new FilterStringColLikeStringScalar(0,
"%first_second%".getBytes(StandardCharsets.UTF_8));
+ expr.transientInit(hiveConf);
+ Assert.assertEquals(FilterStringColLikeStringScalar.ComplexChecker.class,
+ expr.checker.getClass());
+
+ expr.evaluate(batch);
+
+ // Both rows must survive the LIKE filter.
+ Assert.assertEquals(2, batch.size);
+ }
+
@Test
public void testStringLikeMultiByte() throws HiveException {
FilterStringColLikeStringScalar expr;
diff --git a/ql/src/test/queries/clientpositive/udf_like.q
b/ql/src/test/queries/clientpositive/udf_like.q
index a4a7251bf28..89364aee78f 100644
--- a/ql/src/test/queries/clientpositive/udf_like.q
+++ b/ql/src/test/queries/clientpositive/udf_like.q
@@ -28,3 +28,36 @@ FROM src tablesample (1 rows);
CREATE TEMPORARY TABLE SplitLines(`id` string) STORED AS ORC;
INSERT INTO SplitLines SELECT 'withdraw\ncash';
SELECT `id` LIKE '%withdraw%cash' FROM SplitLines ;
+
+CREATE TABLE SplitLinesUnderscore (q STRING) STORED AS ORC;
+INSERT INTO SplitLinesUnderscore
+ SELECT 'first\nsecond' UNION ALL SELECT 'first_second\nthird';
+SELECT count(*) FROM SplitLinesUnderscore WHERE q LIKE '%first_second%';
+
+-- Repeat with vectorization off to ensure consistency either way
+set hive.vectorized.execution.enabled=false;
+
+DESCRIBE FUNCTION like;
+DESCRIBE FUNCTION EXTENDED like;
+
+EXPLAIN
+SELECT '_%_' LIKE '%\_\%\_%', '__' LIKE '%\_\%\_%', '%%_%_' LIKE '%\_\%\_%',
'%_%_%' LIKE '%\%\_\%',
+ '_%_' LIKE '\%\_%', '%__' LIKE '__\%%', '_%' LIKE '\_\%\_\%%', '_%' LIKE
'\_\%_%',
+ '%_' LIKE '\%\_', 'ab' LIKE '\%\_', 'ab' LIKE '_a%', 'ab' LIKE 'a','ab' LIKE
'','' LIKE ''
+FROM src WHERE src.key = 86;
+
+SELECT '_%_' LIKE '%\_\%\_%', '__' LIKE '%\_\%\_%', '%%_%_' LIKE '%\_\%\_%',
'%_%_%' LIKE '%\%\_\%',
+ '_%_' LIKE '\%\_%', '%__' LIKE '__\%%', '_%' LIKE '\_\%\_\%%', '_%' LIKE
'\_\%_%',
+ '%_' LIKE '\%\_', 'ab' LIKE '\%\_', 'ab' LIKE '_a%', 'ab' LIKE 'a','ab' LIKE
'','' LIKE ''
+FROM src WHERE src.key = 86;
+
+
+SELECT '1+2' LIKE '_+_',
+ '1+2' LIKE '1+_',
+ '112' LIKE '1+_',
+ '|||' LIKE '|_|',
+ '+++' LIKE '1+_'
+FROM src tablesample (1 rows);
+
+SELECT `id` LIKE '%withdraw%cash' FROM SplitLines;
+SELECT count(*) FROM SplitLinesUnderscore WHERE q LIKE '%first_second%';
diff --git a/ql/src/test/results/clientpositive/llap/udf_like.q.out
b/ql/src/test/results/clientpositive/llap/udf_like.q.out
index 3c86fa7feec..f8a8ac6e1ce 100644
--- a/ql/src/test/results/clientpositive/llap/udf_like.q.out
+++ b/ql/src/test/results/clientpositive/llap/udf_like.q.out
@@ -107,3 +107,132 @@ POSTHOOK: type: QUERY
POSTHOOK: Input: default@splitlines
#### A masked pattern was here ####
true
+PREHOOK: query: CREATE TABLE SplitLinesUnderscore (q STRING) STORED AS ORC
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@SplitLinesUnderscore
+POSTHOOK: query: CREATE TABLE SplitLinesUnderscore (q STRING) STORED AS ORC
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@SplitLinesUnderscore
+PREHOOK: query: INSERT INTO SplitLinesUnderscore
+ SELECT 'first\nsecond' UNION ALL SELECT 'first_second\nthird'
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@splitlinesunderscore
+POSTHOOK: query: INSERT INTO SplitLinesUnderscore
+ SELECT 'first\nsecond' UNION ALL SELECT 'first_second\nthird'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@splitlinesunderscore
+POSTHOOK: Lineage: splitlinesunderscore.q SCRIPT []
+PREHOOK: query: SELECT count(*) FROM SplitLinesUnderscore WHERE q LIKE
'%first_second%'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@splitlinesunderscore
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT count(*) FROM SplitLinesUnderscore WHERE q LIKE
'%first_second%'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@splitlinesunderscore
+#### A masked pattern was here ####
+2
+PREHOOK: query: DESCRIBE FUNCTION like
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION like
+POSTHOOK: type: DESCFUNCTION
+like(str, pattern) - Checks if str matches pattern
+PREHOOK: query: DESCRIBE FUNCTION EXTENDED like
+PREHOOK: type: DESCFUNCTION
+POSTHOOK: query: DESCRIBE FUNCTION EXTENDED like
+POSTHOOK: type: DESCFUNCTION
+like(str, pattern) - Checks if str matches pattern
+Example:
+ > SELECT a.* FROM srcpart a WHERE a.hr like '%2' LIMIT 1;
+ 27 val_27 2008-04-08 12
+Function class:org.apache.hadoop.hive.ql.udf.UDFLike
+Function type:BUILTIN
+PREHOOK: query: EXPLAIN
+SELECT '_%_' LIKE '%\_\%\_%', '__' LIKE '%\_\%\_%', '%%_%_' LIKE '%\_\%\_%',
'%_%_%' LIKE '%\%\_\%',
+ '_%_' LIKE '\%\_%', '%__' LIKE '__\%%', '_%' LIKE '\_\%\_\%%', '_%' LIKE
'\_\%_%',
+ '%_' LIKE '\%\_', 'ab' LIKE '\%\_', 'ab' LIKE '_a%', 'ab' LIKE 'a','ab' LIKE
'','' LIKE ''
+FROM src WHERE src.key = 86
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: EXPLAIN
+SELECT '_%_' LIKE '%\_\%\_%', '__' LIKE '%\_\%\_%', '%%_%_' LIKE '%\_\%\_%',
'%_%_%' LIKE '%\%\_\%',
+ '_%_' LIKE '\%\_%', '%__' LIKE '__\%%', '_%' LIKE '\_\%\_\%%', '_%' LIKE
'\_\%_%',
+ '%_' LIKE '\%\_', 'ab' LIKE '\%\_', 'ab' LIKE '_a%', 'ab' LIKE 'a','ab' LIKE
'','' LIKE ''
+FROM src WHERE src.key = 86
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+STAGE DEPENDENCIES:
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+ Processor Tree:
+ TableScan
+ alias: src
+ filterExpr: (UDFToDouble(key) = 86.0D) (type: boolean)
+ Filter Operator
+ predicate: (UDFToDouble(key) = 86.0D) (type: boolean)
+ Select Operator
+ expressions: true (type: boolean), false (type: boolean), true
(type: boolean), true (type: boolean), false (type: boolean), false (type:
boolean), false (type: boolean), false (type: boolean), true (type: boolean),
false (type: boolean), false (type: boolean), false (type: boolean), false
(type: boolean), true (type: boolean)
+ outputColumnNames: _col0, _col1, _col2, _col3, _col4, _col5,
_col6, _col7, _col8, _col9, _col10, _col11, _col12, _col13
+ ListSink
+
+PREHOOK: query: SELECT '_%_' LIKE '%\_\%\_%', '__' LIKE '%\_\%\_%', '%%_%_'
LIKE '%\_\%\_%', '%_%_%' LIKE '%\%\_\%',
+ '_%_' LIKE '\%\_%', '%__' LIKE '__\%%', '_%' LIKE '\_\%\_\%%', '_%' LIKE
'\_\%_%',
+ '%_' LIKE '\%\_', 'ab' LIKE '\%\_', 'ab' LIKE '_a%', 'ab' LIKE 'a','ab' LIKE
'','' LIKE ''
+FROM src WHERE src.key = 86
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT '_%_' LIKE '%\_\%\_%', '__' LIKE '%\_\%\_%', '%%_%_'
LIKE '%\_\%\_%', '%_%_%' LIKE '%\%\_\%',
+ '_%_' LIKE '\%\_%', '%__' LIKE '__\%%', '_%' LIKE '\_\%\_\%%', '_%' LIKE
'\_\%_%',
+ '%_' LIKE '\%\_', 'ab' LIKE '\%\_', 'ab' LIKE '_a%', 'ab' LIKE 'a','ab' LIKE
'','' LIKE ''
+FROM src WHERE src.key = 86
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+true false true true false false false false true false
false false false true
+PREHOOK: query: SELECT '1+2' LIKE '_+_',
+ '1+2' LIKE '1+_',
+ '112' LIKE '1+_',
+ '|||' LIKE '|_|',
+ '+++' LIKE '1+_'
+FROM src tablesample (1 rows)
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT '1+2' LIKE '_+_',
+ '1+2' LIKE '1+_',
+ '112' LIKE '1+_',
+ '|||' LIKE '|_|',
+ '+++' LIKE '1+_'
+FROM src tablesample (1 rows)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+#### A masked pattern was here ####
+true true false true false
+PREHOOK: query: SELECT `id` LIKE '%withdraw%cash' FROM SplitLines
+PREHOOK: type: QUERY
+PREHOOK: Input: default@splitlines
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT `id` LIKE '%withdraw%cash' FROM SplitLines
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@splitlines
+#### A masked pattern was here ####
+true
+PREHOOK: query: SELECT count(*) FROM SplitLinesUnderscore WHERE q LIKE
'%first_second%'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@splitlinesunderscore
+#### A masked pattern was here ####
+POSTHOOK: query: SELECT count(*) FROM SplitLinesUnderscore WHERE q LIKE
'%first_second%'
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@splitlinesunderscore
+#### A masked pattern was here ####
+2