[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 <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
Reviewed-by: Dmitry Lychagin <dmitry.lychagin@couchbase.com>
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/like_02/like_02.1.ddl.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.1.ddl.sqlpp
index a158d7f..7c48143 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/like_02/like_02.1.ddl.sqlpp
@@ -17,8 +17,9 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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/like_02/like_02.2.update.sqlpp
similarity index 78%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.2.update.sqlpp
index a158d7f..37db984 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/like_02/like_02.2.update.sqlpp
@@ -17,8 +17,10 @@
* 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 \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.2.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.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.3.query.sqlpp
index a158d7f..9640747 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/like_02/like_02.3.query.sqlpp
@@ -17,8 +17,17 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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_replace/regexp_replace.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.4.query.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.4.query.sqlpp
index a158d7f..b478f4e 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/like_02/like_02.4.query.sqlpp
@@ -17,8 +17,6 @@
* 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;
+
+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.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.5.ddl.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_02/like_02.5.ddl.sqlpp
index a158d7f..36b2bab 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/like_02/like_02.5.ddl.sqlpp
@@ -17,8 +17,4 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_03_negative/like_03_negative.1.query.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_03_negative/like_03_negative.1.query.sqlpp
index a158d7f..d3595fe 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/like_03_negative/like_03_negative.1.query.sqlpp
@@ -17,8 +17,6 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/like_03_negative/like_03_negative.2.query.sqlpp
similarity index 82%
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/like_03_negative/like_03_negative.2.query.sqlpp
index a158d7f..018c5fa 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/like_03_negative/like_03_negative.2.query.sqlpp
@@ -17,8 +17,6 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+SELECT ELEMENT A FROM [
+ "test\\string" LIKE "%\\"
+] AS A;
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.1.ddl.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.1.ddl.sqlpp
index a158d7f..7c48143 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.1.ddl.sqlpp
@@ -17,8 +17,9 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy 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%
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_contains/regexp_contains.3.query.sqlpp
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.4.query.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.4.query.sqlpp
index a158d7f..7090ce4 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.4.query.sqlpp
@@ -17,8 +17,6 @@
* 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;
+
+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.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.5.ddl.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains/regexp_contains.5.ddl.sqlpp
index a158d7f..36b2bab 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.5.ddl.sqlpp
@@ -17,8 +17,4 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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.2.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 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.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 a158d7f..7c48143 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_with_flag/regexp_contains_with_flag.1.ddl.sqlpp
@@ -17,8 +17,9 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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_with_flag/regexp_contains_with_flag.2.update.sqlpp
similarity index 62%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_contains_with_flag/regexp_contains_with_flag.2.update.sqlpp
index a158d7f..55e2b8e 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_with_flag/regexp_contains_with_flag.2.update.sqlpp
@@ -17,8 +17,14 @@
* 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": "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_replace/regexp_replace.2.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 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.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 a158d7f..199d20f 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_with_flag/regexp_contains_with_flag.4.query.sqlpp
@@ -17,8 +17,6 @@
* 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;
+
+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.2.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 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.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 a158d7f..36b2bab 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_with_flag/regexp_contains_with_flags.5.ddl.sqlpp
@@ -17,8 +17,4 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.1.ddl.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.1.ddl.sqlpp
index a158d7f..7c48143 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_like/regexp_like.1.ddl.sqlpp
@@ -17,8 +17,9 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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_like/regexp_like.2.update.sqlpp
similarity index 76%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.2.update.sqlpp
index a158d7f..300a5f2 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_like/regexp_like.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_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_replace/regexp_replace.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.4.query.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.4.query.sqlpp
index a158d7f..de3d809 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_like/regexp_like.4.query.sqlpp
@@ -17,8 +17,6 @@
* 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;
+
+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.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.5.ddl.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_like/regexp_like.5.ddl.sqlpp
index a158d7f..36b2bab 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_like/regexp_like.5.ddl.sqlpp
@@ -17,8 +17,4 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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.2.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 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.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 a158d7f..7c48143 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_like_with_flag/regexp_like_with_flag.1.ddl.sqlpp
@@ -17,8 +17,9 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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_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.2.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 a158d7f..b5ab61a 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_like_with_flag/regexp_like_with_flag.2.update.sqlpp
@@ -17,8 +17,14 @@
* 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": "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_replace/regexp_replace.2.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 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.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 a158d7f..199d20f 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_like_with_flag/regexp_like_with_flag.4.query.sqlpp
@@ -17,8 +17,6 @@
* 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;
+
+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.2.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 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.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 a158d7f..36b2bab 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_like_with_flag/regexp_like_with_flags.5.ddl.sqlpp
@@ -17,8 +17,4 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.1.ddl.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.1.ddl.sqlpp
index a158d7f..7c48143 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_position/regexp_position.1.ddl.sqlpp
@@ -17,8 +17,9 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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_position/regexp_position.2.update.sqlpp
similarity index 76%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.2.update.sqlpp
index a158d7f..300a5f2 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_position/regexp_position.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_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_replace/regexp_replace.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.4.query.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.4.query.sqlpp
index a158d7f..7bd4fad 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_position/regexp_position.4.query.sqlpp
@@ -17,8 +17,6 @@
* 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;
+
+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.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.5.ddl.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_position/regexp_position.5.ddl.sqlpp
index a158d7f..36b2bab 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_position/regexp_position.5.ddl.sqlpp
@@ -17,8 +17,4 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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.2.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 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.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 a158d7f..7c48143 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_position_with_flag/regexp_position_with_flag.1.ddl.sqlpp
@@ -17,8 +17,9 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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_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.2.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 a158d7f..b5ab61a 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_position_with_flag/regexp_position_with_flag.2.update.sqlpp
@@ -17,8 +17,14 @@
* 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": "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%
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_position_with_flag/regexp_position_with_flag.3.query.sqlpp
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_position_with_flag/regexp_position_with_flag.4.query.sqlpp
similarity index 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.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 a158d7f..48c7aac 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_position_with_flag/regexp_position_with_flag.4.query.sqlpp
@@ -17,8 +17,6 @@
* 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;
+
+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.2.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 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.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 a158d7f..36b2bab 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_position_with_flag/regexp_position_with_flags.5.ddl.sqlpp
@@ -17,8 +17,4 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.1.ddl.sqlpp
similarity index 82%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.1.ddl.sqlpp
index a158d7f..7c48143 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_replace/regexp_replace.1.ddl.sqlpp
@@ -17,8 +17,9 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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_replace/regexp_replace.1.query.sqlpp
deleted file mode 100644
index fbdf750..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.1.query.sqlpp
+++ /dev/null
@@ -1,29 +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','',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','')
-};
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_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.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.update.sqlpp
index a158d7f..300a5f2 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_replace/regexp_replace.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_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.2.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.ddl.sqlpp
similarity index 82%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.ddl.sqlpp
index a158d7f..36b2bab 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_replace/regexp_replace.5.ddl.sqlpp
@@ -17,8 +17,4 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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.5.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp
deleted file mode 100644
index 600abe0..0000000
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.5.query.sqlpp
+++ /dev/null
@@ -1,24 +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',''),
- 'result2':regexp_replace('abracadabra','Bra','kkk','i'),
- 'result3':regexp_replace('helloworld','hello world','kkk','x')
-};
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_replace/regexp_replace.2.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 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.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 a158d7f..7c48143 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_replace_with_flag/regexp_replace_with_flag.1.ddl.sqlpp
@@ -17,8 +17,9 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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_replace_with_flag/regexp_replace_with_flag.2.update.sqlpp
similarity index 61%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.2.update.sqlpp
index a158d7f..b5ab61a 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_replace_with_flag/regexp_replace_with_flag.2.update.sqlpp
@@ -17,8 +17,14 @@
* 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": "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_replace_with_flag/regexp_replace_with_flag.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.3.query.sqlpp
new file mode 100644
index 0000000..90504e5
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.3.query.sqlpp
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+select element a
+from [
+ 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_replace/regexp_replace.2.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 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.query.sqlpp
copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace_with_flag/regexp_replace_with_flag.4.query.sqlpp
index a158d7f..42eaae7 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_replace_with_flag/regexp_replace_with_flag.4.query.sqlpp
@@ -17,8 +17,6 @@
* 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;
+
+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.2.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 81%
copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/regexp_replace/regexp_replace.2.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 a158d7f..36b2bab 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_replace_with_flag/regexp_replace_with_flag.5.ddl.sqlpp
@@ -17,8 +17,4 @@
* under the License.
*/
-{
- 'result1':regexp_replace('abracadabra','a',''),
- 'result2':regexp_replace('abracadabra','a(.)','a$1$1'),
- 'result3':regexp_replace('darted','^(.*?)d(.*)$','$1c$2')
-};
+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 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 @@
* @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 @@
// 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 @@
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 @@
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 @@
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 9c2076da..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 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 @@
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.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 @@
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 @@
@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
- public String toRegExpPatternString(String input) {
- return StringEvaluatorUtils.toRegex(input);
+ 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 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 @@
@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 @@
@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 @@
@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 @@
@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 @@
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 @@
@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 @@
@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 @@
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.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 @@
@FunctionalInterface
public interface IRegExpPatternGenerator {
- String toRegExpPatternString(String inputString);
+ String toRegExpPatternString(String inputString) throws HyracksDataException;
}
/**
@@ -68,7 +69,7 @@
* @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 @@
* @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 @@
* , 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);
- }
- 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()));
-
- } else {
- pattern = Pattern.compile(patternString);
- }
- }
-
- // Resets the matcher.
charSeq.reset(srcPtr);
if (newPattern || newFlag) {
+ // ! object creation !
+ String patternString;
+ if (newPattern) {
+ StringEvaluatorUtils.copyResetUTF8Pointable(patternPtr, lastPatternStorage, lastPatternPtr);
+ String inputPatternString = lastPatternPtr.toString();
+ patternString = patternGenerator == null ? inputPatternString
+ : patternGenerator.toRegExpPatternString(inputPatternString);
+ } else {
+ // use whatever pattern string the previous pattern was using
+ patternString = pattern.pattern();
+ }
+ 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 @@
/**
* @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;
}