[ASTERIXDB-3615][FUN]: lpad and rpad func follow-up

- user model changes: no
- storage format changes: no
- interface changes: no

Deatils:
- Handle the case where the string is empty.
- Add testcases

Ext-ref: MB-67008

Change-Id: I916342d94e3c4b7d6f8f9233b8bb79be26631914
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/19863
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Janhavi Tripurwar <janhavi.tripurwar@couchbase.com>
Reviewed-by: Ali Alsuliman <ali.al.solaiman@gmail.com>
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/lpad/lpad.00.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/lpad/lpad.00.ddl.sqlpp
index 897aac5..5352c31 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/lpad/lpad.00.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/lpad/lpad.00.ddl.sqlpp
@@ -25,6 +25,4 @@
 {"id":3, "f": "a𩸽b", "f1": "🎉"},
 {"id":4, "f": "👩‍👩‍👧‍👦", "f1": "✓✓✓"},
 {"id":5, "f": null, "f1" : null}
-]);
-
-
+]);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/lpad/lpad.02.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/lpad/lpad.02.query.sqlpp
index a1383e6..8bd0175 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/lpad/lpad.02.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/lpad/lpad.02.query.sqlpp
@@ -23,5 +23,8 @@
     lpad('👩‍👩‍👧‍', 10, '👩‍👩‍👧‍👦') AS padded_to_10_codepoints,
     lpad(null, 4, '%%') AS padded_to_null_is_null,
     lpad(22, 11, 'y') AS padded_non_str,
-    lpad('abcd', -2, 'y') AS negative_length;
-
+    lpad('abcd', -2, 'y') AS negative_length,
+    lpad('abcd', 56, '') AS padding_with_empty_string,
+    lpad("abcd", 10, ' ') as padded_with_space,
+    lpad('', 3, 'a') as empty_string_padded,
+    lpad('', 3, '') as empty_string_padded_with_empty_string;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/rpad/rpad.00.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/rpad/rpad.00.ddl.sqlpp
index 897aac5..5352c31 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/rpad/rpad.00.ddl.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/rpad/rpad.00.ddl.sqlpp
@@ -25,6 +25,4 @@
 {"id":3, "f": "a𩸽b", "f1": "🎉"},
 {"id":4, "f": "👩‍👩‍👧‍👦", "f1": "✓✓✓"},
 {"id":5, "f": null, "f1" : null}
-]);
-
-
+]);
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/rpad/rpad.02.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/rpad/rpad.02.query.sqlpp
index c0d1316..9f37767 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/rpad/rpad.02.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/string/pad/rpad/rpad.02.query.sqlpp
@@ -22,5 +22,9 @@
     rpad('👩‍👩‍👧‍', 2, '$') AS truncated_to_2_codepoints,
     rpad('👩‍👩‍👧‍', 10, '👩‍👩‍👧‍👦') AS padded_to_10_codepoints,
     rpad(null, 4, '%%') AS padded_to_null_is_null,
-    rpad(22, 11, 'y') AS padded_non_str;
-
+    rpad(22, 11, 'y') AS padded_non_str,
+    rpad('abcd', -2, 'y') AS negative_length,
+    rpad('abcd', 56, '') AS padding_with_empty_string,
+    rpad("abcd", 10, ' ') as padded_with_space,
+    rpad('', 3, 'a') as empty_string_padded,
+    rpad('', 3, '') as empty_string_padded_with_empty_string;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/pad/lpad/lpad.02.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/pad/lpad/lpad.02.adm
index 3f6d3e4..7731480 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/pad/lpad/lpad.02.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/pad/lpad/lpad.02.adm
@@ -1 +1 @@
-{ "padded_to_11_codepoints": "$&^$asterix", "truncated_to_2_codepoints": "👩‍", "padded_to_10_codepoints": "👩‍👩‍👩‍👩‍👧‍", "padded_to_null_is_null": null, "padded_non_str": null, "negative_length": null }
\ No newline at end of file
+{ "padded_to_11_codepoints": "$&^$asterix", "truncated_to_2_codepoints": "👩‍", "padded_to_10_codepoints": "👩‍👩‍👩‍👩‍👧‍", "padded_to_null_is_null": null, "padded_non_str": null, "negative_length": null, "padding_with_empty_string": "abcd", "padded_with_space": "      abcd", "empty_string_padded": "aaa", "empty_string_padded_with_empty_string": "" }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/pad/rpad/rpad.02.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/pad/rpad/rpad.02.adm
index ba875f6..efac7d7 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/pad/rpad/rpad.02.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/pad/rpad/rpad.02.adm
@@ -1 +1 @@
-{ "padded_to_11_codepoints": "asterix$&^$", "truncated_to_2_codepoints": "👩‍", "padded_to_10_codepoints": "👩‍👩‍👧‍👩‍👩‍", "padded_to_null_is_null": null, "padded_non_str": null }
\ No newline at end of file
+{ "padded_to_11_codepoints": "asterix$&^$", "truncated_to_2_codepoints": "👩‍", "padded_to_10_codepoints": "👩‍👩‍👧‍👩‍👩‍", "padded_to_null_is_null": null, "padded_non_str": null, "negative_length": null, "padding_with_empty_string": "abcd", "padded_with_space": "abcd      ", "empty_string_padded": "aaa", "empty_string_padded_with_empty_string": "" }
\ No newline at end of file
diff --git a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java
index 81afdf6..3744350 100644
--- a/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java
+++ b/hyracks-fullstack/hyracks/hyracks-data/hyracks-data-std/src/main/java/org/apache/hyracks/data/std/primitive/UTF8StringPointable.java
@@ -483,13 +483,15 @@
             throws IOException {
         int utfLen = src.getUTF8Length();
         int byteIdx = 0;
-        while (numCodePoints > 0) {
-            if (byteIdx == utfLen) {
-                byteIdx = 0;
+        if (utfLen > 0) {
+            while (numCodePoints > 0) {
+                if (byteIdx == utfLen) {
+                    byteIdx = 0;
+                }
+                builder.appendCodePoint(src.codePointAt(src.getMetaDataLength() + byteIdx));
+                numCodePoints--;
+                byteIdx += src.codePointSize(src.getMetaDataLength() + byteIdx);
             }
-            builder.appendCodePoint(src.codePointAt(src.getMetaDataLength() + byteIdx));
-            numCodePoints--;
-            byteIdx += src.codePointSize(src.getMetaDataLength() + byteIdx);
         }
     }