This is an automated email from the ASF dual-hosted git repository. mblow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit a14b016ba1645bef2d015843e15bdba6c1c2859d Author: Ali Alsuliman <[email protected]> AuthorDate: Tue Oct 8 13:41:57 2019 -0700 [ASTERIXDB-2651][RT][FUN] Handle matching a literal backslash properly in LIKE - user model changes: no - storage format changes: no - interface changes: no Details: - fixed an issue in the build() of RegExpMatcher where the "flags" argument gets ignored if the flags argument does not change in the subsequent evaluation of the regexp_* functions over the tuples of dataset. - added the missing Java regex meta characters. - split test case "regexp_replace" into two, "regexp_replace" & "regexp_replace_with_flag". Change-Id: I4f218f87f0c1736e2d8b5de07221d7efa0f9aef1 Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/3614 Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Ali Alsuliman <[email protected]> Reviewed-by: Dmitry Lychagin <[email protected]> --- .../like_02.1.ddl.sqlpp} | 7 +- .../like_02.2.update.sqlpp} | 12 ++- .../like_02.3.query.sqlpp} | 19 +++- .../like_02.4.query.sqlpp} | 4 +- .../like_02.5.ddl.sqlpp} | 4 +- .../like_03_negative.1.query.sqlpp} | 6 +- .../like_03_negative.2.query.sqlpp} | 6 +- .../regexp_contains.1.ddl.sqlpp} | 7 +- .../regexp_contains.2.update.sqlpp} | 13 ++- ...1.query.sqlpp => regexp_contains.3.query.sqlpp} | 0 .../regexp_contains.4.query.sqlpp} | 4 +- .../regexp_contains.5.ddl.sqlpp} | 4 +- .../regexp_contains_with_flag.1.ddl.sqlpp} | 7 +- .../regexp_contains_with_flag.2.update.sqlpp} | 21 ++-- ...lpp => regexp_contains_with_flag.3.query.sqlpp} | 0 .../regexp_contains_with_flag.4.query.sqlpp} | 4 +- .../regexp_contains_with_flags.5.ddl.sqlpp} | 4 +- .../regexp_like.1.ddl.sqlpp} | 7 +- .../regexp_like.2.update.sqlpp} | 13 ++- ...ike.1.query.sqlpp => regexp_like.3.query.sqlpp} | 0 .../regexp_like.4.query.sqlpp} | 4 +- .../regexp_like.5.ddl.sqlpp} | 4 +- .../regexp_like_with_flag.1.ddl.sqlpp} | 7 +- .../regexp_like_with_flag.2.update.sqlpp} | 16 ++- ...y.sqlpp => regexp_like_with_flag.3.query.sqlpp} | 0 .../regexp_like_with_flag.4.query.sqlpp} | 4 +- .../regexp_like_with_flags.5.ddl.sqlpp} | 4 +- .../regexp_position.1.ddl.sqlpp} | 7 +- .../regexp_position.2.update.sqlpp} | 13 ++- ...1.query.sqlpp => regexp_position.3.query.sqlpp} | 0 .../regexp_position.4.query.sqlpp} | 4 +- .../regexp_position.5.ddl.sqlpp} | 4 +- ...sqlpp => regexp_position_with_flag.1.ddl.sqlpp} | 7 +- .../regexp_position_with_flag.2.update.sqlpp} | 16 ++- ...lpp => regexp_position_with_flag.3.query.sqlpp} | 0 ...lpp => regexp_position_with_flag.4.query.sqlpp} | 4 +- .../regexp_position_with_flags.5.ddl.sqlpp} | 4 +- .../regexp_replace.1.ddl.sqlpp} | 7 +- ...5.query.sqlpp => regexp_replace.2.update.sqlpp} | 13 ++- .../regexp_replace/regexp_replace.3.query.sqlpp | 11 ++- .../regexp_replace/regexp_replace.4.query.sqlpp | 6 +- ...ce.3.query.sqlpp => regexp_replace.5.ddl.sqlpp} | 4 +- .../regexp_replace/regexp_replace.6.query.sqlpp | 26 ----- .../regexp_replace_with_flag.1.ddl.sqlpp} | 7 +- .../regexp_replace_with_flag.2.update.sqlpp} | 16 ++- .../regexp_replace_with_flag.3.query.sqlpp} | 35 ++++--- .../regexp_replace_with_flag.4.query.sqlpp} | 4 +- .../regexp_replace_with_flag.5.ddl.sqlpp} | 4 +- .../runtimets/results/string/like_02/like_02.3.adm | 11 +++ .../runtimets/results/string/like_02/like_02.4.adm | 3 + .../string/regexp_contains/regexp_contains.3.adm | 15 +++ .../string/regexp_contains/regexp_contains.4.adm | 4 + .../regexp_contains_with_flag.3.adm | 1 + .../regexp_contains_with_flag.4.adm | 7 ++ .../{regexp_like.1.adm => regexp_like.3.adm} | 0 .../results/string/regexp_like/regexp_like.4.adm | 4 + .../regexp_like_with_flag.3.adm | 1 + .../regexp_like_with_flag.4.adm | 7 ++ ...regexp_position.1.adm => regexp_position.3.adm} | 0 .../string/regexp_position/regexp_position.4.adm | 4 + ..._flag.1.adm => regexp_position_with_flag.3.adm} | 0 .../regexp_position_with_flag.4.adm | 7 ++ .../string/regexp_replace/regexp_replace.1.adm | 1 - .../string/regexp_replace/regexp_replace.2.adm | 1 - .../string/regexp_replace/regexp_replace.3.adm | 6 +- .../string/regexp_replace/regexp_replace.4.adm | 5 +- .../string/regexp_replace/regexp_replace.5.adm | 1 - .../string/regexp_replace/regexp_replace.6.adm | 1 - .../regexp_replace_with_flag.3.adm | 16 +++ .../regexp_replace_with_flag.4.adm | 7 ++ .../test/resources/runtimets/testsuite_sqlpp.xml | 23 ++++- .../asterix/common/exceptions/ErrorCode.java | 1 + .../src/main/resources/asx_errormsg/en.properties | 1 + .../functions/AbstractBinaryStringBoolEval.java | 4 +- .../functions/AbstractBinaryStringEval.java | 2 +- .../functions/StringContainsDescriptor.java | 4 +- .../functions/StringEndsWithDescriptor.java | 4 +- .../functions/StringEqualDescriptor.java | 4 +- .../evaluators/functions/StringEvaluatorUtils.java | 33 ++----- .../evaluators/functions/StringLikeDescriptor.java | 108 ++++++++++++++++----- .../functions/StringRegExpContainsDescriptor.java | 4 +- .../StringRegExpContainsWithFlagDescriptor.java | 2 +- .../functions/StringRegExpLikeDescriptor.java | 4 +- .../StringRegExpLikeWithFlagDescriptor.java | 2 +- .../functions/StringRegExpPositionDescriptor.java | 5 +- .../StringRegExpPositionWithFlagDescriptor.java | 4 +- .../functions/StringRegExpReplaceDescriptor.java | 2 +- .../functions/StringStartsWithDescriptor.java | 4 +- .../evaluators/functions/utils/RegExpMatcher.java | 53 +++++----- 89 files changed, 469 insertions(+), 270 deletions(-) diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.1.ddl.sqlpp similarity index 86% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.1.ddl.sqlpp index 6568d06..7c48143 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.1.ddl.sqlpp @@ -17,4 +17,9 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; +USE test; + +CREATE TYPE t AS {id: int}; +CREATE DATASET ds(t) PRIMARY KEY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.2.update.sqlpp similarity index 79% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.2.update.sqlpp index 600abe0..37db984 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.2.update.sqlpp @@ -17,8 +17,10 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','Bra','kkk',''), - 'result2':regexp_replace('abracadabra','Bra','kkk','i'), - 'result3':regexp_replace('helloworld','hello world','kkk','x') -}; +USE test; + +INSERT INTO ds [ +{"id": 1, "test_str": "hello \n world", "pattern": "%world"}, +{"id": 2, "test_str": "hello \n world", "pattern": "%orld"}, +{"id": 3, "test_str": "hello \n world", "pattern": "%orld"} +]; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.3.query.sqlpp similarity index 68% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.3.query.sqlpp index 600abe0..9640747 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.3.query.sqlpp @@ -17,8 +17,17 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','Bra','kkk',''), - 'result2':regexp_replace('abracadabra','Bra','kkk','i'), - 'result3':regexp_replace('helloworld','hello world','kkk','x') -}; +SELECT ELEMENT A FROM [ + "test\\string" LIKE "%\\\\%", + "abc ()/\\[]{}.,<>~!@#$%&*-_+=|;:'\"?" LIKE "%\\%", + "abc ()/\\[]{}.,<>~!@#$%&*-_+=|;:'\"?%" LIKE "%\\%", + + 'ab\\c' LIKE '__\\\\c', + 'abc\\' LIKE '\\___', + '\\abc' LIKE '\\___', + '\\abc' LIKE '\\\\___', + '_abc' LIKE '\\___', + '_ab' LIKE '\\___', + 'tg\n' LIKE '__\n', + 'tg\\\n' LIKE '__\\\\_' +] AS A; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.4.query.sqlpp similarity index 92% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.4.query.sqlpp index 6568d06..b478f4e 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.4.query.sqlpp @@ -17,4 +17,6 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +USE test; + +FROM ds SELECT VALUE test_str LIKE pattern ORDER BY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.5.ddl.sqlpp similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.5.ddl.sqlpp index 910e476..36b2bab 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.5.ddl.sqlpp @@ -17,6 +17,4 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','bra','*') -}; +DROP DATAVERSE test IF EXISTS; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_03_negative/like_03_negative.1.query.sqlpp similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_03_negative/like_03_negative.1.query.sqlpp index 910e476..d3595fe 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_03_negative/like_03_negative.1.query.sqlpp @@ -17,6 +17,6 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','bra','*') -}; +SELECT ELEMENT A FROM [ + 'ab\\c' LIKE '__\\c' +] AS A; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_03_negative/like_03_negative.2.query.sqlpp similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.4.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_03_negative/like_03_negative.2.query.sqlpp index b43481f..018c5fa 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.4.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_03_negative/like_03_negative.2.query.sqlpp @@ -17,6 +17,6 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','a.*a','*') -}; +SELECT ELEMENT A FROM [ + "test\\string" LIKE "%\\" +] AS A; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.1.ddl.sqlpp similarity index 86% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.1.ddl.sqlpp index 6568d06..7c48143 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.1.ddl.sqlpp @@ -17,4 +17,9 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; +USE test; + +CREATE TYPE t AS {id: int}; +CREATE DATASET ds(t) PRIMARY KEY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.2.update.sqlpp similarity index 77% rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.2.update.sqlpp index a158d7f..76de6d1 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.2.update.sqlpp @@ -17,8 +17,11 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','a',''), - 'result2':regexp_replace('abracadabra','a(.)','a$1$1'), - 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2') -}; +USE test; + +INSERT INTO ds [ +{"id": 1, "test_str": "hello world", "pattern": "\\w"}, +{"id": 2, "test_str": "\n", "pattern": "\\w"}, +{"id": 3, "test_str": "hello world", "pattern": "\\d"}, +{"id": 4, "test_str": "\n", "pattern": "\\w"} +]; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.3.query.sqlpp similarity index 100% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.3.query.sqlpp diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.4.query.sqlpp similarity index 91% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.4.query.sqlpp index 6568d06..7090ce4 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.4.query.sqlpp @@ -17,4 +17,6 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +USE test; + +FROM ds SELECT VALUE regexp_contains(test_str, pattern) ORDER BY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.5.ddl.sqlpp similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.5.ddl.sqlpp index 910e476..36b2bab 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.5.ddl.sqlpp @@ -17,6 +17,4 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','bra','*') -}; +DROP DATAVERSE test IF EXISTS; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flag.1.ddl.sqlpp similarity index 86% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flag.1.ddl.sqlpp index 6568d06..7c48143 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flag.1.ddl.sqlpp @@ -17,4 +17,9 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; +USE test; + +CREATE TYPE t AS {id: int}; +CREATE DATASET ds(t) PRIMARY KEY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flag.2.update.sqlpp similarity index 62% rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.1.query.sqlpp rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flag.2.update.sqlpp index fbdf750..55e2b8e 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flag.2.update.sqlpp @@ -17,13 +17,14 @@ * under the License. */ -{ - 'result1':REGEXP_REPLACE('abracadabra','',null,null), - 'result2':REGEXP_REPLACE('abracadabra','bra','XXX',''), - 'result3':REGEXP_REPLACE(null,'hello world','XxXx','x'), - 'result4':REGEXP_REPLACE('abracadabra','bra','XXX',null), - 'result5':REGEXP_REPLACE('abracadabra',null,'XXX',null), - 'result6':REGEXP_REPLACE('abracadabra','Bra',null,'i'), - 'result7':REGEXP_REPLACE('abracadabra','Bra','','i'), - 'result8':REGEXP_REPLACE('abracadabra','','XXX','') -}; +USE test; + +INSERT INTO ds [ +{"id": 1, "test_str": "hello world", "pattern": "h", "flags": "i"}, +{"id": 2, "test_str": "hello world", "pattern": "H", "flags": "i"}, +{"id": 3, "test_str": "hello world", "pattern": "H", "flags": "i"}, +{"id": 4, "test_str": "hello world", "pattern": "H", "flags": "s"}, +{"id": 5, "test_str": "hello world", "pattern": "H", "flags": "s"}, +{"id": 6, "test_str": "\n", "pattern": ".", "flags": "s"}, +{"id": 7, "test_str": "\n", "pattern": ".", "flags": ""} +]; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flag.3.query.sqlpp similarity index 100% rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains.1.query.sqlpp rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flag.3.query.sqlpp diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flag.4.query.sqlpp similarity index 90% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flag.4.query.sqlpp index 6568d06..199d20f 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flag.4.query.sqlpp @@ -17,4 +17,6 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +USE test; + +FROM ds SELECT VALUE regexp_contains(test_str, pattern, flags) ORDER BY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flags.5.ddl.sqlpp similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flags.5.ddl.sqlpp index 910e476..36b2bab 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flags.5.ddl.sqlpp @@ -17,6 +17,4 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','bra','*') -}; +DROP DATAVERSE test IF EXISTS; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.1.ddl.sqlpp similarity index 86% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.1.ddl.sqlpp index 6568d06..7c48143 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.1.ddl.sqlpp @@ -17,4 +17,9 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; +USE test; + +CREATE TYPE t AS {id: int}; +CREATE DATASET ds(t) PRIMARY KEY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.2.update.sqlpp similarity index 77% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.2.update.sqlpp index 600abe0..300a5f2 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.2.update.sqlpp @@ -17,8 +17,11 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','Bra','kkk',''), - 'result2':regexp_replace('abracadabra','Bra','kkk','i'), - 'result3':regexp_replace('helloworld','hello world','kkk','x') -}; +USE test; + +INSERT INTO ds [ +{"id": 1, "test_str": "hello_world", "pattern": "\\w+"}, +{"id": 2, "test_str": "\n", "pattern": "\\w+"}, +{"id": 3, "test_str": "hello_world", "pattern": "\\d+"}, +{"id": 4, "test_str": "\n", "pattern": "\\w+"} +]; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.3.query.sqlpp similarity index 100% rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.1.query.sqlpp rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.3.query.sqlpp diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.4.query.sqlpp similarity index 91% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.4.query.sqlpp index 6568d06..de3d809 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.4.query.sqlpp @@ -17,4 +17,6 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +USE test; + +FROM ds SELECT VALUE regexp_like(test_str, pattern) ORDER BY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.5.ddl.sqlpp similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.5.ddl.sqlpp index 910e476..36b2bab 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.5.ddl.sqlpp @@ -17,6 +17,4 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','bra','*') -}; +DROP DATAVERSE test IF EXISTS; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.1.ddl.sqlpp similarity index 86% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.1.ddl.sqlpp index 6568d06..7c48143 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.1.ddl.sqlpp @@ -17,4 +17,9 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; +USE test; + +CREATE TYPE t AS {id: int}; +CREATE DATASET ds(t) PRIMARY KEY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.2.update.sqlpp similarity index 61% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.2.update.sqlpp index 600abe0..b5ab61a 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.2.update.sqlpp @@ -17,8 +17,14 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','Bra','kkk',''), - 'result2':regexp_replace('abracadabra','Bra','kkk','i'), - 'result3':regexp_replace('helloworld','hello world','kkk','x') -}; +USE test; + +INSERT INTO ds [ +{"id": 1, "test_str": "hello_world", "pattern": "h\\w+", "flags": "i"}, +{"id": 2, "test_str": "hello_world", "pattern": "H\\w+", "flags": "i"}, +{"id": 3, "test_str": "hello_world", "pattern": "H\\w+", "flags": "i"}, +{"id": 4, "test_str": "hello_world", "pattern": "H\\w+", "flags": "s"}, +{"id": 5, "test_str": "hello_world", "pattern": "H\\w+", "flags": "s"}, +{"id": 6, "test_str": "\n", "pattern": ".", "flags": "s"}, +{"id": 7, "test_str": "\n", "pattern": ".", "flags": ""} +]; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.3.query.sqlpp similarity index 100% rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.1.query.sqlpp rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.3.query.sqlpp diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.4.query.sqlpp similarity index 90% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.4.query.sqlpp index 6568d06..199d20f 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flag.4.query.sqlpp @@ -17,4 +17,6 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +USE test; + +FROM ds SELECT VALUE regexp_contains(test_str, pattern, flags) ORDER BY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flags.5.ddl.sqlpp similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flags.5.ddl.sqlpp index 910e476..36b2bab 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like_with_flag/regexp_like_with_flags.5.ddl.sqlpp @@ -17,6 +17,4 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','bra','*') -}; +DROP DATAVERSE test IF EXISTS; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.1.ddl.sqlpp similarity index 86% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.1.ddl.sqlpp index 6568d06..7c48143 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.1.ddl.sqlpp @@ -17,4 +17,9 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; +USE test; + +CREATE TYPE t AS {id: int}; +CREATE DATASET ds(t) PRIMARY KEY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.2.update.sqlpp similarity index 77% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.2.update.sqlpp index 600abe0..300a5f2 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.2.update.sqlpp @@ -17,8 +17,11 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','Bra','kkk',''), - 'result2':regexp_replace('abracadabra','Bra','kkk','i'), - 'result3':regexp_replace('helloworld','hello world','kkk','x') -}; +USE test; + +INSERT INTO ds [ +{"id": 1, "test_str": "hello_world", "pattern": "\\w+"}, +{"id": 2, "test_str": "\n", "pattern": "\\w+"}, +{"id": 3, "test_str": "hello_world", "pattern": "\\d+"}, +{"id": 4, "test_str": "\n", "pattern": "\\w+"} +]; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.3.query.sqlpp similarity index 100% rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.1.query.sqlpp rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.3.query.sqlpp diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.4.query.sqlpp similarity index 91% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.4.query.sqlpp index 6568d06..7bd4fad 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.4.query.sqlpp @@ -17,4 +17,6 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +USE test; + +FROM ds SELECT VALUE regexp_position(test_str, pattern) ORDER BY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.5.ddl.sqlpp similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.5.ddl.sqlpp index 910e476..36b2bab 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.5.ddl.sqlpp @@ -17,6 +17,4 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','bra','*') -}; +DROP DATAVERSE test IF EXISTS; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.ddl.sqlpp similarity index 86% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.ddl.sqlpp index 6568d06..7c48143 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.ddl.sqlpp @@ -17,4 +17,9 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; +USE test; + +CREATE TYPE t AS {id: int}; +CREATE DATASET ds(t) PRIMARY KEY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.2.update.sqlpp similarity index 61% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.2.update.sqlpp index 600abe0..b5ab61a 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.2.update.sqlpp @@ -17,8 +17,14 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','Bra','kkk',''), - 'result2':regexp_replace('abracadabra','Bra','kkk','i'), - 'result3':regexp_replace('helloworld','hello world','kkk','x') -}; +USE test; + +INSERT INTO ds [ +{"id": 1, "test_str": "hello_world", "pattern": "h\\w+", "flags": "i"}, +{"id": 2, "test_str": "hello_world", "pattern": "H\\w+", "flags": "i"}, +{"id": 3, "test_str": "hello_world", "pattern": "H\\w+", "flags": "i"}, +{"id": 4, "test_str": "hello_world", "pattern": "H\\w+", "flags": "s"}, +{"id": 5, "test_str": "hello_world", "pattern": "H\\w+", "flags": "s"}, +{"id": 6, "test_str": "\n", "pattern": ".", "flags": "s"}, +{"id": 7, "test_str": "\n", "pattern": ".", "flags": ""} +]; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.3.query.sqlpp similarity index 100% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.3.query.sqlpp diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.4.query.sqlpp similarity index 90% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.4.query.sqlpp index 6568d06..48c7aac 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.4.query.sqlpp @@ -17,4 +17,6 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +USE test; + +FROM ds SELECT VALUE regexp_position(test_str, pattern, flags) ORDER BY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flags.5.ddl.sqlpp similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flags.5.ddl.sqlpp index 910e476..36b2bab 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flags.5.ddl.sqlpp @@ -17,6 +17,4 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','bra','*') -}; +DROP DATAVERSE test IF EXISTS; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.1.ddl.sqlpp similarity index 86% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.1.ddl.sqlpp index 6568d06..7c48143 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.1.ddl.sqlpp @@ -17,4 +17,9 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; +USE test; + +CREATE TYPE t AS {id: int}; +CREATE DATASET ds(t) PRIMARY KEY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.update.sqlpp similarity index 77% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.update.sqlpp index 600abe0..300a5f2 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.update.sqlpp @@ -17,8 +17,11 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','Bra','kkk',''), - 'result2':regexp_replace('abracadabra','Bra','kkk','i'), - 'result3':regexp_replace('helloworld','hello world','kkk','x') -}; +USE test; + +INSERT INTO ds [ +{"id": 1, "test_str": "hello_world", "pattern": "\\w+"}, +{"id": 2, "test_str": "\n", "pattern": "\\w+"}, +{"id": 3, "test_str": "hello_world", "pattern": "\\d+"}, +{"id": 4, "test_str": "\n", "pattern": "\\w+"} +]; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp index 910e476..efd0084 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp @@ -17,6 +17,11 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','bra','*') -}; +select element a +from [ + regexp_replace('abracadabra','a',''), + regexp_replace('abracadabra','a(.)','a$1$1'), + regexp_replace('darted','^(.*?)d(.*)$','$1c$2'), + regexp_replace('abracadabra','bra','*'), + regexp_replace('abracadabra','a.*a','*') +] as a; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.4.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.4.query.sqlpp index b43481f..cbb55de 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.4.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.4.query.sqlpp @@ -17,6 +17,6 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','a.*a','*') -}; +USE test; + +FROM ds SELECT VALUE regexp_replace(test_str, pattern, "REPLACED") ORDER BY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.ddl.sqlpp similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.ddl.sqlpp index 910e476..36b2bab 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.ddl.sqlpp @@ -17,6 +17,4 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','bra','*') -}; +DROP DATAVERSE test IF EXISTS; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.6.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.6.query.sqlpp deleted file mode 100644 index 94deadc..0000000 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.6.query.sqlpp +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -{ - 'result1':regexp_replace('abracadabra','bra','kkk',-1), - 'result2':regexp_replace('abracadabra','bra','kkk',0), - 'result3':regexp_replace('abracadabra','bra','kkk',1), - 'result4':regexp_replace('abracadabra_abracadabra','bra','kkk',2), - 'result5':regexp_replace('abracadabra_abracadabra','bra','kkk',5) -}; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.1.ddl.sqlpp similarity index 86% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.1.ddl.sqlpp index 6568d06..7c48143 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.1.ddl.sqlpp @@ -17,4 +17,9 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +DROP DATAVERSE test IF EXISTS; +CREATE DATAVERSE test; +USE test; + +CREATE TYPE t AS {id: int}; +CREATE DATASET ds(t) PRIMARY KEY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.2.update.sqlpp similarity index 61% rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.2.update.sqlpp index 600abe0..b5ab61a 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.2.update.sqlpp @@ -17,8 +17,14 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','Bra','kkk',''), - 'result2':regexp_replace('abracadabra','Bra','kkk','i'), - 'result3':regexp_replace('helloworld','hello world','kkk','x') -}; +USE test; + +INSERT INTO ds [ +{"id": 1, "test_str": "hello_world", "pattern": "h\\w+", "flags": "i"}, +{"id": 2, "test_str": "hello_world", "pattern": "H\\w+", "flags": "i"}, +{"id": 3, "test_str": "hello_world", "pattern": "H\\w+", "flags": "i"}, +{"id": 4, "test_str": "hello_world", "pattern": "H\\w+", "flags": "s"}, +{"id": 5, "test_str": "hello_world", "pattern": "H\\w+", "flags": "s"}, +{"id": 6, "test_str": "\n", "pattern": ".", "flags": "s"}, +{"id": 7, "test_str": "\n", "pattern": ".", "flags": ""} +]; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.3.query.sqlpp similarity index 50% rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.1.query.sqlpp rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.3.query.sqlpp index a639365..90504e5 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.3.query.sqlpp @@ -17,23 +17,22 @@ * under the License. */ - select element a from [ - REGEXP_CONTAINS('mnop','.'), - REGEXP_CONTAINS('abcdefABCDEF','/d'), - REGEXP_CONTAINS('12345','\\d'), - REGEXP_CONTAINS('abcdefGHIJK','\\D'), - REGEXP_CONTAINS(' ','\\s'), - REGEXP_CONTAINS(' ','\\S'), - REGEXP_CONTAINS('Welcome to pattern matching!','[a-zA-Z_0-9]'), - REGEXP_CONTAINS('!@#$%^&*()','[a-zA-Z_0-9]'), - REGEXP_CONTAINS('!@#$%^&*()','[^\\W]'), - REGEXP_CONTAINS('!@#$%^&*','[^\\w]'), - REGEXP_CONTAINS('0xffff','[\\p{XDigit}]'), - REGEXP_CONTAINS('FFFFFFFF','[\\p{XDigit}]'), - REGEXP_CONTAINS('abcdefgh','[\\p{javaLowerCase}]'), - REGEXP_CONTAINS('ABCDEF','[\\p{javaLowerCase}]'), - REGEXP_CONTAINS(`codepoint-to-string`([163]),'[\\p{Sc}]') - ] as a -; + regexp_replace('abracadabra','',null,null), + regexp_replace('abracadabra','bra','XXX',''), + regexp_replace(null,'hello world','XxXx','x'), + regexp_replace('abracadabra','bra','XXX',null), + regexp_replace('abracadabra',null,'XXX',null), + regexp_replace('abracadabra','Bra',null,'i'), + regexp_replace('abracadabra','Bra','','i'), + regexp_replace('abracadabra','','XXX',''), + regexp_replace('abracadabra','Bra','kkk',''), + regexp_replace('abracadabra','Bra','kkk','i'), + regexp_replace('helloworld','hello world','kkk','x'), + regexp_replace('abracadabra','bra','kkk',-1), + regexp_replace('abracadabra','bra','kkk',0), + regexp_replace('abracadabra','bra','kkk',1), + regexp_replace('abracadabra_abracadabra','bra','kkk',2), + regexp_replace('abracadabra_abracadabra','bra','kkk',5) +] as a; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.4.query.sqlpp similarity index 89% rename from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp rename to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.4.query.sqlpp index 6568d06..42eaae7 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position_with_flag/regexp_position_with_flag.1.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.4.query.sqlpp @@ -17,4 +17,6 @@ * under the License. */ -{'result1': REGEXP_POSITION('helloworld','hello world','x')}; +USE test; + +FROM ds SELECT VALUE regexp_replace(test_str, pattern, "REPLACED", flags) ORDER BY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.5.ddl.sqlpp similarity index 93% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.5.ddl.sqlpp index 910e476..36b2bab 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.3.query.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.5.ddl.sqlpp @@ -17,6 +17,4 @@ * under the License. */ -{ - 'result1':regexp_replace('abracadabra','bra','*') -}; +DROP DATAVERSE test IF EXISTS; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/like_02/like_02.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/like_02/like_02.3.adm new file mode 100644 index 0000000..f64c9ef --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/like_02/like_02.3.adm @@ -0,0 +1,11 @@ +true +false +true +true +false +false +true +false +true +true +true \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/like_02/like_02.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/like_02/like_02.4.adm new file mode 100644 index 0000000..82cd87f --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/like_02/like_02.4.adm @@ -0,0 +1,3 @@ +true +true +true \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_contains/regexp_contains.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_contains/regexp_contains.3.adm new file mode 100644 index 0000000..3215658 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_contains/regexp_contains.3.adm @@ -0,0 +1,15 @@ +true +false +true +true +true +false +true +false +false +true +true +true +true +false +true \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_contains/regexp_contains.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_contains/regexp_contains.4.adm new file mode 100644 index 0000000..3180800 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_contains/regexp_contains.4.adm @@ -0,0 +1,4 @@ +true +false +false +false \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_contains_with_flag/regexp_contains_with_flag.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_contains_with_flag/regexp_contains_with_flag.3.adm new file mode 100644 index 0000000..93dc2ea --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_contains_with_flag/regexp_contains_with_flag.3.adm @@ -0,0 +1 @@ +{ "result1": true } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_contains_with_flag/regexp_contains_with_flag.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_contains_with_flag/regexp_contains_with_flag.4.adm new file mode 100644 index 0000000..08ed4c1 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_contains_with_flag/regexp_contains_with_flag.4.adm @@ -0,0 +1,7 @@ +true +true +true +false +false +true +false \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like/regexp_like.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like/regexp_like.3.adm similarity index 100% rename from asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like/regexp_like.1.adm rename to asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like/regexp_like.3.adm diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like/regexp_like.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like/regexp_like.4.adm new file mode 100644 index 0000000..3180800 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like/regexp_like.4.adm @@ -0,0 +1,4 @@ +true +false +false +false \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like_with_flag/regexp_like_with_flag.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like_with_flag/regexp_like_with_flag.3.adm new file mode 100644 index 0000000..93dc2ea --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like_with_flag/regexp_like_with_flag.3.adm @@ -0,0 +1 @@ +{ "result1": true } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like_with_flag/regexp_like_with_flag.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like_with_flag/regexp_like_with_flag.4.adm new file mode 100644 index 0000000..08ed4c1 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_like_with_flag/regexp_like_with_flag.4.adm @@ -0,0 +1,7 @@ +true +true +true +false +false +true +false \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position/regexp_position.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position/regexp_position.3.adm similarity index 100% rename from asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position/regexp_position.1.adm rename to asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position/regexp_position.3.adm diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position/regexp_position.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position/regexp_position.4.adm new file mode 100644 index 0000000..e2b8d1b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position/regexp_position.4.adm @@ -0,0 +1,4 @@ +0 +-1 +-1 +-1 \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position_with_flag/regexp_position_with_flag.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position_with_flag/regexp_position_with_flag.3.adm similarity index 100% rename from asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position_with_flag/regexp_position_with_flag.1.adm rename to asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position_with_flag/regexp_position_with_flag.3.adm diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position_with_flag/regexp_position_with_flag.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position_with_flag/regexp_position_with_flag.4.adm new file mode 100644 index 0000000..4a565d9 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_position_with_flag/regexp_position_with_flag.4.adm @@ -0,0 +1,7 @@ +0 +0 +0 +-1 +-1 +0 +-1 \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.1.adm deleted file mode 100644 index c50c7c5..0000000 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.1.adm +++ /dev/null @@ -1 +0,0 @@ -{ "result1": null, "result2": "aXXXcadaXXX", "result3": null, "result4": null, "result5": null, "result6": null, "result7": "acada", "result8": "XXXaXXXbXXXrXXXaXXXcXXXaXXXdXXXaXXXbXXXrXXXaXXX" } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.2.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.2.adm deleted file mode 100644 index 5f992ce..0000000 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.2.adm +++ /dev/null @@ -1 +0,0 @@ -{ "result1": "brcdbr", "result2": "abbraccaddabbra", "result3": "carted" } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.3.adm index fa45140..bd9e14b 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.3.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.3.adm @@ -1 +1,5 @@ -{ "result1": "a*cada*" } +"brcdbr" +"abbraccaddabbra" +"carted" +"a*cada*" +"*" \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.4.adm index 3882682..61d2a9c 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.4.adm +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.4.adm @@ -1 +1,4 @@ -{ "result1": "*" } +"REPLACED" +"\n" +"hello_world" +"\n" \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.5.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.5.adm deleted file mode 100644 index 9fd2e6a..0000000 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.5.adm +++ /dev/null @@ -1 +0,0 @@ -{ "result1": "abracadabra", "result2": "akkkcadakkk", "result3": "kkk" } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.6.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.6.adm deleted file mode 100644 index 1005ff0..0000000 --- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace/regexp_replace.6.adm +++ /dev/null @@ -1 +0,0 @@ -{ "result1": "akkkcadakkk", "result2": "abracadabra", "result3": "akkkcadabra", "result4": "akkkcadakkk_abracadabra", "result5": "akkkcadakkk_akkkcadakkk" } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace_with_flag/regexp_replace_with_flag.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace_with_flag/regexp_replace_with_flag.3.adm new file mode 100644 index 0000000..33a5a9a --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace_with_flag/regexp_replace_with_flag.3.adm @@ -0,0 +1,16 @@ +null +"aXXXcadaXXX" +null +null +null +null +"acada" +"XXXaXXXbXXXrXXXaXXXcXXXaXXXdXXXaXXXbXXXrXXXaXXX" +"abracadabra" +"akkkcadakkk" +"kkk" +"akkkcadakkk" +"abracadabra" +"akkkcadabra" +"akkkcadakkk_abracadabra" +"akkkcadakkk_akkkcadakkk" \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace_with_flag/regexp_replace_with_flag.4.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace_with_flag/regexp_replace_with_flag.4.adm new file mode 100644 index 0000000..a4c6204 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/regexp_replace_with_flag/regexp_replace_with_flag.4.adm @@ -0,0 +1,7 @@ +"REPLACED" +"REPLACED" +"REPLACED" +"hello_world" +"hello_world" +"REPLACED" +"\n" \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml index abbb411..4dce07f 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -8602,6 +8602,18 @@ </compilation-unit> </test-case> <test-case FilePath="string"> + <compilation-unit name="like_02"> + <output-dir compare="Text">like_02</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="string"> + <compilation-unit name="like_03_negative"> + <output-dir compare="Text">like_03_negative</output-dir> + <expected-error>Invalid pattern "__\c" for LIKE (in line 21, at column 11)</expected-error> + <expected-error>Invalid pattern "%\" for LIKE (in line 21, at column 18)</expected-error> + </compilation-unit> + </test-case> + <test-case FilePath="string"> <compilation-unit name="like_null"> <output-dir compare="Text">like_null</output-dir> </compilation-unit> @@ -8688,12 +8700,12 @@ </test-case> <test-case FilePath="string"> <compilation-unit name="regexp_contains"> - <output-dir compare="Text">matches06</output-dir> + <output-dir compare="Text">regexp_contains</output-dir> </compilation-unit> </test-case> <test-case FilePath="string"> <compilation-unit name="regexp_contains_with_flag"> - <output-dir compare="Text">matches23</output-dir> + <output-dir compare="Text">regexp_contains_with_flag</output-dir> </compilation-unit> </test-case> <test-case FilePath="string"> @@ -8703,7 +8715,7 @@ </test-case> <test-case FilePath="string"> <compilation-unit name="regexp_like_with_flag"> - <output-dir compare="Text">matches23</output-dir> + <output-dir compare="Text">regexp_like_with_flag</output-dir> </compilation-unit> </test-case> <test-case FilePath="string"> @@ -8737,6 +8749,11 @@ </compilation-unit> </test-case> <test-case FilePath="string"> + <compilation-unit name="regexp_replace_with_flag"> + <output-dir compare="Text">regexp_replace_with_flag</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="string"> <compilation-unit name="reverse"> <output-dir compare="Text">reverse</output-dir> </compilation-unit> diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java index 609e3a6..e718ca5 100644 --- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java +++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/exceptions/ErrorCode.java @@ -78,6 +78,7 @@ public class ErrorCode { public static final int VALUE_OUT_OF_RANGE = 43; public static final int PROHIBITED_STATEMENT_CATEGORY = 44; public static final int INTEGER_VALUE_EXPECTED_FUNCTION = 45; + public static final int INVALID_LIKE_PATTERN = 46; public static final int UNSUPPORTED_JRE = 100; diff --git a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties index 661a220..f8d7a89 100644 --- a/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties +++ b/asterixdb/asterix-common/src/main/resources/asx_errormsg/en.properties @@ -80,6 +80,7 @@ 43 = Value out of range, function %1$s expects its %2$s input parameter value to be between %3$s and %4$s, received %5$s 44 = %1$s statement is prohibited by this request 45 = Invalid value: function %1$s expects its %2$s input parameter to be an integer value, got %3$s +46 = Invalid pattern \"%1$s\" for LIKE 100 = Unsupported JRE: %1$s diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java index b7a1c2f..62ba22d 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringBoolEval.java @@ -61,8 +61,8 @@ public abstract class AbstractBinaryStringBoolEval extends AbstractBinaryStringE * @param right * , the second input argument. * @return a boolean value. - * @throws IOException + * @throws HyracksDataException */ - protected abstract boolean compute(UTF8StringPointable left, UTF8StringPointable right) throws IOException; + protected abstract boolean compute(UTF8StringPointable left, UTF8StringPointable right) throws HyracksDataException; } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringEval.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringEval.java index 400126e..65fba47 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringEval.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractBinaryStringEval.java @@ -55,7 +55,7 @@ public abstract class AbstractBinaryStringEval implements IScalarEvaluator { // Function ID, for error reporting. private final FunctionIdentifier funcID; - private final SourceLocation sourceLoc; + protected final SourceLocation sourceLoc; public AbstractBinaryStringEval(IEvaluatorContext context, IScalarEvaluatorFactory evalLeftFactory, IScalarEvaluatorFactory evalRightFactory, FunctionIdentifier funcID, SourceLocation sourceLoc) diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringContainsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringContainsDescriptor.java index 8ce5b78..b4d8ab6 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringContainsDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringContainsDescriptor.java @@ -18,8 +18,6 @@ */ package org.apache.asterix.runtime.evaluators.functions; -import java.io.IOException; - import org.apache.asterix.common.annotations.MissingNullInOutFunction; import org.apache.asterix.om.functions.BuiltinFunctions; import org.apache.asterix.om.functions.IFunctionDescriptor; @@ -54,7 +52,7 @@ public class StringContainsDescriptor extends AbstractScalarFunctionDynamicDescr return new AbstractBinaryStringBoolEval(ctx, args[0], args[1], BuiltinFunctions.STRING_CONTAINS, sourceLoc) { @Override - protected boolean compute(UTF8StringPointable left, UTF8StringPointable right) throws IOException { + protected boolean compute(UTF8StringPointable left, UTF8StringPointable right) { return UTF8StringPointable.contains(left, right, false); } }; diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEndsWithDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEndsWithDescriptor.java index 3a29bc6..0c952cf 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEndsWithDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEndsWithDescriptor.java @@ -18,8 +18,6 @@ */ package org.apache.asterix.runtime.evaluators.functions; -import java.io.IOException; - import org.apache.asterix.common.annotations.MissingNullInOutFunction; import org.apache.asterix.om.functions.BuiltinFunctions; import org.apache.asterix.om.functions.IFunctionDescriptor; @@ -55,7 +53,7 @@ public class StringEndsWithDescriptor extends AbstractScalarFunctionDynamicDescr sourceLoc) { @Override - protected boolean compute(UTF8StringPointable left, UTF8StringPointable right) throws IOException { + protected boolean compute(UTF8StringPointable left, UTF8StringPointable right) { return UTF8StringPointable.endsWith(left, right, false); } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEqualDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEqualDescriptor.java index ca43df8..bbe7c59 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEqualDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEqualDescriptor.java @@ -18,8 +18,6 @@ */ package org.apache.asterix.runtime.evaluators.functions; -import java.io.IOException; - import org.apache.asterix.common.annotations.MissingNullInOutFunction; import org.apache.asterix.om.functions.BuiltinFunctions; import org.apache.asterix.om.functions.IFunctionDescriptor; @@ -55,7 +53,7 @@ public class StringEqualDescriptor extends AbstractScalarFunctionDynamicDescript sourceLoc) { @Override - protected boolean compute(UTF8StringPointable left, UTF8StringPointable right) throws IOException { + protected boolean compute(UTF8StringPointable left, UTF8StringPointable right) { return left.compareTo(right) == 0; } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEvaluatorUtils.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEvaluatorUtils.java index 9c2076d..81ce832 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEvaluatorUtils.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringEvaluatorUtils.java @@ -24,7 +24,10 @@ import java.util.regex.Pattern; import org.apache.hyracks.data.std.primitive.UTF8StringPointable; import org.apache.hyracks.data.std.util.ByteArrayAccessibleOutputStream; -public class StringEvaluatorUtils { +public final class StringEvaluatorUtils { + + private StringEvaluatorUtils() { + } public static int toFlag(String pattern) { int flag = 0; @@ -57,32 +60,10 @@ public class StringEvaluatorUtils { return destString; } - static char[] reservedRegexChars = - new char[] { '\\', '(', ')', '[', ']', '{', '}', '.', '^', '$', '*', '|', '+', '?' }; + static final char[] RESERVED_REGEX_CHARS = new char[] { '\\', '(', ')', '[', ']', '{', '}', '.', '^', '$', '*', '|', + '+', '?', '<', '>', '-', '=', '!' }; static { - Arrays.sort(reservedRegexChars); - } - - public static String toRegex(String pattern) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < pattern.length(); i++) { - char c = pattern.charAt(i); - if (c == '\\' && (i < pattern.length() - 1) - && (pattern.charAt(i + 1) == '_' || pattern.charAt(i + 1) == '%')) { - sb.append(pattern.charAt(i + 1)); - ++i; - } else if (c == '%') { - sb.append(".*"); - } else if (c == '_') { - sb.append("."); - } else { - if (Arrays.binarySearch(reservedRegexChars, c) >= 0) { - sb.append('\\'); - } - sb.append(c); - } - } - return sb.toString(); + Arrays.sort(RESERVED_REGEX_CHARS); } } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringLikeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringLikeDescriptor.java index 8210522..1c75aa9 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringLikeDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringLikeDescriptor.java @@ -18,11 +18,14 @@ */ package org.apache.asterix.runtime.evaluators.functions; -import java.io.IOException; +import static org.apache.asterix.runtime.evaluators.functions.StringEvaluatorUtils.RESERVED_REGEX_CHARS; + +import java.util.Arrays; import org.apache.asterix.common.annotations.MissingNullInOutFunction; +import org.apache.asterix.common.exceptions.ErrorCode; +import org.apache.asterix.common.exceptions.RuntimeDataException; import org.apache.asterix.om.functions.BuiltinFunctions; -import org.apache.asterix.om.functions.IFunctionDescriptor; import org.apache.asterix.om.functions.IFunctionDescriptorFactory; import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor; import org.apache.asterix.runtime.evaluators.functions.utils.RegExpMatcher; @@ -31,11 +34,34 @@ import org.apache.hyracks.algebricks.runtime.base.IEvaluatorContext; import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; import org.apache.hyracks.api.exceptions.HyracksDataException; +import org.apache.hyracks.api.exceptions.SourceLocation; import org.apache.hyracks.data.std.primitive.UTF8StringPointable; /** - * Creates new Matcher and Pattern objects each time the value of the pattern - * argument (the second argument) changes. + * Runtime for {@code LIKE} operator. The invocation is LIKE(test_string, pattern). Pattern of LIKE includes two + * wildcards, "%" and "_". The "%" matches zero or more characters. The "_" matches any single character. Line + * terminator characters are included, e.g. "\n", "\r\n", etc. + * <p> + * The default escape character is a backslash. Currently, the default cannot be changed, but will be configurable in + * the future. The escape character is used to match literal "%", "_" and the escape character itself. It is an error + * to use the escape character to match a character other than those three. It is also an error if the pattern ends + * with an incomplete escape character sequence since it not known what character the user wants to match literally. + * <p> + * Backslash character is written as "\\" inside a string. That is how a backslash character is supposed to be + * written inside a string. That means if the escape character is backslash and the goal is to match a literal "%", + * write "\\%" in the pattern string. To match a literal "_" write "\\_". To match the backslash (the escape character) + * write "\\\\". The first "\\" is the LIKE escape character. The last "\\" is the backslash character to match. + * <p> + * Examples using the default escape character, the backslash: + * <ul> + * <li>LIKE("there is a 50% discount", "%50\\% discount") -> true</li> + * <li>LIKE("text_text", "%\\_%") -> true</li> + * <li>LIKE("text with a backslash \\ in here", "%\\\\%") -> true</li> + * <li>LIKE("text with a backslash \\", "%\\") -> ERROR</li> + * <li>LIKE("Foo and bar text", "%\\ext") -> ERROR</li> + * </ul> + * <p> + * Creates new Matcher and Pattern objects each time the value of the pattern argument (the second argument) changes. */ @MissingNullInOutFunction @@ -43,12 +69,7 @@ public class StringLikeDescriptor extends AbstractScalarFunctionDynamicDescripto private static final long serialVersionUID = 1L; - public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { - @Override - public IFunctionDescriptor createFunctionDescriptor() { - return new StringLikeDescriptor(); - } - }; + public static final IFunctionDescriptorFactory FACTORY = StringLikeDescriptor::new; @Override public FunctionIdentifier getIdentifier() { @@ -62,28 +83,63 @@ public class StringLikeDescriptor extends AbstractScalarFunctionDynamicDescripto @Override public IScalarEvaluator createScalarEvaluator(IEvaluatorContext ctx) throws HyracksDataException { - return new AbstractBinaryStringBoolEval(ctx, args[0], args[1], - StringLikeDescriptor.this.getIdentifier(), sourceLoc) { - private final RegExpMatcher matcher = new RegExpMatcher(); - private final RegExpMatcher.IRegExpPatternGenerator patternGenerator = new LikePatternGenerator(); - - @Override - protected boolean compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr) - throws IOException { - matcher.build(srcPtr, patternPtr, null, patternGenerator); - return matcher.matches(); - } - }; + return new StringLikeEval(ctx, args[0], args[1], StringLikeDescriptor.this.getIdentifier(), sourceLoc); } }; } - class LikePatternGenerator implements RegExpMatcher.IRegExpPatternGenerator { + private static class StringLikeEval extends AbstractBinaryStringBoolEval + implements RegExpMatcher.IRegExpPatternGenerator { + + // could be improved to check if args are constant and create a matcher with fixed pattern/flags + private static final UTF8StringPointable DOT_ALL_FLAG = UTF8StringPointable.generateUTF8Pointable("s"); + private static final char likeEscapeChar = '\\'; // currently static until ESCAPE is supported + private final RegExpMatcher matcher = new RegExpMatcher(); + private final StringBuilder tempStringBuilder = new StringBuilder(); + + StringLikeEval(IEvaluatorContext context, IScalarEvaluatorFactory evalLeftFactory, + IScalarEvaluatorFactory evalRightFactory, FunctionIdentifier funcID, SourceLocation sourceLoc) + throws HyracksDataException { + super(context, evalLeftFactory, evalRightFactory, funcID, sourceLoc); + } + + @Override + protected boolean compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr) + throws HyracksDataException { + matcher.build(srcPtr, patternPtr, DOT_ALL_FLAG, this); + return matcher.matches(); + } @Override - public String toRegExpPatternString(String input) { - return StringEvaluatorUtils.toRegex(input); + public String toRegExpPatternString(String pattern) throws HyracksDataException { + tempStringBuilder.setLength(0); + for (int i = 0, length = pattern.length(); i < length; i++) { + char c = pattern.charAt(i); + if (c == likeEscapeChar) { + char nextChar; + // escape character can't be last, and only %, _ and the escape char are allowed after it + if (i >= length - 1 || ((nextChar = pattern.charAt(i + 1)) != '%' && nextChar != '_' + && nextChar != likeEscapeChar)) { + throw new RuntimeDataException(ErrorCode.INVALID_LIKE_PATTERN, this.sourceLoc, pattern); + } + if (Arrays.binarySearch(RESERVED_REGEX_CHARS, nextChar) >= 0) { + // precede the nextChar with a backslash if it's one of JAVA's regex reserved chars + tempStringBuilder.append('\\'); + } + tempStringBuilder.append(nextChar); + ++i; + } else if (c == '%') { + tempStringBuilder.append(".*"); + } else if (c == '_') { + tempStringBuilder.append('.'); + } else { + if (Arrays.binarySearch(RESERVED_REGEX_CHARS, c) >= 0) { + tempStringBuilder.append('\\'); + } + tempStringBuilder.append(c); + } + } + return tempStringBuilder.toString(); } } - } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpContainsDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpContainsDescriptor.java index 82a9579..1d1d011 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpContainsDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpContainsDescriptor.java @@ -18,8 +18,6 @@ */ package org.apache.asterix.runtime.evaluators.functions; -import java.io.IOException; - import org.apache.asterix.common.annotations.MissingNullInOutFunction; import org.apache.asterix.om.functions.BuiltinFunctions; import org.apache.asterix.om.functions.IFunctionDescriptor; @@ -57,7 +55,7 @@ public class StringRegExpContainsDescriptor extends AbstractScalarFunctionDynami @Override protected boolean compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr) - throws IOException { + throws HyracksDataException { matcher.build(srcPtr, patternPtr); return matcher.find(); } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpContainsWithFlagDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpContainsWithFlagDescriptor.java index af67eae..7016581 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpContainsWithFlagDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpContainsWithFlagDescriptor.java @@ -59,7 +59,7 @@ public class StringRegExpContainsWithFlagDescriptor extends AbstractScalarFuncti @Override protected boolean compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr, - UTF8StringPointable flagPtr) { + UTF8StringPointable flagPtr) throws HyracksDataException { matcher.build(srcPtr, patternPtr, flagPtr); return matcher.find(); } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpLikeDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpLikeDescriptor.java index 23b6cd9..8a6587e 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpLikeDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpLikeDescriptor.java @@ -19,8 +19,6 @@ package org.apache.asterix.runtime.evaluators.functions; -import java.io.IOException; - import org.apache.asterix.common.annotations.MissingNullInOutFunction; import org.apache.asterix.om.functions.BuiltinFunctions; import org.apache.asterix.om.functions.IFunctionDescriptor; @@ -58,7 +56,7 @@ public class StringRegExpLikeDescriptor extends AbstractScalarFunctionDynamicDes @Override protected boolean compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr) - throws IOException { + throws HyracksDataException { matcher.build(srcPtr, patternPtr); return matcher.matches(); } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpLikeWithFlagDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpLikeWithFlagDescriptor.java index 6019b24..046f80e 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpLikeWithFlagDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpLikeWithFlagDescriptor.java @@ -56,7 +56,7 @@ public class StringRegExpLikeWithFlagDescriptor extends AbstractScalarFunctionDy @Override protected boolean compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr, - UTF8StringPointable flagPtr) { + UTF8StringPointable flagPtr) throws HyracksDataException { matcher.build(srcPtr, patternPtr, flagPtr); return matcher.matches(); } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionDescriptor.java index c152358..bfdcb1e 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionDescriptor.java @@ -63,9 +63,10 @@ public class StringRegExpPositionDescriptor extends AbstractStringOffsetConfigur private final RegExpMatcher matcher = new RegExpMatcher(); @Override - protected int compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr) { + protected int compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr) + throws HyracksDataException { matcher.build(srcPtr, patternPtr); - int pos = matcher.postion(); + int pos = matcher.position(); return pos < 0 ? pos : pos + baseOffset; } }; diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionWithFlagDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionWithFlagDescriptor.java index 9a1abc8..339b989 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionWithFlagDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpPositionWithFlagDescriptor.java @@ -64,9 +64,9 @@ public class StringRegExpPositionWithFlagDescriptor extends AbstractStringOffset @Override protected int compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr, - UTF8StringPointable flagPtr) { + UTF8StringPointable flagPtr) throws HyracksDataException { matcher.build(srcPtr, patternPtr, flagPtr); - int pos = matcher.postion(); + int pos = matcher.position(); return pos < 0 ? pos : pos + baseOffset; } }; diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpReplaceDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpReplaceDescriptor.java index de373ac..9819d63 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpReplaceDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringRegExpReplaceDescriptor.java @@ -55,7 +55,7 @@ public class StringRegExpReplaceDescriptor extends AbstractScalarFunctionDynamic @Override protected String compute(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr, - UTF8StringPointable replacePtr) { + UTF8StringPointable replacePtr) throws HyracksDataException { matcher.build(srcPtr, patternPtr); return matcher.replace(replacePtr); } diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringStartsWithDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringStartsWithDescriptor.java index c9606e1..41eeeca 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringStartsWithDescriptor.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/StringStartsWithDescriptor.java @@ -18,8 +18,6 @@ */ package org.apache.asterix.runtime.evaluators.functions; -import java.io.IOException; - import org.apache.asterix.common.annotations.MissingNullInOutFunction; import org.apache.asterix.om.functions.BuiltinFunctions; import org.apache.asterix.om.functions.IFunctionDescriptor; @@ -55,7 +53,7 @@ public class StringStartsWithDescriptor extends AbstractScalarFunctionDynamicDes sourceLoc) { @Override - protected boolean compute(UTF8StringPointable left, UTF8StringPointable right) throws IOException { + protected boolean compute(UTF8StringPointable left, UTF8StringPointable right) { return UTF8StringPointable.startsWith(left, right, false); } }; diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/utils/RegExpMatcher.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/utils/RegExpMatcher.java index 77622d3..0b234f5 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/utils/RegExpMatcher.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/utils/RegExpMatcher.java @@ -23,6 +23,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.asterix.runtime.evaluators.functions.StringEvaluatorUtils; +import org.apache.hyracks.api.exceptions.HyracksDataException; import org.apache.hyracks.data.std.primitive.UTF8StringPointable; import org.apache.hyracks.data.std.util.ByteArrayAccessibleOutputStream; import org.apache.hyracks.data.std.util.UTF8CharSequence; @@ -57,7 +58,7 @@ public class RegExpMatcher { @FunctionalInterface public interface IRegExpPatternGenerator { - String toRegExpPatternString(String inputString); + String toRegExpPatternString(String inputString) throws HyracksDataException; } /** @@ -68,7 +69,7 @@ public class RegExpMatcher { * @param patternPtr * , the definition of the regular expression. */ - public void build(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr) { + public void build(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr) throws HyracksDataException { build(srcPtr, patternPtr, null); } @@ -82,7 +83,8 @@ public class RegExpMatcher { * @param flagPtr * , the flags. */ - public void build(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr, UTF8StringPointable flagPtr) { + public void build(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr, UTF8StringPointable flagPtr) + throws HyracksDataException { build(srcPtr, patternPtr, flagPtr, null); } @@ -99,33 +101,32 @@ public class RegExpMatcher { * , the regular expression pattern generator. */ public void build(UTF8StringPointable srcPtr, UTF8StringPointable patternPtr, UTF8StringPointable flagPtr, - IRegExpPatternGenerator patternGenerator) { - // Builds a new pattern if necessary. - final boolean newPattern = patternPtr != null && (pattern == null || lastPatternPtr.compareTo(patternPtr) != 0); + IRegExpPatternGenerator patternGenerator) throws HyracksDataException { + // Builds a new pattern if necessary. patternPtr cannot be null + final boolean newPattern = pattern == null || lastPatternPtr.compareTo(patternPtr) != 0; final boolean newFlag = flagPtr != null && (pattern == null || lastFlagPtr.compareTo(flagPtr) != 0); - if (newPattern) { - StringEvaluatorUtils.copyResetUTF8Pointable(patternPtr, lastPatternStorage, lastPatternPtr); - } - if (newFlag) { - StringEvaluatorUtils.copyResetUTF8Pointable(flagPtr, lastFlagsStorage, lastFlagPtr); - } + charSeq.reset(srcPtr); if (newPattern || newFlag) { - StringEvaluatorUtils.copyResetUTF8Pointable(patternPtr, lastPatternStorage, lastPatternPtr); // ! object creation ! - String inputPatternString = lastPatternPtr.toString(); - String patternString = patternGenerator == null ? inputPatternString - : patternGenerator.toRegExpPatternString(inputPatternString); - if (newFlag) { - pattern = Pattern.compile(patternString, StringEvaluatorUtils.toFlag(flagPtr.toString())); - + String patternString; + if (newPattern) { + StringEvaluatorUtils.copyResetUTF8Pointable(patternPtr, lastPatternStorage, lastPatternPtr); + String inputPatternString = lastPatternPtr.toString(); + patternString = patternGenerator == null ? inputPatternString + : patternGenerator.toRegExpPatternString(inputPatternString); } else { - pattern = Pattern.compile(patternString); + // use whatever pattern string the previous pattern was using + patternString = pattern.pattern(); } - } - - // Resets the matcher. - charSeq.reset(srcPtr); - if (newPattern || newFlag) { + int flags = 0; + if (newFlag) { + StringEvaluatorUtils.copyResetUTF8Pointable(flagPtr, lastFlagsStorage, lastFlagPtr); + flags = StringEvaluatorUtils.toFlag(lastFlagPtr.toString()); + } else if (pattern != null) { + // use whatever flags the previous pattern was using + flags = pattern.flags(); + } + pattern = Pattern.compile(patternString, flags); matcher = pattern.matcher(charSeq); } else { matcher.reset(charSeq); @@ -153,7 +154,7 @@ public class RegExpMatcher { /** * @return the first matched position of the regular expression pattern in the source string. */ - public int postion() { + public int position() { return matcher.find() ? matcher.start() : -1; }
