You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@asterixdb.apache.org by al...@apache.org on 2021/12/01 06:30:22 UTC

[asterixdb] branch master updated: [NO ISSUE][COMP] Change SqlppStatementUtil to specify CAST option

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 88a0c74  [NO ISSUE][COMP] Change SqlppStatementUtil to specify CAST option
88a0c74 is described below

commit 88a0c745ae9e49d13821addd3881dcf6c9c197f0
Author: Ali Alsuliman <al...@gmail.com>
AuthorDate: Mon Nov 29 21:19:07 2021 -0800

    [NO ISSUE][COMP] Change SqlppStatementUtil to specify CAST option
    
    - user model changes: no
    - storage format changes: no
    - interface changes: no
    
    Details:
    
    Change-Id: I7a2d6dbd0d25cf3e2b5edc0c6aa26810fceb09f1
    Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/14245
    Integration-Tests: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Tested-by: Jenkins <je...@fulliautomatix.ics.uci.edu>
    Reviewed-by: Ali Alsuliman <al...@gmail.com>
    Reviewed-by: Dmitry Lychagin <dm...@couchbase.com>
---
 .../IntroduceSecondaryIndexInsertDeleteRule.java    | 18 +++++++++---------
 .../optimizer/rules/am/BTreeAccessMethod.java       |  7 ++++---
 .../cast-default-null/cast-default-null-10.sqlpp    |  2 +-
 .../cast-default-null/cast-default-null-13.sqlpp    |  2 +-
 .../cast-default-null/cast-default-null-16.sqlpp    |  2 +-
 .../cast-default-null.12.query.sqlpp                |  2 +-
 .../cast-default-null.15.query.sqlpp                |  2 +-
 .../ddl/index-cast-null/index-cast-null.016.adm     |  6 +++---
 .../ddl/index-cast-null/index-cast-null.019.adm     |  6 +++---
 .../ddl/index-cast-null/index-cast-null.023.adm     |  6 +++---
 .../ddl/index-cast-null/index-cast-null.026.adm     |  6 +++---
 .../type_validation/type_validation.1.adm           |  2 +-
 .../asterix/lang/sqlpp/util/SqlppStatementUtil.java | 21 ++++++++++++++++++++-
 .../IndexTupleTranslator.java                       |  1 -
 .../apache/asterix/metadata/utils/IndexUtil.java    |  6 ++++--
 .../utils/SecondaryBTreeOperationsHelper.java       |  6 +++---
 .../org/apache/asterix/metadata/utils/TypeUtil.java | 11 ++++++-----
 .../main/java/org/apache/asterix/om/base/ADate.java |  2 +-
 18 files changed, 65 insertions(+), 43 deletions(-)

diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceSecondaryIndexInsertDeleteRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceSecondaryIndexInsertDeleteRule.java
index c3d7bd9..01f93a4 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceSecondaryIndexInsertDeleteRule.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/IntroduceSecondaryIndexInsertDeleteRule.java
@@ -879,17 +879,17 @@ public class IntroduceSecondaryIndexInsertDeleteRule implements IAlgebraicRewrit
             ARecordType sourceType, SourceLocation srcLoc) throws AlgebricksException {
         IAType fieldType = sourceType.getSubFieldType(skName);
         FunctionIdentifier skFun = null;
-        String fmtArg = null;
+        IAObject fmtArg = null;
         if (fieldType == null) {
-            Pair<FunctionIdentifier, String> castExpr = getCastExpression(index, skType, srcLoc);
+            Pair<FunctionIdentifier, IAObject> castExpr = getCastExpression(index, skType, srcLoc);
             skFun = castExpr.first;
             fmtArg = castExpr.second;
         }
         return new IndexFieldId(skSrc, skName, skType.getTypeTag(), skFun, fmtArg);
     }
 
-    private static Pair<FunctionIdentifier, String> getCastExpression(Index index, IAType skType, SourceLocation srcLoc)
-            throws AlgebricksException {
+    private static Pair<FunctionIdentifier, IAObject> getCastExpression(Index index, IAType skType,
+            SourceLocation srcLoc) throws AlgebricksException {
         if (IndexUtil.castDefaultNull(index)) {
             return IndexUtil.getTypeConstructorDefaultNull(index, skType, srcLoc);
         } else if (index.isEnforced()) {
@@ -901,7 +901,7 @@ public class IntroduceSecondaryIndexInsertDeleteRule implements IAlgebraicRewrit
 
     private AbstractFunctionCallExpression createCastExpression(Index index, IAType targetType,
             AbstractFunctionCallExpression inputExpr, SourceLocation sourceLoc, FunctionIdentifier castFun,
-            String fmtArg) throws CompilationException {
+            IAObject fmtArg) throws CompilationException {
         ScalarFunctionCallExpression castExpr;
         if (IndexUtil.castDefaultNull(index)) {
             castExpr = castConstructorFunction(castFun, fmtArg, inputExpr, sourceLoc);
@@ -921,14 +921,14 @@ public class IntroduceSecondaryIndexInsertDeleteRule implements IAlgebraicRewrit
         return castExpr;
     }
 
-    private ScalarFunctionCallExpression castConstructorFunction(FunctionIdentifier typeConstructorFun, String fmt,
+    private ScalarFunctionCallExpression castConstructorFunction(FunctionIdentifier typeConstructorFun, IAObject fmt,
             AbstractFunctionCallExpression inputExpr, SourceLocation srcLoc) {
         BuiltinFunctionInfo typeConstructorInfo = BuiltinFunctions.getBuiltinFunctionInfo(typeConstructorFun);
         ScalarFunctionCallExpression constructorExpr = new ScalarFunctionCallExpression(typeConstructorInfo);
         constructorExpr.getArguments().add(new MutableObject<>(inputExpr));
         // add the format argument if specified
         if (fmt != null) {
-            ConstantExpression fmtExpr = new ConstantExpression(new AsterixConstantValue(new AString(fmt)));
+            ConstantExpression fmtExpr = new ConstantExpression(new AsterixConstantValue(fmt));
             fmtExpr.setSourceLocation(srcLoc);
             constructorExpr.getArguments().add(new MutableObject<>(fmtExpr));
         }
@@ -1196,10 +1196,10 @@ public class IntroduceSecondaryIndexInsertDeleteRule implements IAlgebraicRewrit
         private final List<String> fieldName;
         private final ATypeTag fieldType;
         private final FunctionIdentifier funId;
-        private final String extraArg; // currently, only for datetime constructor functions with the format arg
+        private final IAObject extraArg; // currently, only for datetime constructor functions with the format arg
 
         private IndexFieldId(int indicator, List<String> fieldName, ATypeTag fieldType, FunctionIdentifier funId,
-                String extraArg) {
+                IAObject extraArg) {
             this.indicator = indicator;
             this.fieldName = fieldName;
             this.fieldType = fieldType;
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
index ef73905..1acbd89 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/am/BTreeAccessMethod.java
@@ -44,6 +44,7 @@ import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.Index;
 import org.apache.asterix.metadata.utils.IndexUtil;
 import org.apache.asterix.metadata.utils.TypeUtil;
+import org.apache.asterix.om.base.IAObject;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.types.ARecordType;
 import org.apache.asterix.om.types.AUnionType;
@@ -1053,11 +1054,11 @@ public class BTreeAccessMethod implements IAccessMethod {
                 return false;
             }
             IAType nonNullableType = Index.getNonNullableType(indexedFieldType).first;
-            Pair<FunctionIdentifier, String> constructorWithFmt =
+            Pair<FunctionIdentifier, IAObject> constructorWithFmt =
                     IndexUtil.getTypeConstructorDefaultNull(index, nonNullableType, functionExpr.getSourceLocation());
             FunctionIdentifier indexedFieldConstructorFun = constructorWithFmt.first;
-            String formatInIndex = constructorWithFmt.second;
-            String formatInFunction = TypeUtil.getTemporalFormatArg(functionExpr);
+            IAObject formatInIndex = constructorWithFmt.second;
+            IAObject formatInFunction = TypeUtil.getTemporalFormatArg(functionExpr);
             // index has CAST (DEFAULT NULL); the applied function should be the same as the indexed field function
             return funId.equals(indexedFieldConstructorFun) && Objects.equals(formatInIndex, formatInFunction);
         } else {
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-10.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-10.sqlpp
index 937a61f..f569a58 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-10.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-10.sqlpp
@@ -31,5 +31,5 @@ datetime 'MM/DD/YYYY hh:mm:ss.nnna' date 'MM/DD/YYYY' time 'hh:mm:ss.nnna' AS SE
 // testing that idx5_dt_fmt is selected
 SELECT VALUE v
 FROM view5_dt_fmt AS v
-WHERE v.f_dt_fmt < datetime('2020-12-20T00:00:00Z')
+WHERE v.f_dt_fmt < datetime('2020-12-20T00:00:00')
 ORDER BY v.id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-13.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-13.sqlpp
index 2d9d2ab..e3361e9 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-13.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-13.sqlpp
@@ -30,5 +30,5 @@ CREATE VIEW view6_dt(id int, f_dt datetime) DEFAULT NULL AS SELECT id, f_dt FROM
 // testing that idx6_dt is selected
 SELECT VALUE v
 FROM view6_dt AS v
-WHERE v.f_dt < datetime('2020-12-20T00:00:00Z')
+WHERE v.f_dt < datetime('2020-12-20T00:00:00')
 ORDER BY v.id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-16.sqlpp b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-16.sqlpp
index ed213f8..cb4e069 100644
--- a/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-16.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/optimizerts/queries/btree-index-selection/cast-default-null/cast-default-null-16.sqlpp
@@ -31,5 +31,5 @@ datetime 'MM-DD-YYYY hh:mm:ss.nnna' date 'MM/DD/YYYY' time 'hh:mm:ss.nnna' AS SE
 // testing that the index idx5_dt_fmt is not selected because its datetime format is not the same as view view5_dt_fmt
 SELECT VALUE v
 FROM view5_dt_fmt AS v
-WHERE v.f_dt_fmt < datetime('2020-12-20T00:00:00Z')
+WHERE v.f_dt_fmt < datetime('2020-12-20T00:00:00')
 ORDER BY v.id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/cast-default-null/cast-default-null.12.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/cast-default-null/cast-default-null.12.query.sqlpp
index c9de53b..e47124a 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/cast-default-null/cast-default-null.12.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/cast-default-null/cast-default-null.12.query.sqlpp
@@ -21,5 +21,5 @@ USE test;
 
 SELECT VALUE v
 FROM view5_dt_fmt AS v
-WHERE v.f_dt_fmt < datetime('2020-12-20T00:00:00Z')
+WHERE v.f_dt_fmt < datetime('2020-12-20T00:00:00')
 ORDER BY v.id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/cast-default-null/cast-default-null.15.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/cast-default-null/cast-default-null.15.query.sqlpp
index e9ae3b4..7b88c3d 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/cast-default-null/cast-default-null.15.query.sqlpp
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/index-selection/cast-default-null/cast-default-null.15.query.sqlpp
@@ -21,5 +21,5 @@ USE test;
 
 SELECT VALUE v
 FROM view6_dt AS v
-WHERE v.f_dt < datetime('2020-12-20T00:00:00Z')
+WHERE v.f_dt < datetime('2020-12-20T00:00:00')
 ORDER BY v.id;
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.016.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.016.adm
index 2cbfa87..77ce9ac 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.016.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.016.adm
@@ -1,6 +1,6 @@
 { "values": [ null, 3 ] }
 { "values": [ null, 5 ] }
 { "values": [ null, 6 ] }
-{ "values": [ "\"date\": { 2019-01-20 }", 4 ] }
-{ "values": [ "\"date\": { 2020-02-20 }", 1 ] }
-{ "values": [ "\"date\": { 2021-11-25 }", 2 ] }
\ No newline at end of file
+{ "values": [ "date: { 2019-01-20 }", 4 ] }
+{ "values": [ "date: { 2020-02-20 }", 1 ] }
+{ "values": [ "date: { 2021-11-25 }", 2 ] }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.019.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.019.adm
index 2cbfa87..77ce9ac 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.019.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.019.adm
@@ -1,6 +1,6 @@
 { "values": [ null, 3 ] }
 { "values": [ null, 5 ] }
 { "values": [ null, 6 ] }
-{ "values": [ "\"date\": { 2019-01-20 }", 4 ] }
-{ "values": [ "\"date\": { 2020-02-20 }", 1 ] }
-{ "values": [ "\"date\": { 2021-11-25 }", 2 ] }
\ No newline at end of file
+{ "values": [ "date: { 2019-01-20 }", 4 ] }
+{ "values": [ "date: { 2020-02-20 }", 1 ] }
+{ "values": [ "date: { 2021-11-25 }", 2 ] }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.023.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.023.adm
index 2cbfa87..77ce9ac 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.023.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.023.adm
@@ -1,6 +1,6 @@
 { "values": [ null, 3 ] }
 { "values": [ null, 5 ] }
 { "values": [ null, 6 ] }
-{ "values": [ "\"date\": { 2019-01-20 }", 4 ] }
-{ "values": [ "\"date\": { 2020-02-20 }", 1 ] }
-{ "values": [ "\"date\": { 2021-11-25 }", 2 ] }
\ No newline at end of file
+{ "values": [ "date: { 2019-01-20 }", 4 ] }
+{ "values": [ "date: { 2020-02-20 }", 1 ] }
+{ "values": [ "date: { 2021-11-25 }", 2 ] }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.026.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.026.adm
index 2cbfa87..77ce9ac 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.026.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/ddl/index-cast-null/index-cast-null.026.adm
@@ -1,6 +1,6 @@
 { "values": [ null, 3 ] }
 { "values": [ null, 5 ] }
 { "values": [ null, 6 ] }
-{ "values": [ "\"date\": { 2019-01-20 }", 4 ] }
-{ "values": [ "\"date\": { 2020-02-20 }", 1 ] }
-{ "values": [ "\"date\": { 2021-11-25 }", 2 ] }
\ No newline at end of file
+{ "values": [ "date: { 2019-01-20 }", 4 ] }
+{ "values": [ "date: { 2020-02-20 }", 1 ] }
+{ "values": [ "date: { 2021-11-25 }", 2 ] }
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/type_validation/type_validation.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/type_validation/type_validation.1.adm
index fc4df36..f164f97 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/type_validation/type_validation.1.adm
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/external-library/type_validation/type_validation.1.adm
@@ -1 +1 @@
-"907 9.07 \"907\" 9.07 TRUE \"date\": { 2013-01-01 } datetime: { 1989-09-07T12:13:14.039 } "
+"907 9.07 \"907\" 9.07 TRUE date: { 2013-01-01 } datetime: { 1989-09-07T12:13:14.039 } "
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppStatementUtil.java b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppStatementUtil.java
index 437c299..6cac4c9 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppStatementUtil.java
+++ b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/util/SqlppStatementUtil.java
@@ -21,6 +21,7 @@ package org.apache.asterix.lang.sqlpp.util;
 import java.util.List;
 
 import org.apache.asterix.common.metadata.DataverseName;
+import org.apache.asterix.metadata.utils.TypeUtil;
 import org.apache.hyracks.util.OptionalBoolean;
 
 public class SqlppStatementUtil {
@@ -35,6 +36,7 @@ public class SqlppStatementUtil {
     public static final String DROP_INDEX = "DROP INDEX ";
     public static final String INCLUDE_UNKNOWN_KEY = " INCLUDE UNKNOWN KEY ";
     public static final String EXCLUDE_UNKNOWN_KEY = " EXCLUDE UNKNOWN KEY ";
+    public static final String CAST_DEFAULT_NULL = " CAST (DEFAULT NULL ";
     public static final String ON = " ON ";
     public static final String WHERE = " WHERE ";
     public static final String AND = " AND ";
@@ -72,7 +74,8 @@ public class SqlppStatementUtil {
 
     @SuppressWarnings("squid:S1172") // unused variable
     public static StringBuilder getCreateIndexStatement(StringBuilder stringBuilder, DataverseName dataverseName,
-            String datasetName, String indexName, String fields, OptionalBoolean excludeUnknown, int version) {
+            String datasetName, String indexName, String fields, OptionalBoolean excludeUnknown,
+            boolean castDefaultNull, String dateTimeFmt, String dateFmt, String timeFmt, int version) {
         stringBuilder.append(CREATE_INDEX);
         enclose(stringBuilder, indexName).append(ON);
         StringBuilder appender = enclose(stringBuilder, dataverseName, datasetName).append(fields);
@@ -83,6 +86,22 @@ public class SqlppStatementUtil {
                 appender.append(INCLUDE_UNKNOWN_KEY);
             }
         }
+        if (castDefaultNull) {
+            appender.append(CAST_DEFAULT_NULL);
+            if (dateTimeFmt != null) {
+                appender.append(TypeUtil.DATETIME_PARAMETER_NAME).append(' ');
+                quote(appender, dateTimeFmt).append(' ');
+            }
+            if (dateFmt != null) {
+                appender.append(TypeUtil.DATE_PARAMETER_NAME).append(' ');
+                quote(appender, dateFmt).append(' ');
+            }
+            if (timeFmt != null) {
+                appender.append(TypeUtil.TIME_PARAMETER_NAME).append(' ');
+                quote(appender, timeFmt).append(' ');
+            }
+            appender.append(R_PARENTHESIS);
+        }
         return appender.append(SEMI_COLON);
     }
 
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
index 62d8119..bb51748 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/entitytupletranslators/IndexTupleTranslator.java
@@ -21,7 +21,6 @@ package org.apache.asterix.metadata.entitytupletranslators;
 
 import static org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_CAST;
 import static org.apache.asterix.metadata.bootstrap.MetadataRecordTypes.FIELD_NAME_DEFAULT;
-import static org.apache.asterix.om.types.AOrderedListType.FULL_OPEN_ORDEREDLIST_TYPE;
 
 import java.util.ArrayList;
 import java.util.Calendar;
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
index 215a295..ab5b362 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/IndexUtil.java
@@ -33,6 +33,8 @@ import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.Index;
 import org.apache.asterix.metadata.entities.InternalDatasetDetails;
+import org.apache.asterix.om.base.AString;
+import org.apache.asterix.om.base.IAObject;
 import org.apache.asterix.om.types.IAType;
 import org.apache.asterix.runtime.job.listener.JobEventListenerFactory;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
@@ -188,7 +190,7 @@ public class IndexUtil {
                 && ((Index.ValueIndexDetails) index.getIndexDetails()).getCastDefaultNull().getOrElse(false);
     }
 
-    public static Pair<FunctionIdentifier, String> getTypeConstructorDefaultNull(Index index, IAType type,
+    public static Pair<FunctionIdentifier, IAObject> getTypeConstructorDefaultNull(Index index, IAType type,
             SourceLocation srcLoc) throws CompilationException {
         Triple<String, String, String> temporalFormats = getTemporalFormats(index);
         String format = temporalFormats != null ? TypeUtil.getTemporalFormat(type, temporalFormats) : null;
@@ -197,7 +199,7 @@ public class IndexUtil {
         if (typeConstructorFun == null) {
             throw new CompilationException(ErrorCode.COMPILATION_TYPE_UNSUPPORTED, srcLoc, "index", type.getTypeName());
         }
-        return new Pair<>(typeConstructorFun, format);
+        return new Pair<>(typeConstructorFun, withFormat ? new AString(format) : null);
     }
 
     private static Triple<String, String, String> getTemporalFormats(Index index) {
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java
index cdcfc0b..bb1bd40 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/SecondaryBTreeOperationsHelper.java
@@ -29,7 +29,7 @@ import org.apache.asterix.metadata.declared.MetadataProvider;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.Index;
 import org.apache.asterix.metadata.entities.InternalDatasetDetails;
-import org.apache.asterix.om.base.AString;
+import org.apache.asterix.om.base.IAObject;
 import org.apache.asterix.om.constants.AsterixConstantValue;
 import org.apache.asterix.om.functions.IFunctionDescriptor;
 import org.apache.asterix.om.functions.IFunctionManager;
@@ -329,7 +329,7 @@ public class SecondaryBTreeOperationsHelper extends SecondaryTreeIndexOperations
     private IScalarEvaluatorFactory createConstructorFunction(IFunctionManager funManager, IDataFormat dataFormat,
             IScalarEvaluatorFactory fieldEvalFactory, IAType fieldType) throws AlgebricksException {
         IAType targetType = TypeComputeUtils.getActualType(fieldType);
-        Pair<FunctionIdentifier, String> constructorWithFmt =
+        Pair<FunctionIdentifier, IAObject> constructorWithFmt =
                 IndexUtil.getTypeConstructorDefaultNull(index, targetType, sourceLoc);
         FunctionIdentifier typeConstructorFun = constructorWithFmt.first;
         IFunctionDescriptor typeConstructor = funManager.lookupFunction(typeConstructorFun, sourceLoc);
@@ -337,7 +337,7 @@ public class SecondaryBTreeOperationsHelper extends SecondaryTreeIndexOperations
         // add the format argument if specified
         if (constructorWithFmt.second != null) {
             IScalarEvaluatorFactory fmtEvalFactory =
-                    dataFormat.getConstantEvalFactory(new AsterixConstantValue(new AString(constructorWithFmt.second)));
+                    dataFormat.getConstantEvalFactory(new AsterixConstantValue(constructorWithFmt.second));
             args = new IScalarEvaluatorFactory[] { fieldEvalFactory, fmtEvalFactory };
         } else {
             args = new IScalarEvaluatorFactory[] { fieldEvalFactory };
diff --git a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/TypeUtil.java b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/TypeUtil.java
index 5900c8a..570757e 100644
--- a/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/TypeUtil.java
+++ b/asterixdb/asterix-metadata/src/main/java/org/apache/asterix/metadata/utils/TypeUtil.java
@@ -33,6 +33,7 @@ import org.apache.asterix.common.metadata.DataverseName;
 import org.apache.asterix.metadata.entities.Dataset;
 import org.apache.asterix.metadata.entities.Function;
 import org.apache.asterix.metadata.entities.Index;
+import org.apache.asterix.om.base.IAObject;
 import org.apache.asterix.om.functions.BuiltinFunctions;
 import org.apache.asterix.om.typecomputer.impl.TypeComputeUtils;
 import org.apache.asterix.om.types.AOrderedListType;
@@ -65,11 +66,11 @@ public class TypeUtil {
 
     private static final String FUNCTION_INLINE_TYPE_PREFIX = "$f$t$";
 
-    private static final String DATETIME_PARAMETER_NAME = BuiltinType.ADATETIME.getTypeName();
+    public static final String DATETIME_PARAMETER_NAME = BuiltinType.ADATETIME.getTypeName();
 
-    private static final String DATE_PARAMETER_NAME = BuiltinType.ADATE.getTypeName();
+    public static final String DATE_PARAMETER_NAME = BuiltinType.ADATE.getTypeName();
 
-    private static final String TIME_PARAMETER_NAME = BuiltinType.ATIME.getTypeName();
+    public static final String TIME_PARAMETER_NAME = BuiltinType.ATIME.getTypeName();
 
     private TypeUtil() {
     }
@@ -167,14 +168,14 @@ public class TypeUtil {
         }
     }
 
-    public static String getTemporalFormatArg(AbstractFunctionCallExpression funExpr) {
+    public static IAObject getTemporalFormatArg(AbstractFunctionCallExpression funExpr) {
         FunctionIdentifier funId = funExpr.getFunctionIdentifier();
         if (BuiltinFunctions.DATE_DEFAULT_NULL_CONSTRUCTOR_WITH_FORMAT.equals(funId)
                 || BuiltinFunctions.TIME_DEFAULT_NULL_CONSTRUCTOR_WITH_FORMAT.equals(funId)
                 || BuiltinFunctions.DATETIME_DEFAULT_NULL_CONSTRUCTOR_WITH_FORMAT.equals(funId)) {
             List<Mutable<ILogicalExpression>> arguments = funExpr.getArguments();
             if (arguments.size() > 1) {
-                return ConstantExpressionUtil.getStringConstant(arguments.get(1).getValue());
+                return ConstantExpressionUtil.getConstantIaObject(arguments.get(1).getValue(), null);
             }
         }
         return null;
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADate.java b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADate.java
index 9b26ed5..63c8f31 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADate.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/base/ADate.java
@@ -73,7 +73,7 @@ public class ADate implements IAObject {
     @Override
     public String toString() {
         StringBuilder sbder = new StringBuilder();
-        sbder.append("\"date\": { ");
+        sbder.append("date: { ");
         try {
             GregorianCalendarSystem.getInstance().getExtendStringRepUntilField(chrononTimeInDay * CHRONON_OF_DAY, sbder,
                     GregorianCalendarSystem.Fields.YEAR, GregorianCalendarSystem.Fields.DAY);