This is an automated email from the ASF dual-hosted git repository.

mblow pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/asterixdb.git

commit a14b016ba1645bef2d015843e15bdba6c1c2859d
Author: Ali Alsuliman <[email protected]>
AuthorDate: Tue Oct 8 13:41:57 2019 -0700

    [ASTERIXDB-2651][RT][FUN] Handle matching a literal backslash properly in 
LIKE
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    
    - fixed an issue in the build() of RegExpMatcher where the "flags" argument 
gets ignored if the flags
      argument does not change in the subsequent evaluation of the regexp_* 
functions over the tuples of dataset.
    - added the missing Java regex meta characters.
    - split test case "regexp_replace" into two, "regexp_replace" & 
"regexp_replace_with_flag".
    
    Change-Id: I4f218f87f0c1736e2d8b5de07221d7efa0f9aef1
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/3614
    Integration-Tests: Jenkins <[email protected]>
    Tested-by: Jenkins <[email protected]>
    Reviewed-by: Ali Alsuliman <[email protected]>
    Reviewed-by: Dmitry Lychagin <[email protected]>
---
 .../like_02.1.ddl.sqlpp}                           |   7 +-
 .../like_02.2.update.sqlpp}                        |  12 ++-
 .../like_02.3.query.sqlpp}                         |  19 +++-
 .../like_02.4.query.sqlpp}                         |   4 +-
 .../like_02.5.ddl.sqlpp}                           |   4 +-
 .../like_03_negative.1.query.sqlpp}                |   6 +-
 .../like_03_negative.2.query.sqlpp}                |   6 +-
 .../regexp_contains.1.ddl.sqlpp}                   |   7 +-
 .../regexp_contains.2.update.sqlpp}                |  13 ++-
 ...1.query.sqlpp => regexp_contains.3.query.sqlpp} |   0
 .../regexp_contains.4.query.sqlpp}                 |   4 +-
 .../regexp_contains.5.ddl.sqlpp}                   |   4 +-
 .../regexp_contains_with_flag.1.ddl.sqlpp}         |   7 +-
 .../regexp_contains_with_flag.2.update.sqlpp}      |  21 ++--
 ...lpp => regexp_contains_with_flag.3.query.sqlpp} |   0
 .../regexp_contains_with_flag.4.query.sqlpp}       |   4 +-
 .../regexp_contains_with_flags.5.ddl.sqlpp}        |   4 +-
 .../regexp_like.1.ddl.sqlpp}                       |   7 +-
 .../regexp_like.2.update.sqlpp}                    |  13 ++-
 ...ike.1.query.sqlpp => regexp_like.3.query.sqlpp} |   0
 .../regexp_like.4.query.sqlpp}                     |   4 +-
 .../regexp_like.5.ddl.sqlpp}                       |   4 +-
 .../regexp_like_with_flag.1.ddl.sqlpp}             |   7 +-
 .../regexp_like_with_flag.2.update.sqlpp}          |  16 ++-
 ...y.sqlpp => regexp_like_with_flag.3.query.sqlpp} |   0
 .../regexp_like_with_flag.4.query.sqlpp}           |   4 +-
 .../regexp_like_with_flags.5.ddl.sqlpp}            |   4 +-
 .../regexp_position.1.ddl.sqlpp}                   |   7 +-
 .../regexp_position.2.update.sqlpp}                |  13 ++-
 ...1.query.sqlpp => regexp_position.3.query.sqlpp} |   0
 .../regexp_position.4.query.sqlpp}                 |   4 +-
 .../regexp_position.5.ddl.sqlpp}                   |   4 +-
 ...sqlpp => regexp_position_with_flag.1.ddl.sqlpp} |   7 +-
 .../regexp_position_with_flag.2.update.sqlpp}      |  16 ++-
 ...lpp => regexp_position_with_flag.3.query.sqlpp} |   0
 ...lpp => regexp_position_with_flag.4.query.sqlpp} |   4 +-
 .../regexp_position_with_flags.5.ddl.sqlpp}        |   4 +-
 .../regexp_replace.1.ddl.sqlpp}                    |   7 +-
 ...5.query.sqlpp => regexp_replace.2.update.sqlpp} |  13 ++-
 .../regexp_replace/regexp_replace.3.query.sqlpp    |  11 ++-
 .../regexp_replace/regexp_replace.4.query.sqlpp    |   6 +-
 ...ce.3.query.sqlpp => regexp_replace.5.ddl.sqlpp} |   4 +-
 .../regexp_replace/regexp_replace.6.query.sqlpp    |  26 -----
 .../regexp_replace_with_flag.1.ddl.sqlpp}          |   7 +-
 .../regexp_replace_with_flag.2.update.sqlpp}       |  16 ++-
 .../regexp_replace_with_flag.3.query.sqlpp}        |  35 ++++---
 .../regexp_replace_with_flag.4.query.sqlpp}        |   4 +-
 .../regexp_replace_with_flag.5.ddl.sqlpp}          |   4 +-
 .../runtimets/results/string/like_02/like_02.3.adm |  11 +++
 .../runtimets/results/string/like_02/like_02.4.adm |   3 +
 .../string/regexp_contains/regexp_contains.3.adm   |  15 +++
 .../string/regexp_contains/regexp_contains.4.adm   |   4 +
 .../regexp_contains_with_flag.3.adm                |   1 +
 .../regexp_contains_with_flag.4.adm                |   7 ++
 .../{regexp_like.1.adm => regexp_like.3.adm}       |   0
 .../results/string/regexp_like/regexp_like.4.adm   |   4 +
 .../regexp_like_with_flag.3.adm                    |   1 +
 .../regexp_like_with_flag.4.adm                    |   7 ++
 ...regexp_position.1.adm => regexp_position.3.adm} |   0
 .../string/regexp_position/regexp_position.4.adm   |   4 +
 ..._flag.1.adm => regexp_position_with_flag.3.adm} |   0
 .../regexp_position_with_flag.4.adm                |   7 ++
 .../string/regexp_replace/regexp_replace.1.adm     |   1 -
 .../string/regexp_replace/regexp_replace.2.adm     |   1 -
 .../string/regexp_replace/regexp_replace.3.adm     |   6 +-
 .../string/regexp_replace/regexp_replace.4.adm     |   5 +-
 .../string/regexp_replace/regexp_replace.5.adm     |   1 -
 .../string/regexp_replace/regexp_replace.6.adm     |   1 -
 .../regexp_replace_with_flag.3.adm                 |  16 +++
 .../regexp_replace_with_flag.4.adm                 |   7 ++
 .../test/resources/runtimets/testsuite_sqlpp.xml   |  23 ++++-
 .../asterix/common/exceptions/ErrorCode.java       |   1 +
 .../src/main/resources/asx_errormsg/en.properties  |   1 +
 .../functions/AbstractBinaryStringBoolEval.java    |   4 +-
 .../functions/AbstractBinaryStringEval.java        |   2 +-
 .../functions/StringContainsDescriptor.java        |   4 +-
 .../functions/StringEndsWithDescriptor.java        |   4 +-
 .../functions/StringEqualDescriptor.java           |   4 +-
 .../evaluators/functions/StringEvaluatorUtils.java |  33 ++-----
 .../evaluators/functions/StringLikeDescriptor.java | 108 ++++++++++++++++-----
 .../functions/StringRegExpContainsDescriptor.java  |   4 +-
 .../StringRegExpContainsWithFlagDescriptor.java    |   2 +-
 .../functions/StringRegExpLikeDescriptor.java      |   4 +-
 .../StringRegExpLikeWithFlagDescriptor.java        |   2 +-
 .../functions/StringRegExpPositionDescriptor.java  |   5 +-
 .../StringRegExpPositionWithFlagDescriptor.java    |   4 +-
 .../functions/StringRegExpReplaceDescriptor.java   |   2 +-
 .../functions/StringStartsWithDescriptor.java      |   4 +-
 .../evaluators/functions/utils/RegExpMatcher.java  |  53 +++++-----
 89 files changed, 469 insertions(+), 270 deletions(-)

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

Reply via email to