[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;
     }