diff --git a/impl/pom.xml b/impl/pom.xml
index 8727e1b0..8e0de6d7 100644
--- a/impl/pom.xml
+++ b/impl/pom.xml
@@ -77,6 +77,14 @@
+
+ com.salesforce.datacloud
+ jdbc
+ 0.41.0
+ shaded
+ test
+
+
com.jayway.jsonpath
diff --git a/impl/src/main/java/com/force/formula/commands/FunctionCeiling.java b/impl/src/main/java/com/force/formula/commands/FunctionCeiling.java
index 68055785..c41920e4 100644
--- a/impl/src/main/java/com/force/formula/commands/FunctionCeiling.java
+++ b/impl/src/main/java/com/force/formula/commands/FunctionCeiling.java
@@ -47,11 +47,12 @@ public SQLPair getSQL(FormulaAST node, FormulaContext context, String[] args, St
FormulaSqlHooks hooks = (FormulaSqlHooks)context.getSqlStyle();
String ceil = hooks.isTransactSqlStyle() ? "CEILING" : "CEIL";
int precision = hooks.getExternalPrecision();
+ String arg = hooks.sqlCeilFloorArg(args[0]);
String sql;
if (precision >= 0) { // If external precision is -1 don't reound before Ceil/Floor
- sql = "CASE WHEN " + args[0] + ">=0 THEN "+ceil+"(ROUND(" + args[0] + ","+precision+")) ELSE FLOOR(ROUND(" + args[0] + ","+precision+")) END";
+ sql = "CASE WHEN " + args[0] + ">=0 THEN "+ceil+"(ROUND(" + arg + ","+precision+")) ELSE FLOOR(ROUND(" + arg + ","+precision+")) END";
} else {
- sql = "CASE WHEN " + args[0] + ">=0 THEN "+ceil+"(" + args[0] + ") ELSE FLOOR(" + args[0] + ") END";
+ sql = "CASE WHEN " + args[0] + ">=0 THEN "+ceil+"(" + arg + ") ELSE FLOOR(" + arg + ") END";
}
return new SQLPair(sql, guards[0]);
}
diff --git a/impl/src/main/java/com/force/formula/commands/FunctionFloor.java b/impl/src/main/java/com/force/formula/commands/FunctionFloor.java
index bf897a7c..e4145992 100644
--- a/impl/src/main/java/com/force/formula/commands/FunctionFloor.java
+++ b/impl/src/main/java/com/force/formula/commands/FunctionFloor.java
@@ -43,11 +43,12 @@ public SQLPair getSQL(FormulaAST node, FormulaContext context, String[] args, St
FormulaSqlHooks hooks = (FormulaSqlHooks)context.getSqlStyle();
String ceil = hooks.isTransactSqlStyle() ? "CEILING" : "CEIL";
int precision = hooks.getExternalPrecision();
+ String arg = hooks.sqlCeilFloorArg(args[0]);
String sql;
if (precision >= 0) { // If external precision is -1 don't reound before Ceil/Floor
- sql = "CASE WHEN " + args[0] + ">=0 THEN FLOOR(ROUND(" + args[0] + ","+precision+")) ELSE "+ceil+"(ROUND(" + args[0] + ","+precision+")) END";
+ sql = "CASE WHEN " + args[0] + ">=0 THEN FLOOR(ROUND(" + arg + ","+precision+")) ELSE "+ceil+"(ROUND(" + arg + ","+precision+")) END";
} else {
- sql = "CASE WHEN " + args[0] + ">=0 THEN FLOOR(" + args[0] + ") ELSE "+ceil+"(" + args[0] + ") END";
+ sql = "CASE WHEN " + args[0] + ">=0 THEN FLOOR(" + arg + ") ELSE "+ceil+"(" + arg + ") END";
}
return new SQLPair(sql, guards[0]);
}
diff --git a/impl/src/main/java/com/force/formula/commands/FunctionMCeiling.java b/impl/src/main/java/com/force/formula/commands/FunctionMCeiling.java
index 28b14471..8b738a14 100644
--- a/impl/src/main/java/com/force/formula/commands/FunctionMCeiling.java
+++ b/impl/src/main/java/com/force/formula/commands/FunctionMCeiling.java
@@ -49,11 +49,12 @@ public SQLPair getSQL(FormulaAST node, FormulaContext context, String[] args, St
FormulaSqlHooks hooks = (FormulaSqlHooks)context.getSqlStyle();
String ceil = hooks.isTransactSqlStyle() ? "CEILING" : "CEIL";
int precision = hooks.getExternalPrecision();
+ String arg = hooks.sqlCeilFloorArg(args[0]);
String sql;
if (precision >= 0) { // If external precision is -1 don't reound before Ceil/Floor
- sql = ceil + "(ROUND(" + args[0] + ","+precision+"))";
+ sql = ceil + "(ROUND(" + arg + ","+precision+"))";
} else {
- sql = ceil + "(" + args[0] + ")";
+ sql = ceil + "(" + arg + ")";
}
return new SQLPair(sql, guards[0]);
}
diff --git a/impl/src/main/java/com/force/formula/commands/FunctionMFloor.java b/impl/src/main/java/com/force/formula/commands/FunctionMFloor.java
index c128926d..1a5fd60c 100644
--- a/impl/src/main/java/com/force/formula/commands/FunctionMFloor.java
+++ b/impl/src/main/java/com/force/formula/commands/FunctionMFloor.java
@@ -45,11 +45,12 @@ protected BigDecimal execute(BigDecimal value) {
public SQLPair getSQL(FormulaAST node, FormulaContext context, String[] args, String[] guards) {
FormulaSqlHooks hooks = (FormulaSqlHooks)context.getSqlStyle();
int precision = hooks.getExternalPrecision();
+ String arg = hooks.sqlCeilFloorArg(args[0]);
String sql;
if (precision >= 0) { // If external precision is -1 don't reound before Ceil/Floor
- sql = "FLOOR(ROUND(" + args[0] + ","+precision+"))";
+ sql = "FLOOR(ROUND(" + arg + ","+precision+"))";
} else {
- sql = "FLOOR(" + args[0] + ")";
+ sql = "FLOOR(" + arg + ")";
}
return new SQLPair(sql, guards[0]);
}
diff --git a/impl/src/main/java/com/force/formula/impl/FormulaSqlHooks.java b/impl/src/main/java/com/force/formula/impl/FormulaSqlHooks.java
index 70dcca08..314841c4 100644
--- a/impl/src/main/java/com/force/formula/impl/FormulaSqlHooks.java
+++ b/impl/src/main/java/com/force/formula/impl/FormulaSqlHooks.java
@@ -36,6 +36,17 @@ default int getExternalPrecision() {
return BigDecimalHelper.NUMBER_PRECISION_EXTERNAL;
}
+ /**
+ * Preprocess the argument for CEIL/FLOOR before applying ROUND.
+ * Override this to cast to a specific precision to absorb integer boundary noise
+ * in databases with different numeric precision than PostgreSQL.
+ * @param argument the SQL expression to preprocess
+ * @return the preprocessed argument, default returns unchanged
+ */
+ default String sqlCeilFloorArg(String argument) {
+ return argument;
+ }
+
// Handle plsql regexp differences (where oracle needs regexp_like and postgres wants ~ or similar to)
/**
* @return how to do "not regexp_like", where the %s is used to represent the value to guard against for DateTime Value
diff --git a/impl/src/main/java/com/force/formula/impl/sql/FormulaDataCloudHooks.java b/impl/src/main/java/com/force/formula/impl/sql/FormulaDataCloudHooks.java
new file mode 100644
index 00000000..8aeedc2e
--- /dev/null
+++ b/impl/src/main/java/com/force/formula/impl/sql/FormulaDataCloudHooks.java
@@ -0,0 +1,207 @@
+/**
+ *
+ */
+package com.force.formula.impl.sql;
+
+import java.lang.reflect.Type;
+import java.util.Date;
+
+import com.force.formula.FormulaDateTime;
+
+/**
+ * Implementation of FormulaSqlHooks for Salesforce DataCloud Hyper DB.
+ * Extends FormulaPostgreSQLHooks and overrides methods that use PostgreSQL-specific
+ * functions or syntax not supported by Hyper DB.
+ *
+ * @author adatta
+ * @since 0.9.11
+ */
+public interface FormulaDataCloudHooks extends FormulaPostgreSQLHooks {
+
+ // -------------------------------------------------------
+ // #1: Replace pg_catalog.make_interval() and ::timestamp(0) with
+ // INTERVAL arithmetic and DATE_TRUNC('second', ...) to match
+ // PostgreSQL's ::timestamp(0) truncation behavior.
+ // Hyper DB does not support timestamp with precision specifier.
+ // -------------------------------------------------------
+
+ @Override
+ default String sqlAddDaysToDate(Object lhsValue, Type lhsDataType, Object rhsValue, Type rhsDataType, boolean isAddition) {
+ // Wrap with DATE_TRUNC('second', ...) to match PostgreSQL's ::timestamp(0) behavior.
+ // Without this, sub-second precision from INTERVAL arithmetic leaks into results.
+ if (lhsDataType == Date.class || lhsDataType == FormulaDateTime.class) {
+ return String.format("DATE_TRUNC('second', (%s%s(INTERVAL '1 second'*%s*86400.0)))::timestamp",
+ lhsValue, isAddition ? "+" : "-", rhsValue);
+ } else {
+ return String.format("DATE_TRUNC('second', ((INTERVAL '1 second'*%s*86400.0)%s%s))::timestamp",
+ lhsValue, isAddition ? "+" : "-", rhsValue);
+ }
+ }
+
+ @Override
+ default String sqlSubtractTwoTimestamps(boolean inSeconds, Type dateType) {
+ // Truncate both timestamps to whole seconds before computing epoch difference,
+ // matching PostgreSQL's ::timestamp(0) precision behavior.
+ return inSeconds
+ ? "(EXTRACT(EPOCH FROM DATE_TRUNC('second', %s))-EXTRACT(EPOCH FROM DATE_TRUNC('second', %s)))::numeric"
+ : "((EXTRACT(EPOCH FROM DATE_TRUNC('second', %s))-EXTRACT(EPOCH FROM DATE_TRUNC('second', %s)))::numeric/86400)";
+ }
+
+ // -------------------------------------------------------
+ // #2: Math function precision alignment with PostgreSQL.
+ // Hyper DB limits NUMERIC precision to 38, and its math functions
+ // return slightly different last digits than PostgreSQL.
+ // -------------------------------------------------------
+
+ @Override
+ default String sqlExponent(String argument) {
+ return "EXP(" + argument + "::numeric(38,18))";
+ }
+
+ @Override
+ default String sqlTrigConvert(String argument) {
+ return argument + "::numeric(38,18)";
+ }
+
+ // -------------------------------------------------------
+ // #3: CAST(text AS NUMERIC) truncates decimals in Hyper.
+ // Use explicit precision to preserve decimal places.
+ // -------------------------------------------------------
+
+ @Override
+ default String sqlToNumber() {
+ return "CAST(%s AS DECIMAL(38,18))";
+ }
+
+ // -------------------------------------------------------
+ // #3b: Hyper's NUMERIC arithmetic can produce values like 1.0000000000000001
+ // or 0.9999999999999999 where PostgreSQL produces exact 1.0.
+ // Use explicit ROUND instead of type cast to guarantee rounding
+ // (Hyper's ::numeric(p,s) may truncate instead of round).
+ // -------------------------------------------------------
+
+ @Override
+ default String sqlCeilFloorArg(String argument) {
+ return argument + "::numeric(38,18)";
+ }
+
+ // -------------------------------------------------------
+ // #4: Fix ::timestamp(0) in sqlToCharTimestamp, sqlAddMonths, sqlLastDayOfMonth
+ // Hyper DB does not support timestamp with precision specifier.
+ // Use DATE_TRUNC('second', ...) to truncate to whole seconds.
+ // -------------------------------------------------------
+
+ @Override
+ default String sqlToCharTimestamp() {
+ return "TO_CHAR(DATE_TRUNC('second', (%s)::timestamp), 'YYYY-MM-DD HH24:MI:SS')";
+ }
+
+ @Override
+ default String sqlAddMonths(String dateArg, Type dateArgType, String numMonths) {
+ StringBuffer sb = new StringBuffer();
+ sb.append(" (CASE");
+ sb.append(" WHEN extract(day FROM (date_trunc('month', %s) + interval '1 month -1 day')::timestamp)::numeric = ");
+ sb.append(" extract(day FROM (date_trunc('day', %s)))::numeric ");
+ sb.append(" THEN '1 day'");
+ sb.append(" ELSE '0 day'");
+ sb.append(" END )::interval ");
+
+ String dayAddition = String.format(sb.toString(), dateArg, dateArg);
+ // Wrap result with DATE_TRUNC to match PostgreSQL's ::timestamp(0) precision
+ return String.format("DATE_TRUNC('second', (%s + " + dayAddition
+ + " + ('1 month'::interval*TRUNC(%s))) - " + dayAddition + ")::timestamp", dateArg, numMonths);
+ }
+
+ @Override
+ default String sqlLastDayOfMonth() {
+ return "EXTRACT(DAY FROM (date_trunc('month',%s)+ interval '1 month -1 day')::timestamp)::numeric";
+ }
+
+ // -------------------------------------------------------
+ // #4b: DATE function - Hyper DB throws errors on invalid date inputs
+ // (month=0, day=0, month=13, etc.) even inside CASE WHEN guards
+ // (eager evaluation). Clamp both min AND max to ensure TO_DATE
+ // always receives a valid date. The guard expression still catches
+ // out-of-range values and returns NULL; this clamping just prevents
+ // TO_DATE from erroring during guard evaluation.
+ // -------------------------------------------------------
+
+ @Override
+ default String sqlConstructDate(String yearSql, String monthSql, String daySql) {
+ return "TO_DATE((" + yearSql + ") || '-' || LEAST(GREATEST((" + monthSql + ")::int, 1), 12)"
+ + " || '-' || LEAST(GREATEST((" + daySql + ")::int, 1), 31), 'YYYY-MM-DD')";
+ }
+
+ @Override
+ default String sqlDateFromYearAndMonth(String yearValue, String monthValue) {
+ return "TO_DATE((" + yearValue + ") || '-' || LEAST(GREATEST((" + monthValue + ")::int, 1), 12), 'YYYY-MM')";
+ }
+
+ // -------------------------------------------------------
+ // #5: Time formatting - Hyper doesn't support TO_CHAR with interval or
+ // nested TO_CHAR(TO_TIMESTAMP(...)) for time formatting.
+ // Use EXTRACT-based arithmetic and LPAD instead.
+ // Also, EXTRACT(EPOCH FROM timestamp) returns seconds since Unix epoch,
+ // not seconds since midnight. Subtract DATE_TRUNC('day', ...) to get
+ // seconds since midnight, matching PostgreSQL's TO_CHAR(ts, 'SSSS.MS').
+ // -------------------------------------------------------
+
+ @Override
+ default String sqlToCharTime() {
+ // Hyper doesn't support nested TO_CHAR(TO_TIMESTAMP(...)) for time formatting.
+ // Build HH:MM:SS.mmm manually from milliseconds-since-midnight using arithmetic.
+ return "LPAD(TRUNC(%1$s/3600000)::int::text,2,'0') || ':' || "
+ + "LPAD((TRUNC(%1$s/60000)::int %% 60)::text,2,'0') || ':' || "
+ + "LPAD((TRUNC(%1$s/1000)::int %% 60)::text,2,'0') || '.' || "
+ + "LPAD((%1$s::int %% 1000)::text,3,'0')";
+ }
+
+ @Override
+ default String sqlIntervalToDurationString(String intervalArg, boolean includeDays, String daysIsParam) {
+ // Hyper doesn't support TO_CHAR(interval, 'HH24:MI:SS').
+ // Use EXTRACT to get total seconds from the interval, then format manually.
+ String totalSecs = "EXTRACT(EPOCH FROM " + intervalArg + ")::int";
+ String hh = "LPAD((" + totalSecs + "/3600)::text,2,'0')";
+ String mm = "LPAD(((" + totalSecs + "%3600)/60)::text,2,'0')";
+ String ss = "LPAD((" + totalSecs + "%60)::text,2,'0')";
+ String hhmmss = hh + "||':'||" + mm + "||':'||" + ss;
+ if (daysIsParam != null) {
+ String days = "(" + totalSecs + "/86400)";
+ String hhInDay = "LPAD(((" + totalSecs + "%86400)/3600)::text,2,'0')";
+ String withDays = days + "||':'||" + hhInDay + "||':'||" + mm + "||':'||" + ss;
+ return "CASE WHEN " + daysIsParam + " THEN " + withDays + " ELSE " + hhmmss + " END";
+ } else if (includeDays) {
+ String days = "(" + totalSecs + "/86400)";
+ String hhInDay = "LPAD(((" + totalSecs + "%86400)/3600)::text,2,'0')";
+ return days + "||':'||" + hhInDay + "||':'||" + mm + "||':'||" + ss;
+ } else {
+ return hhmmss;
+ }
+ }
+
+ @Override
+ default String sqlParseTime(String stringExpr) {
+ // Compute seconds since midnight by subtracting the date portion.
+ // EXTRACT(EPOCH FROM (ts - DATE_TRUNC('day', ts))) gives the time-of-day
+ // in seconds, matching PostgreSQL's TO_CHAR(ts, 'SSSS.MS') semantics.
+ String ts = "TO_TIMESTAMP(" + stringExpr + ", '" + sqlHMSAndMsecs() + "')";
+ String secsSinceMidnight = "EXTRACT(EPOCH FROM (" + ts + " - DATE_TRUNC('day', " + ts + ")))";
+ return String.format(sqlToNumber(), secsSinceMidnight) + " * 1000";
+ }
+
+ @Override
+ default String sqlExtractTimeFromDateTime(String dateTimeExpr) {
+ // Hyper may not support TO_CHAR(timestamp, 'SSSS') for seconds-in-day.
+ // Use EXTRACT(EPOCH FROM (ts - DATE_TRUNC('day', ts))) instead.
+ String secsSinceMidnight = "EXTRACT(EPOCH FROM (" + dateTimeExpr
+ + " - DATE_TRUNC('day', " + dateTimeExpr + ")))";
+ return String.format(sqlToNumber(), secsSinceMidnight) + " * 1000";
+ }
+
+ // -------------------------------------------------------
+ // #6: JSON functions are not supported in Hyper DB.
+ // These would need test exclusions rather than hooks.
+ // No hook override needed - tests that use json_extract_path_text
+ // or #>> operator will fail and should be filtered out.
+ // -------------------------------------------------------
+}
\ No newline at end of file
diff --git a/impl/src/main/java/com/force/formula/impl/sql/FormulaDefaultSqlStyle.java b/impl/src/main/java/com/force/formula/impl/sql/FormulaDefaultSqlStyle.java
index 2427486b..bc4d6ae7 100644
--- a/impl/src/main/java/com/force/formula/impl/sql/FormulaDefaultSqlStyle.java
+++ b/impl/src/main/java/com/force/formula/impl/sql/FormulaDefaultSqlStyle.java
@@ -19,4 +19,5 @@ public final class FormulaDefaultSqlStyle {
public static final FormulaSqlHooks GOOGLE = new FormulaGoogleHooks() {};
public static final FormulaSqlHooks SQLITE = new FormulaSqliteHooks() {};
public static final FormulaSqlHooks H2 = new FormulaH2Hooks() {};
+ public static final FormulaSqlHooks DATACLOUD = new FormulaDataCloudHooks() {};
}
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsCurr.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsCurr.xml
new file mode 100644
index 00000000..92ebdd10
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsCurr.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs()
+ Math.abs($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.abs(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?(context.record.customnumber1__c.abs()):null
+
+ ABS(COALESCE($!s0s!$.customnumber1__c, 0))
+ null
+
+
+ ABS($!s0s!$.customnumber1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsSwapTypes.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsSwapTypes.xml
new file mode 100644
index 00000000..05deca26
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsSwapTypes.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs()
+ Math.abs($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.abs(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?(context.record.customnumber1__c.abs()):null
+
+ ABS(COALESCE($!s0s!$.customnumber1__c, 0))
+ null
+
+
+ ABS($!s0s!$.customnumber1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesAbs.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesAbs.xml
new file mode 100644
index 00000000..4d333190
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesAbs.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs().abs()
+ Math.abs(Math.abs($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(Math.abs(Math.abs(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?(context.record.customnumber1__c.abs().abs()):null
+
+ ABS(ABS(COALESCE($!s0s!$.customnumber1__c, 0)))
+ null
+
+
+ ABS(ABS($!s0s!$.customnumber1__c))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesCase.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesCase.xml
new file mode 100644
index 00000000..1842050d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesCase.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber3__c,new $F.Decimal('0'))).abs()
+ Math.abs(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0)))
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null)?(Math.abs(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c))):null
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null)?(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c).abs()):null
+
+ ABS(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END)
+ null
+
+
+ ABS(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesCeiling.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesCeiling.xml
new file mode 100644
index 00000000..1e0d520b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesCeiling.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor()).abs()
+ Math.abs((($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(Math.abs(((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor()).abs()):null
+
+ ABS(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END)
+ null
+
+
+ ABS(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesExp.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesExp.xml
new file mode 100644
index 00000000..830fbdad
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesExp.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).abs()
+ Math.abs(Math.exp($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(Math.abs(Math.exp(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.exp(context.record.customnumber1__c).abs()):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesFloor.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesFloor.xml
new file mode 100644
index 00000000..c596a5be
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesFloor.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil()).abs()
+ Math.abs((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(Math.abs(((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil()).abs()):null
+
+ ABS(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END)
+ null
+
+
+ ABS(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesIf.xml
new file mode 100644
index 00000000..c8b7d84c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesIf.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs()
+ Math.abs($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.abs(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?(context.record.customnumber1__c.abs()):null
+
+ ABS(COALESCE($!s0s!$.customnumber1__c, 0))
+ null
+
+
+ ABS($!s0s!$.customnumber1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesLen.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesLen.xml
new file mode 100644
index 00000000..ee5c4e58
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesLen.xml
@@ -0,0 +1,15 @@
+
+
+ (new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).abs()
+ Math.abs(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length))
+ Math.abs(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length))
+ (new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).abs()
+
+ ABS(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric)
+ null
+
+
+ ABS(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesLn.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesLn.xml
new file mode 100644
index 00000000..3b8db6b1
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesLn.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln().abs()
+ Math.abs(Math.log($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(Math.abs(Math.log(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c).ln().abs()):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesLog.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesLog.xml
new file mode 100644
index 00000000..5110a892
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesLog.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10).abs()
+ Math.abs(Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10)
+ (context.record.customnumber1__c!=null)?(Math.abs(Math.log(context.record.customnumber1__c)/Math.LN10)):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c).log(10).abs()):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesMOD.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesMOD.xml
new file mode 100644
index 00000000..4af36f0b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesMOD.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).abs()
+ Math.abs((($F.nvl(context.record.customnumber1__c,0))%($F.nvl(context.record.customnumber2__c,0))))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.abs(((context.record.customnumber1__c)%(context.record.customnumber2__c)))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(context.record.customnumber1__c.mod(context.record.customnumber2__c).abs()):null
+
+ ABS(MOD(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)))
+ null
+
+
+ ABS(MOD($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesMinus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesMinus.xml
new file mode 100644
index 00000000..c0afa3ce
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesMinus.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).sub($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))).abs()
+ Math.abs(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)-$F.nvl(context.record.customcurrency1__c,0)))
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customcurrency1__c!=null)?(Math.abs((context.record.custompercent1__c/100.0-context.record.customcurrency1__c))):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customcurrency1__c!=null)?((context.record.custompercent1__c.div(100).sub(context.record.customcurrency1__c)).abs()):null
+
+ ABS((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)-COALESCE($!s0s!$.customcurrency1__c, 0)))
+ null
+
+
+ ABS((($!s0s!$.custompercent1__c / 100.0)-$!s0s!$.customcurrency1__c))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesPlus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesPlus.xml
new file mode 100644
index 00000000..fc0d777c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesPlus.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).add($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).abs()
+ Math.abs(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)+$F.nvl(context.record.customnumber1__c,0)))
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customnumber1__c!=null)?(Math.abs((context.record.custompercent1__c/100.0+context.record.customnumber1__c))):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customnumber1__c!=null)?((context.record.custompercent1__c.div(100).add(context.record.customnumber1__c)).abs()):null
+
+ ABS((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)+COALESCE($!s0s!$.customnumber1__c, 0)))
+ null
+
+
+ ABS((($!s0s!$.custompercent1__c / 100.0)+$!s0s!$.customnumber1__c))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesRound.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesRound.xml
new file mode 100644
index 00000000..10a6ce63
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesRound.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).abs()
+ Math.abs(($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.abs((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0)).abs()):null
+
+ ABS(ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer))
+ null
+
+
+ ABS(ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesSqrt.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesSqrt.xml
new file mode 100644
index 00000000..7837f8d5
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesSqrt.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).abs()
+ Math.abs(Math.sqrt($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(Math.abs(Math.sqrt(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.sqrt(context.record.customnumber1__c).abs()):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesTrunc.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesTrunc.xml
new file mode 100644
index 00000000..00fe91de
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesTrunc.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).trunc().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).abs()
+ Math.abs(Math.trunc(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.abs(Math.trunc((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).trunc().div('1e'+context.record.customnumber2__c.toFixed(0)).abs()):null
+
+ ABS(TRUNC(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer))
+ null
+
+
+ ABS(TRUNC($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesValue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesValue.xml
new file mode 100644
index 00000000..900732ed
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAbsUsesValue.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null)?($F.Decimal(context.record.customtext1__c).abs()):null
+ (context.record.customtext1__c!=null)?(Math.abs(Number(context.record.customtext1__c))):null
+ (context.record.customtext1__c!=null)?(Math.abs(Number(context.record.customtext1__c))):null
+ (context.record.customtext1__c!=null)?($F.Decimal(context.record.customtext1__c).abs()):null
+
+ ABS(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18)))
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$'
+
+
+ ABS(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18)))
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddBigTimeValueWithValidInValid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddBigTimeValueWithValidInValid.xml
new file mode 100644
index 00000000..5c8acd50
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddBigTimeValueWithValidInValid.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()+new $F.Decimal('93600000').toNumber()))):null
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()+93600000))):null
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()+93600000))):null
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()+new $F.Decimal('93600000').toNumber()))):null
+
+ MOD(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000+ROUND(MOD(CAST(93600000 AS DECIMAL(38,18)), 86400000))+86400000,86400000)
+ NOT $!s0s!$.dateString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$'
+
+
+ MOD(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000+ROUND(MOD(CAST(93600000 AS DECIMAL(38,18)), 86400000))+86400000,86400000)
+ NOT $!s0s!$.dateString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddConcatSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddConcatSimple.xml
new file mode 100644
index 00000000..78351e0c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddConcatSimple.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customtext1__c,'')+$F.nvl(context.record.customtext2__c,''))
+ ($F.nvl(context.record.customtext1__c,'')+$F.nvl(context.record.customtext2__c,''))
+ ($F.nvl(context.record.customtext1__c,'')+$F.nvl(context.record.customtext2__c,''))
+ ($F.nvl(context.record.customtext1__c,'')+$F.nvl(context.record.customtext2__c,''))
+
+ (CONCAT($!s0s!$.customtext1__c, $!s0s!$.customtext2__c))
+ null
+
+
+ (CONCAT($!s0s!$.customtext1__c, $!s0s!$.customtext2__c))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDate.xml
new file mode 100644
index 00000000..ae8af7eb
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDate.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?((new Date(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()+86400000*(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))|0)))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?((new Date(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()+86400000*(($F.nvl(context.record.customnumber1__c,0))|0)))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&context.record.customnumber1__c!=null)?((new Date(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()+86400000*((context.record.customnumber1__c)|0)))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&context.record.customnumber1__c!=null)?((new Date(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()+86400000*((context.record.customnumber1__c)|0)))):null
+
+ DATE_TRUNC('second', ($!s0s!$.customdate1__c+(INTERVAL '1 second'*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0))*86400.0)))::timestamp
+ null
+
+
+ DATE_TRUNC('second', ($!s0s!$.customdate1__c+(INTERVAL '1 second'*TRUNC($!s0s!$.customnumber1__c)*86400.0)))::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTime.xml
new file mode 100644
index 00000000..a09e8d47
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*($F.nvl(context.record.customnumber1__c,0)))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*(context.record.customnumber1__c))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*(context.record.customnumber1__c))*1000)))):null
+
+ DATE_TRUNC('second', ($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0)))::timestamp
+ null
+
+
+ DATE_TRUNC('second', ($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*$!s0s!$.customnumber1__c*86400.0)))::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTimeGivingDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTimeGivingDate.xml
new file mode 100644
index 00000000..c396f28a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTimeGivingDate.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*($F.nvl(context.record.customnumber1__c,0)))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*(context.record.customnumber1__c))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*(context.record.customnumber1__c))*1000)))):null
+
+ DATE_TRUNC('second', ($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0)))::timestamp
+ null
+
+
+ DATE_TRUNC('second', ($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*$!s0s!$.customnumber1__c*86400.0)))::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTimeGivingDateValue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTimeGivingDateValue.xml
new file mode 100644
index 00000000..62f15d79
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTimeGivingDateValue.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?(new Date((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))))*1000))).setUTCHours(0,0,0,0))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?(new Date((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*($F.nvl(context.record.customnumber1__c,0)))*1000))).setUTCHours(0,0,0,0))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?(new Date((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*(context.record.customnumber1__c))*1000))).setUTCHours(0,0,0,0))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?(new Date((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*(context.record.customnumber1__c))*1000))).setUTCHours(0,0,0,0))):null
+
+ DATE_TRUNC('DAY', (DATE_TRUNC('second', ($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0)))::timestamp AT TIME ZONE 'UTC') AT TIME ZONE '__TZ_ID__')::timestamp
+ null
+
+
+ DATE_TRUNC('DAY', (DATE_TRUNC('second', ($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*$!s0s!$.customnumber1__c*86400.0)))::timestamp AT TIME ZONE 'UTC') AT TIME ZONE '__TZ_ID__')::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTimeMinutes.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTimeMinutes.xml
new file mode 100644
index 00000000..4c23b67b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTimeMinutes.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div(new $F.Decimal('1440'))))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*(($F.nvl(context.record.customnumber1__c,0)/1440)))*1000)))):null
+ (context.record.customnumber1__c!=null&&($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*((context.record.customnumber1__c/1440)))*1000)))):null
+ (context.record.customnumber1__c!=null&&($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*(context.record.customnumber1__c.div(new $F.Decimal('1440'))))*1000)))):null
+
+ DATE_TRUNC('second', ($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*(COALESCE($!s0s!$.customnumber1__c, 0)/1440)*86400.0)))::timestamp
+ null
+
+
+ DATE_TRUNC('second', ($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*($!s0s!$.customnumber1__c/1440)*86400.0)))::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTimeWithExpr.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTimeWithExpr.xml
new file mode 100644
index 00000000..f8ca3b1b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateTimeWithExpr.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&(new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0'))))*1000)))!=null)?((new Date((new Date((new Date((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0'))))*1000))).getTime()+(Math.round(86400*($F.nvl((context.record.custompercent2__c!=null)?(context.record.custompercent2__c.div(100)):null,new $F.Decimal('0'))))*1000))).getTime()+(Math.round(86400*($F.nvl((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null&&($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))!=null)?((new $F.Decimal((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime()-($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())/86400000))):null,new $F.Decimal('0'))))*1000))).getTime()+(Math.round(86400*((new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length)))))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&(new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)))*1000)))!=null)?((new Date((new Date((new Date((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)))*1000))).getTime()+(Math.round(86400*($F.nvl((context.record.custompercent2__c!=null)?(context.record.custompercent2__c/100.0):null,0)))*1000))).getTime()+(Math.round(86400*($F.nvl((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null&&($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))!=null)?(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime()-($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())/86400000)):null,0)))*1000))).getTime()+(Math.round(86400*(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length)))*1000)))):null
+ (($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null&&($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))!=null&&context.record.custompercent2__c!=null&&context.record.custompercent1__c!=null&&($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.custompercent1__c/100.0!=null&&(new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*(context.record.custompercent1__c/100.0))*1000)))!=null&&context.record.custompercent2__c/100.0!=null&&((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime()-($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())/86400000)!=null)?((new Date((new Date((new Date((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*(context.record.custompercent1__c/100.0))*1000))).getTime()+(Math.round(86400*(context.record.custompercent2__c/100.0))*1000))).getTime()+(Math.round(86400*(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime()-($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())/86400000)))*1000))).getTime()+(Math.round(86400*(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length)))*1000)))):null
+ (($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null&&($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))!=null&&context.record.custompercent2__c!=null&&context.record.custompercent1__c!=null&&($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.custompercent1__c.div(100)!=null&&(new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*(context.record.custompercent1__c.div(100)))*1000)))!=null&&context.record.custompercent2__c.div(100)!=null&&(new $F.Decimal((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime()-($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())/86400000))!=null)?((new Date((new Date((new Date((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()+(Math.round(86400*(context.record.custompercent1__c.div(100)))*1000))).getTime()+(Math.round(86400*(context.record.custompercent2__c.div(100)))*1000))).getTime()+(Math.round(86400*((new $F.Decimal((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime()-($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())/86400000))))*1000))).getTime()+(Math.round(86400*((new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length)))))*1000)))):null
+
+ DATE_TRUNC('second', (DATE_TRUNC('second', (DATE_TRUNC('second', (DATE_TRUNC('second', ($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)*86400.0)))::timestamp+(INTERVAL '1 second'*COALESCE(($!s0s!$.custompercent2__c / 100.0), 0)*86400.0)))::timestamp+(INTERVAL '1 second'*COALESCE(((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime3__c)))::numeric/86400), 0)*86400.0)))::timestamp+(INTERVAL '1 second'*COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric*86400.0)))::timestamp
+ null
+
+
+ DATE_TRUNC('second', (DATE_TRUNC('second', (DATE_TRUNC('second', (DATE_TRUNC('second', ($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*($!s0s!$.custompercent1__c / 100.0)*86400.0)))::timestamp+(INTERVAL '1 second'*($!s0s!$.custompercent2__c / 100.0)*86400.0)))::timestamp+(INTERVAL '1 second'*((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime3__c)))::numeric/86400)*86400.0)))::timestamp+(INTERVAL '1 second'*COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric*86400.0)))::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateWithExpr.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateWithExpr.xml
new file mode 100644
index 00000000..a2a295ee
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddDateWithExpr.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&(new Date(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()+86400000*(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))|0)))!=null)?((new Date((new Date((new Date((new Date(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()+86400000*(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))|0))).getTime()+86400000*(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))|0))).getTime()+86400000*(($F.nvl((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))!=null)?((new $F.Decimal((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()-($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())/86400000))):null,new $F.Decimal('0')))|0))).getTime()+86400000*(($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))|0)))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&(new Date(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()+86400000*(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))|0)))!=null)?((new Date((new Date((new Date((new Date(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()+86400000*(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))|0))).getTime()+86400000*(($F.nvl(context.record.customnumber1__c,0))|0))).getTime()+86400000*(($F.nvl((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))!=null)?(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()-($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())/86400000)):null,0))|0))).getTime()+86400000*(($F.nvl(context.record.customcurrency1__c,0))|0)))):null
+ (($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))!=null&&context.record.custompercent1__c!=null&&($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&context.record.custompercent1__c/100.0!=null&&(new Date(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()+86400000*((context.record.custompercent1__c/100.0)|0)))!=null&&context.record.customnumber1__c!=null&&((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()-($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())/86400000)!=null&&context.record.customcurrency1__c!=null)?((new Date((new Date((new Date((new Date(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()+86400000*((context.record.custompercent1__c/100.0)|0))).getTime()+86400000*((context.record.customnumber1__c)|0))).getTime()+86400000*((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()-($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())/86400000))|0))).getTime()+86400000*((context.record.customcurrency1__c)|0)))):null
+ (($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))!=null&&context.record.custompercent1__c!=null&&($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&context.record.custompercent1__c.div(100)!=null&&(new Date(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()+86400000*((context.record.custompercent1__c.div(100))|0)))!=null&&context.record.customnumber1__c!=null&&(new $F.Decimal((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()-($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())/86400000))!=null&&context.record.customcurrency1__c!=null)?((new Date((new Date((new Date((new Date(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()+86400000*((context.record.custompercent1__c.div(100))|0))).getTime()+86400000*((context.record.customnumber1__c)|0))).getTime()+86400000*(((new $F.Decimal((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()-($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())/86400000)))|0))).getTime()+86400000*((context.record.customcurrency1__c)|0)))):null
+
+ DATE_TRUNC('second', (DATE_TRUNC('second', (DATE_TRUNC('second', (DATE_TRUNC('second', ($!s0s!$.customdate1__c+(INTERVAL '1 second'*TRUNC(COALESCE(($!s0s!$.custompercent1__c / 100.0), 0))*86400.0)))::timestamp+(INTERVAL '1 second'*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0))*86400.0)))::timestamp+(INTERVAL '1 second'*TRUNC(COALESCE(((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdate2__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdate3__c)))::numeric/86400), 0))*86400.0)))::timestamp+(INTERVAL '1 second'*TRUNC(COALESCE($!s0s!$.customcurrency1__c, 0))*86400.0)))::timestamp
+ null
+
+
+ DATE_TRUNC('second', (DATE_TRUNC('second', (DATE_TRUNC('second', (DATE_TRUNC('second', ($!s0s!$.customdate1__c+(INTERVAL '1 second'*TRUNC(($!s0s!$.custompercent1__c / 100.0))*86400.0)))::timestamp+(INTERVAL '1 second'*TRUNC($!s0s!$.customnumber1__c)*86400.0)))::timestamp+(INTERVAL '1 second'*TRUNC(((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdate2__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdate3__c)))::numeric/86400))*86400.0)))::timestamp+(INTERVAL '1 second'*TRUNC($!s0s!$.customcurrency1__c)*86400.0)))::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddHoursWithTwoCustFields.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddHoursWithTwoCustFields.xml
new file mode 100644
index 00000000..ea456c72
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddHoursWithTwoCustFields.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.timeString__c!=null)?((new Date(new Date(new Date(context.record.timeString__c).setUTCFullYear(1970,0,1)).getTime()+$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber()))):null
+ (context.record.timeString__c!=null)?((new Date(new Date(new Date(context.record.timeString__c).setUTCFullYear(1970,0,1)).getTime()+$F.nvl(context.record.customnumber1__c,0)))):null
+ (context.record.timeString__c!=null&&context.record.customnumber1__c!=null)?((new Date(new Date(new Date(context.record.timeString__c).setUTCFullYear(1970,0,1)).getTime()+context.record.customnumber1__c))):null
+ (context.record.timeString__c!=null&&context.record.customnumber1__c!=null)?((new Date(new Date(new Date(context.record.timeString__c).setUTCFullYear(1970,0,1)).getTime()+context.record.customnumber1__c.toNumber()))):null
+
+ MOD(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000+ROUND(MOD(CAST(COALESCE($!s0s!$.customnumber1__c, 0) AS DECIMAL(38,18)), 86400000))+86400000,86400000)
+ NOT $!s0s!$.timeString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$'
+
+
+ MOD(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000+ROUND(MOD(CAST($!s0s!$.customnumber1__c AS DECIMAL(38,18)), 86400000))+86400000,86400000)
+ NOT $!s0s!$.timeString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddMonths.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddMonths.xml
new file mode 100644
index 00000000..14e3da82
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddMonths.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdate1__c])?null:$F.parseDateTime(context.record.customdate1__c))!=null)?($F.addmonths(($F.anl([context.record.customdate1__c])?null:$F.parseDateTime(context.record.customdate1__c)),$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber())):null
+ (($F.anl([context.record.customdate1__c])?null:$F.parseDateTime(context.record.customdate1__c))!=null)?($F.addmonths(($F.anl([context.record.customdate1__c])?null:$F.parseDateTime(context.record.customdate1__c)),$F.nvl(context.record.customnumber1__c,0))):null
+ (($F.anl([context.record.customdate1__c])?null:$F.parseDateTime(context.record.customdate1__c))!=null&&context.record.customnumber1__c!=null)?($F.addmonths(($F.anl([context.record.customdate1__c])?null:$F.parseDateTime(context.record.customdate1__c)),context.record.customnumber1__c)):null
+ (($F.anl([context.record.customdate1__c])?null:$F.parseDateTime(context.record.customdate1__c))!=null&&context.record.customnumber1__c!=null)?($F.addmonths(($F.anl([context.record.customdate1__c])?null:$F.parseDateTime(context.record.customdate1__c)),context.record.customnumber1__c.toNumber())):null
+
+ DATE_TRUNC('second', ($!s0s!$.customdate1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval + ('1 month'::interval*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0)))) - (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval )::timestamp
+ null
+
+
+ DATE_TRUNC('second', ($!s0s!$.customdate1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval + ('1 month'::interval*TRUNC($!s0s!$.customnumber1__c))) - (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval )::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddMonthsDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddMonthsDate.xml
new file mode 100644
index 00000000..4a1de93d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddMonthsDate.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?($F.addmonths(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))),$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber())):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?($F.addmonths(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))),$F.nvl(context.record.customnumber1__c,0))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&context.record.customnumber1__c!=null)?($F.addmonths(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))),context.record.customnumber1__c)):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&context.record.customnumber1__c!=null)?($F.addmonths(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))),context.record.customnumber1__c.toNumber())):null
+
+ DATE_TRUNC('second', ($!s0s!$.customdate1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval + ('1 month'::interval*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0)))) - (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval )::timestamp
+ null
+
+
+ DATE_TRUNC('second', ($!s0s!$.customdate1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval + ('1 month'::interval*TRUNC($!s0s!$.customnumber1__c))) - (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval )::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddMonthsDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddMonthsDateTime.xml
new file mode 100644
index 00000000..596eac29
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddMonthsDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?($F.addmonths(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)),$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber())):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?($F.addmonths(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)),$F.nvl(context.record.customnumber1__c,0))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?($F.addmonths(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)),context.record.customnumber1__c)):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?($F.addmonths(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)),context.record.customnumber1__c.toNumber())):null
+
+ DATE_TRUNC('second', ($!s0s!$.customdatetime1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdatetime1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdatetime1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval + ('1 month'::interval*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0)))) - (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdatetime1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdatetime1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval )::timestamp
+ null
+
+
+ DATE_TRUNC('second', ($!s0s!$.customdatetime1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdatetime1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdatetime1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval + ('1 month'::interval*TRUNC($!s0s!$.customnumber1__c))) - (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdatetime1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdatetime1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval )::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddScale.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddScale.xml
new file mode 100644
index 00000000..b8fff9fe
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddScale.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).add($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0'))))
+ ($F.nvl(context.record.customnumber1__c,0)+$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))
+ (context.record.custompercent1__c!=null&&context.record.customnumber1__c!=null&&context.record.custompercent1__c/100.0!=null)?((context.record.customnumber1__c+context.record.custompercent1__c/100.0)):null
+ (context.record.custompercent1__c!=null&&context.record.customnumber1__c!=null&&context.record.custompercent1__c.div(100)!=null)?((context.record.customnumber1__c.add(context.record.custompercent1__c.div(100)))):null
+
+ (COALESCE($!s0s!$.customnumber1__c, 0)+COALESCE(($!s0s!$.custompercent1__c / 100.0), 0))
+ null
+
+
+ ($!s0s!$.customnumber1__c+($!s0s!$.custompercent1__c / 100.0))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddSimple.xml
new file mode 100644
index 00000000..e46e20c1
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddSimple.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).add($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))))
+ ($F.nvl(context.record.customnumber1__c,0)+$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c+context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c.add(context.record.customnumber2__c))):null
+
+ (COALESCE($!s0s!$.customnumber1__c, 0)+COALESCE($!s0s!$.customnumber2__c, 0))
+ null
+
+
+ ($!s0s!$.customnumber1__c+$!s0s!$.customnumber2__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddTimeValueWithValidInValid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddTimeValueWithValidInValid.xml
new file mode 100644
index 00000000..d555f4fe
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddTimeValueWithValidInValid.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()+new $F.Decimal('7200000').toNumber()))):null
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()+7200000))):null
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()+7200000))):null
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()+new $F.Decimal('7200000').toNumber()))):null
+
+ MOD(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000+ROUND(MOD(CAST(7200000 AS DECIMAL(38,18)), 86400000))+86400000,86400000)
+ NOT $!s0s!$.dateString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$'
+
+
+ MOD(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000+ROUND(MOD(CAST(7200000 AS DECIMAL(38,18)), 86400000))+86400000,86400000)
+ NOT $!s0s!$.dateString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithCaseExpr.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithCaseExpr.xml
new file mode 100644
index 00000000..4cce0b8c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithCaseExpr.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(((context.record.customtext2__c&&(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c)==($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c)))?($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0'))):(context.record.customtext3__c&&(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c)==($F.anl([context.record.customtext3__c])?null:context.record.customtext3__c)))?($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))),new $F.Decimal('0')).add($F.nvl(context.record.customcurrency2__c,new $F.Decimal('0')))).add($F.nvl(($F.nvl((context.record.custompercent2__c!=null)?(context.record.custompercent2__c.div(100)):null,new $F.Decimal('0')).add($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))),new $F.Decimal('0'))))
+ (($F.nvl(((context.record.customtext2__c&&(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c)==($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c)))?($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)):(context.record.customtext3__c&&(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c)==($F.anl([context.record.customtext3__c])?null:context.record.customtext3__c)))?($F.nvl(context.record.customcurrency1__c,0)):$F.nvl(context.record.customnumber1__c,0)),0)+$F.nvl(context.record.customcurrency2__c,0))+$F.nvl(($F.nvl((context.record.custompercent2__c!=null)?(context.record.custompercent2__c/100.0):null,0)+$F.nvl(context.record.customnumber2__c,0)),0))
+ (context.record.custompercent2__c!=null&&context.record.custompercent2__c/100.0!=null&&context.record.customnumber2__c!=null&&context.record.custompercent1__c!=null&&((context.record.customtext2__c&&(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c)==($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c)))?(context.record.custompercent1__c/100.0):(context.record.customtext3__c&&(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c)==($F.anl([context.record.customtext3__c])?null:context.record.customtext3__c)))?(context.record.customcurrency1__c):context.record.customnumber1__c)!=null&&context.record.customcurrency2__c!=null&&(context.record.custompercent2__c/100.0+context.record.customnumber2__c)!=null)?(((((context.record.customtext2__c&&(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c)==($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c)))?(context.record.custompercent1__c/100.0):(context.record.customtext3__c&&(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c)==($F.anl([context.record.customtext3__c])?null:context.record.customtext3__c)))?(context.record.customcurrency1__c):context.record.customnumber1__c)+context.record.customcurrency2__c)+(context.record.custompercent2__c/100.0+context.record.customnumber2__c))):null
+ (context.record.custompercent2__c!=null&&context.record.custompercent2__c.div(100)!=null&&context.record.customnumber2__c!=null&&context.record.custompercent1__c!=null&&((context.record.customtext2__c&&(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c)==($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c)))?(context.record.custompercent1__c.div(100)):(context.record.customtext3__c&&(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c)==($F.anl([context.record.customtext3__c])?null:context.record.customtext3__c)))?(context.record.customcurrency1__c):context.record.customnumber1__c)!=null&&context.record.customcurrency2__c!=null&&(context.record.custompercent2__c.div(100).add(context.record.customnumber2__c))!=null)?(((((context.record.customtext2__c&&(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c)==($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c)))?(context.record.custompercent1__c.div(100)):(context.record.customtext3__c&&(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c)==($F.anl([context.record.customtext3__c])?null:context.record.customtext3__c)))?(context.record.customcurrency1__c):context.record.customnumber1__c).add(context.record.customcurrency2__c)).add((context.record.custompercent2__c.div(100).add(context.record.customnumber2__c))))):null
+
+ ((COALESCE(CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext3__c, 'x'))=COALESCE($!s0s!$.customtext3__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN COALESCE($!s0s!$.customcurrency1__c, 0) ELSE COALESCE($!s0s!$.customnumber1__c, 0) END, 0)+COALESCE($!s0s!$.customcurrency2__c, 0))+COALESCE((COALESCE(($!s0s!$.custompercent2__c / 100.0), 0)+COALESCE($!s0s!$.customnumber2__c, 0)), 0))
+ null
+
+
+ ((CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN ($!s0s!$.custompercent1__c / 100.0) WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext3__c, 'x'))=COALESCE($!s0s!$.customtext3__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN $!s0s!$.customcurrency1__c ELSE $!s0s!$.customnumber1__c END+$!s0s!$.customcurrency2__c)+(($!s0s!$.custompercent2__c / 100.0)+$!s0s!$.customnumber2__c))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithDateFunc.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithDateFunc.xml
new file mode 100644
index 00000000..d513b314
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithDateFunc.xml
@@ -0,0 +1,15 @@
+
+
+ (((($F.nvl((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(new $F.Decimal(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCDate())):null,new $F.Decimal('0')).add($F.nvl((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null)?(new $F.Decimal(($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getUTCFullYear())):null,new $F.Decimal('0')))).add($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).add($F.nvl((($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))!=null)?(new $F.Decimal(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getUTCMonth()+1)):null,new $F.Decimal('0')))).add($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0'))))
+ (((($F.nvl((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCDate()):null,0)+$F.nvl((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null)?(($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getUTCFullYear()):null,0))+$F.nvl(context.record.customnumber1__c,0))+$F.nvl((($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))!=null)?((($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getUTCMonth()+1 )):null,0))+$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))
+ (context.record.custompercent1__c!=null&&($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCDate()!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getUTCFullYear()!=null&&context.record.customnumber1__c!=null&&(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getUTCMonth()+1 )!=null&&context.record.custompercent1__c/100.0!=null)?(((((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCDate()+($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getUTCFullYear())+context.record.customnumber1__c)+(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getUTCMonth()+1 ))+context.record.custompercent1__c/100.0)):null
+ (context.record.custompercent1__c!=null&&($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&new $F.Decimal(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCDate())!=null&&new $F.Decimal(($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getUTCFullYear())!=null&&context.record.customnumber1__c!=null&&new $F.Decimal(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getUTCMonth()+1)!=null&&context.record.custompercent1__c.div(100)!=null)?(((((new $F.Decimal(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCDate()).add(new $F.Decimal(($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getUTCFullYear()))).add(context.record.customnumber1__c)).add(new $F.Decimal(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getUTCMonth()+1))).add(context.record.custompercent1__c.div(100)))):null
+
+ ((((COALESCE(EXTRACT(DAY FROM $!s0s!$.customdate1__c)::numeric, 0)+COALESCE(EXTRACT(YEAR FROM $!s0s!$.customdate2__c)::numeric, 0))+COALESCE($!s0s!$.customnumber1__c, 0))+COALESCE(EXTRACT(MONTH FROM $!s0s!$.customdate3__c)::numeric, 0))+COALESCE(($!s0s!$.custompercent1__c / 100.0), 0))
+ null
+
+
+ ((((EXTRACT(DAY FROM $!s0s!$.customdate1__c)::numeric+EXTRACT(YEAR FROM $!s0s!$.customdate2__c)::numeric)+$!s0s!$.customnumber1__c)+EXTRACT(MONTH FROM $!s0s!$.customdate3__c)::numeric)+($!s0s!$.custompercent1__c / 100.0))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithDivision.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithDivision.xml
new file mode 100644
index 00000000..c71917dc
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithDivision.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div(($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).add(new $F.Decimal('1'))))
+ ($F.nvl(context.record.customnumber1__c,0)/($F.nvl(context.record.customnumber2__c,0)+1))
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?((context.record.customnumber1__c/(context.record.customnumber2__c+1))):null
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?(context.record.customnumber1__c.div((context.record.customnumber2__c.add(new $F.Decimal('1'))))):null
+
+ (COALESCE($!s0s!$.customnumber1__c, 0)/(COALESCE($!s0s!$.customnumber2__c, 0)+1))
+ (COALESCE($!s0s!$.customnumber2__c, 0)+1)=0
+
+
+ ($!s0s!$.customnumber1__c/($!s0s!$.customnumber2__c+1))
+ ($!s0s!$.customnumber2__c+1)=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithDivisionSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithDivisionSimple.xml
new file mode 100644
index 00000000..4a66e3e4
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithDivisionSimple.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).add(new $F.Decimal('1')))
+ (($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))+1)
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((context.record.customnumber1__c/context.record.customnumber2__c)+1)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c.div(context.record.customnumber2__c).add(new $F.Decimal('1')))):null
+
+ ((COALESCE($!s0s!$.customnumber1__c, 0)/COALESCE($!s0s!$.customnumber2__c, 0))+1)
+ COALESCE($!s0s!$.customnumber2__c, 0)=0
+
+
+ (($!s0s!$.customnumber1__c/$!s0s!$.customnumber2__c)+1)
+ $!s0s!$.customnumber2__c=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithIfExpr.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithIfExpr.xml
new file mode 100644
index 00000000..a341bd6d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithIfExpr.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')),new $F.Decimal('0')).add($F.nvl(($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')).add($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))),new $F.Decimal('0')))).add($F.nvl(context.record.customnumber3__c,new $F.Decimal('0'))))
+ (($F.nvl($F.nvl(context.record.customnumber1__c,0),0)+$F.nvl(($F.nvl(context.record.customcurrency1__c,0)+$F.nvl(context.record.customnumber2__c,0)),0))+$F.nvl(context.record.customnumber3__c,0))
+ (context.record.customcurrency1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null&&(context.record.customcurrency1__c+context.record.customnumber2__c)!=null&&context.record.customnumber3__c!=null)?(((context.record.customnumber1__c+(context.record.customcurrency1__c+context.record.customnumber2__c))+context.record.customnumber3__c)):null
+ (context.record.customcurrency1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null&&(context.record.customcurrency1__c.add(context.record.customnumber2__c))!=null&&context.record.customnumber3__c!=null)?(((context.record.customnumber1__c.add((context.record.customcurrency1__c.add(context.record.customnumber2__c)))).add(context.record.customnumber3__c))):null
+
+ ((COALESCE(COALESCE($!s0s!$.customnumber1__c, 0), 0)+COALESCE((COALESCE($!s0s!$.customcurrency1__c, 0)+COALESCE($!s0s!$.customnumber2__c, 0)), 0))+COALESCE($!s0s!$.customnumber3__c, 0))
+ null
+
+
+ (($!s0s!$.customnumber1__c+($!s0s!$.customcurrency1__c+$!s0s!$.customnumber2__c))+$!s0s!$.customnumber3__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithTextFunc.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithTextFunc.xml
new file mode 100644
index 00000000..3254d6cf
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAddWithTextFunc.xml
@@ -0,0 +1,15 @@
+
+
+ (((($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).add($F.nvl((context.record.customtext1__c!=null)?($F.Decimal(context.record.customtext1__c)):null,new $F.Decimal('0')))).add($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))).add($F.nvl((new $F.Decimal(($F.anl([context.record.customtext2__c])?(new $F.Decimal(0)):(context.record.customtext2__c).length))),new $F.Decimal('0')))).add($F.nvl($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).mul($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))),new $F.Decimal('0'))))
+ (((($F.nvl(context.record.customnumber1__c,0)+$F.nvl((context.record.customtext1__c!=null)?(Number(context.record.customtext1__c)):null,0))+$F.nvl(context.record.customnumber2__c,0))+$F.nvl(($F.anl([context.record.customtext2__c])?0:(context.record.customtext2__c).length),0))+$F.nvl($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)*$F.nvl(context.record.customcurrency1__c,0),0))
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customcurrency1__c!=null&&context.record.customtext1__c!=null&&context.record.customnumber1__c!=null&&Number(context.record.customtext1__c)!=null&&context.record.customnumber2__c!=null&&($F.anl([context.record.customtext2__c])?0:(context.record.customtext2__c).length)!=null&&context.record.custompercent1__c/100.0*context.record.customcurrency1__c!=null)?(((((context.record.customnumber1__c+Number(context.record.customtext1__c))+context.record.customnumber2__c)+($F.anl([context.record.customtext2__c])?0:(context.record.customtext2__c).length))+context.record.custompercent1__c/100.0*context.record.customcurrency1__c)):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customcurrency1__c!=null&&context.record.customtext1__c!=null&&context.record.customnumber1__c!=null&&$F.Decimal(context.record.customtext1__c)!=null&&context.record.customnumber2__c!=null&&(new $F.Decimal(($F.anl([context.record.customtext2__c])?(new $F.Decimal(0)):(context.record.customtext2__c).length)))!=null&&context.record.custompercent1__c.div(100).mul(context.record.customcurrency1__c)!=null)?(((((context.record.customnumber1__c.add($F.Decimal(context.record.customtext1__c))).add(context.record.customnumber2__c)).add((new $F.Decimal(($F.anl([context.record.customtext2__c])?(new $F.Decimal(0)):(context.record.customtext2__c).length))))).add(context.record.custompercent1__c.div(100).mul(context.record.customcurrency1__c)))):null
+
+ ((((COALESCE($!s0s!$.customnumber1__c, 0)+COALESCE(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18)), 0))+COALESCE($!s0s!$.customnumber2__c, 0))+COALESCE(COALESCE(LENGTH($!s0s!$.customtext2__c),0)::numeric, 0))+COALESCE((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) * COALESCE($!s0s!$.customcurrency1__c, 0)), 0))
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$'
+
+
+ (((($!s0s!$.customnumber1__c+CAST($!s0s!$.customtext1__c AS DECIMAL(38,18)))+$!s0s!$.customnumber2__c)+COALESCE(LENGTH($!s0s!$.customtext2__c),0)::numeric)+(($!s0s!$.custompercent1__c / 100.0) * $!s0s!$.customcurrency1__c))
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testArcCosine.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testArcCosine.xml
new file mode 100644
index 00000000..449c837c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testArcCosine.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.acos($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ Math.acos($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.acos(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.acos(context.record.customnumber1__c)):null
+
+ ACOS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)
+ COALESCE($!s0s!$.customnumber1__c, 0)<-1 OR COALESCE($!s0s!$.customnumber1__c, 0)>1
+
+
+ ACOS($!s0s!$.customnumber1__c)::numeric(38,18)
+ $!s0s!$.customnumber1__c<-1 OR $!s0s!$.customnumber1__c>1
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testArcSine.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testArcSine.xml
new file mode 100644
index 00000000..32c39ee1
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testArcSine.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.asin($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ Math.asin($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.asin(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.asin(context.record.customnumber1__c)):null
+
+ ASIN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)
+ COALESCE($!s0s!$.customnumber1__c, 0)<-1 OR COALESCE($!s0s!$.customnumber1__c, 0)>1
+
+
+ ASIN($!s0s!$.customnumber1__c)::numeric(38,18)
+ $!s0s!$.customnumber1__c<-1 OR $!s0s!$.customnumber1__c>1
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testArcTan2.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testArcTan2.xml
new file mode 100644
index 00000000..d630c1bd
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testArcTan2.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.atan2($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')),$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))
+ Math.atan2($F.nvl(context.record.customnumber1__c,0),$F.nvl(context.record.customnumber2__c,0))
+ Math.atan2(context.record.customnumber1__c,context.record.customnumber2__c)
+ $F.Decimal.atan2(context.record.customnumber1__c,context.record.customnumber2__c)
+
+ ATAN2(COALESCE($!s0s!$.customnumber1__c, 0),COALESCE($!s0s!$.customnumber2__c, 0))::numeric(38,18)
+ null
+
+
+ ATAN2($!s0s!$.customnumber1__c,$!s0s!$.customnumber2__c)::numeric(38,18)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testArcTangent.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testArcTangent.xml
new file mode 100644
index 00000000..e35e8da5
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testArcTangent.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.atan($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ Math.atan($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.atan(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.atan(context.record.customnumber1__c)):null
+
+ ATAN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)
+ null
+
+
+ ATAN($!s0s!$.customnumber1__c)::numeric(38,18)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAscii.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAscii.xml
new file mode 100644
index 00000000..f3ea2990
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testAscii.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null)?((new $F.Decimal(context.record.customtext1__c.codePointAt(0)))):null
+ (context.record.customtext1__c!=null)?(context.record.customtext1__c.codePointAt(0)):null
+ (context.record.customtext1__c!=null)?(context.record.customtext1__c.codePointAt(0)):null
+ (context.record.customtext1__c!=null)?((new $F.Decimal(context.record.customtext1__c.codePointAt(0)))):null
+
+ ASCII($!s0s!$.customtext1__c)::integer
+ null
+
+
+ ASCII($!s0s!$.customtext1__c)::integer
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithCur.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithCur.xml
new file mode 100644
index 00000000..055536e7
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithCur.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))
+ $F.nvl(context.record.customcurrency1__c,0)
+ $F.nvl(context.record.customcurrency1__c,(context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null)
+ $F.nvl(context.record.customcurrency1__c,(context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null)
+
+ COALESCE($!s0s!$.customcurrency1__c, 0)
+ null
+
+
+ COALESCE($!s0s!$.customcurrency1__c, ($!s0s!$.custompercent1__c / 100.0))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithDate.xml
new file mode 100644
index 00000000..b75e0c7f
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithDate.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))),($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ $F.nvl(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))),($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ $F.nvl(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))),($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ $F.nvl(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))),($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+
+ COALESCE($!s0s!$.customdate1__c, $!s0s!$.customdate2__c)
+ null
+
+
+ COALESCE($!s0s!$.customdate1__c, $!s0s!$.customdate2__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithDateFormulaNull.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithDateFormulaNull.xml
new file mode 100644
index 00000000..82189028
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithDateFormulaNull.xml
@@ -0,0 +1,15 @@
+
+
+ (new Date(Date.UTC(new $F.Decimal('2000').toNumber(),new $F.Decimal('1').toNumber()-1,new $F.Decimal('1').toNumber())))
+ (new Date(Date.UTC(2000,1-1,1)))
+ (new Date(Date.UTC(2000,1-1,1)))
+ (new Date(Date.UTC(new $F.Decimal('2000').toNumber(),new $F.Decimal('1').toNumber()-1,new $F.Decimal('1').toNumber())))
+
+ TO_DATE((2000) || '-' || LEAST(GREATEST((1)::int, 1), 12) || '-' || LEAST(GREATEST((1)::int, 1), 31), 'YYYY-MM-DD')
+ null
+
+
+ TO_DATE((2000) || '-' || LEAST(GREATEST((1)::int, 1), 12) || '-' || LEAST(GREATEST((1)::int, 1), 31), 'YYYY-MM-DD')
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithDateTime.xml
new file mode 100644
index 00000000..da6bd258
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)),($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ $F.nvl(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)),($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ $F.nvl(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)),($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ $F.nvl(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)),($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+
+ COALESCE($!s0s!$.customdatetime1__c, $!s0s!$.customdatetime2__c)
+ null
+
+
+ COALESCE($!s0s!$.customdatetime1__c, $!s0s!$.customdatetime2__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithEmail.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithEmail.xml
new file mode 100644
index 00000000..f14e2776
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithEmail.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customemail1__c,context.record.customtextarea1__c)
+ $F.nvl(context.record.customemail1__c,context.record.customtextarea1__c)
+ $F.nvl(context.record.customemail1__c,context.record.customtextarea1__c)
+ $F.nvl(context.record.customemail1__c,context.record.customtextarea1__c)
+
+ COALESCE($!s0s!$.customemail1__c, $!s0s!$.customtextarea1__c)
+ null
+
+
+ COALESCE($!s0s!$.customemail1__c, $!s0s!$.customtextarea1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithError.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithError.xml
new file mode 100644
index 00000000..ce357aac
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithError.xml
@@ -0,0 +1,7 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))
+ ($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))
+ $F.nvl((context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c/context.record.customnumber2__c)):null,context.record.customcurrency1__c)
+ $F.nvl((context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(context.record.customnumber1__c.div(context.record.customnumber2__c)):null,context.record.customcurrency1__c)
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithNum.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithNum.xml
new file mode 100644
index 00000000..0c873c06
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithNum.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))
+ $F.nvl(context.record.customnumber1__c,0)
+ $F.nvl(context.record.customnumber1__c,context.record.customcurrency1__c)
+ $F.nvl(context.record.customnumber1__c,context.record.customcurrency1__c)
+
+ COALESCE($!s0s!$.customnumber1__c, 0)
+ null
+
+
+ COALESCE($!s0s!$.customnumber1__c, $!s0s!$.customcurrency1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithPer.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithPer.xml
new file mode 100644
index 00000000..03b0a5ef
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithPer.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0'))
+ $F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)
+ $F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,context.record.customnumber1__c)
+ $F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,context.record.customnumber1__c)
+
+ COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)
+ null
+
+
+ COALESCE(($!s0s!$.custompercent1__c / 100.0), $!s0s!$.customnumber1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithPhone.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithPhone.xml
new file mode 100644
index 00000000..84448a80
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithPhone.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customphone1__c,context.record.customtextarea1__c)
+ $F.nvl(context.record.customphone1__c,context.record.customtextarea1__c)
+ $F.nvl(context.record.customphone1__c,context.record.customtextarea1__c)
+ $F.nvl(context.record.customphone1__c,context.record.customtextarea1__c)
+
+ COALESCE($!s0s!$.customphone1__c, $!s0s!$.customtextarea1__c)
+ null
+
+
+ COALESCE($!s0s!$.customphone1__c, $!s0s!$.customtextarea1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithText.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithText.xml
new file mode 100644
index 00000000..bf13a897
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithText.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customtext1__c,context.record.customtextarea1__c)
+ $F.nvl(context.record.customtext1__c,context.record.customtextarea1__c)
+ $F.nvl(context.record.customtext1__c,context.record.customtextarea1__c)
+ $F.nvl(context.record.customtext1__c,context.record.customtextarea1__c)
+
+ COALESCE($!s0s!$.customtext1__c, $!s0s!$.customtextarea1__c)
+ null
+
+
+ COALESCE($!s0s!$.customtext1__c, $!s0s!$.customtextarea1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithTextArea.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithTextArea.xml
new file mode 100644
index 00000000..96ecdc51
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithTextArea.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customtextarea1__c,context.record.customtext1__c)
+ $F.nvl(context.record.customtextarea1__c,context.record.customtext1__c)
+ $F.nvl(context.record.customtextarea1__c,context.record.customtext1__c)
+ $F.nvl(context.record.customtextarea1__c,context.record.customtext1__c)
+
+ COALESCE($!s0s!$.customtextarea1__c, $!s0s!$.customtext1__c)
+ null
+
+
+ COALESCE($!s0s!$.customtextarea1__c, $!s0s!$.customtext1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithUrl.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithUrl.xml
new file mode 100644
index 00000000..d15cd057
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBVLWithUrl.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customurl1__c,context.record.customtextarea1__c)
+ $F.nvl(context.record.customurl1__c,context.record.customtextarea1__c)
+ $F.nvl(context.record.customurl1__c,context.record.customtextarea1__c)
+ $F.nvl(context.record.customurl1__c,context.record.customtextarea1__c)
+
+ COALESCE($!s0s!$.customurl1__c, $!s0s!$.customtextarea1__c)
+ null
+
+
+ COALESCE($!s0s!$.customurl1__c, $!s0s!$.customtextarea1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBigDivide.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBigDivide.xml
new file mode 100644
index 00000000..2edb0675
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBigDivide.xml
@@ -0,0 +1,7 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).mul($F.nvl(context.record.customnumber3__c,new $F.Decimal('0')))
+ ($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))*$F.nvl(context.record.customnumber3__c,0)
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber3__c!=null)?((context.record.customnumber1__c/context.record.customnumber2__c)*context.record.customnumber3__c):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber3__c!=null)?(context.record.customnumber1__c.div(context.record.customnumber2__c).mul(context.record.customnumber3__c)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBigDivideWithFunc.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBigDivideWithFunc.xml
new file mode 100644
index 00000000..baa5fee5
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBigDivideWithFunc.xml
@@ -0,0 +1,7 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mul($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).div(new $F.Decimal(Math.pow($F.Decimal(""+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))),$F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))))).mul(new $F.Decimal(Math.pow($F.nvl(context.record.customnumber3__c,new $F.Decimal('0')),$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')))))
+ ($F.nvl(context.record.customnumber1__c,0)*$F.nvl(context.record.customnumber2__c,0)/Math.pow(Number(""+$F.nvl(context.record.customnumber2__c,0)),$F.nvl(context.record.customnumber2__c,0)))*Math.pow($F.nvl(context.record.customnumber3__c,0),$F.nvl(context.record.customnumber3__c,0))
+ (context.record.customnumber3__c!=null&&context.record.customnumber3__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c*context.record.customnumber2__c/Math.pow(Number(""+context.record.customnumber2__c),context.record.customnumber2__c))*Math.pow(context.record.customnumber3__c,context.record.customnumber3__c)):null
+ (context.record.customnumber3__c!=null&&context.record.customnumber3__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(context.record.customnumber1__c.mul(context.record.customnumber2__c).div(new $F.Decimal(Math.pow($F.Decimal(""+context.record.customnumber2__c),context.record.customnumber2__c))).mul(new $F.Decimal(Math.pow(context.record.customnumber3__c,context.record.customnumber3__c)))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBooleanAND.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBooleanAND.xml
new file mode 100644
index 00000000..49c46510
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBooleanAND.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)!=null)?(((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null))&&($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false))):false
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)!=null)?(((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null))&&($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false))):false
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)!=null)?(((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null))&&($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false))):false
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)!=null)?(((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null))&&($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false))):false
+
+ ((COALESCE(CASE WHEN ($!s0s!$.customdate1__c>$!s0s!$.customdate2__c) THEN '1' ELSE '0' END, '0') = '1') AND ((COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') OR (COALESCE($!s0s!$.customcheckbox2__c, '0') = '1')))
+ null
+
+
+ ((COALESCE(CASE WHEN ($!s0s!$.customdate1__c>$!s0s!$.customdate2__c) THEN '1' ELSE '0' END, '0') = '1') AND ((COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') OR (COALESCE($!s0s!$.customcheckbox2__c, '0') = '1')))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBooleanEq.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBooleanEq.xml
new file mode 100644
index 00000000..ad0f876f
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBooleanEq.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null))==($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null))==($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null))==($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null))==($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false))
+
+ (CASE WHEN (COALESCE(CASE WHEN ($!s0s!$.customdate1__c>$!s0s!$.customdate2__c) THEN '1' ELSE '0' END, '0') = '1') THEN 1 ELSE 0 END=CASE WHEN ((COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') OR (COALESCE($!s0s!$.customcheckbox2__c, '0') = '1')) THEN 1 ELSE 0 END)
+ null
+
+
+ (CASE WHEN (COALESCE(CASE WHEN ($!s0s!$.customdate1__c>$!s0s!$.customdate2__c) THEN '1' ELSE '0' END, '0') = '1') THEN 1 ELSE 0 END=CASE WHEN ((COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') OR (COALESCE($!s0s!$.customcheckbox2__c, '0') = '1')) THEN 1 ELSE 0 END)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBooleanNeq.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBooleanNeq.xml
new file mode 100644
index 00000000..9431281e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testBooleanNeq.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null))!=($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null))!=($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null))!=($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null))!=($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false))
+
+ (CASE WHEN (COALESCE(CASE WHEN ($!s0s!$.customdate1__c>$!s0s!$.customdate2__c) THEN '1' ELSE '0' END, '0') = '1') THEN 1 ELSE 0 END<>CASE WHEN ((COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') OR (COALESCE($!s0s!$.customcheckbox2__c, '0') = '1')) THEN 1 ELSE 0 END)
+ null
+
+
+ (CASE WHEN (COALESCE(CASE WHEN ($!s0s!$.customdate1__c>$!s0s!$.customdate2__c) THEN '1' ELSE '0' END, '0') = '1') THEN 1 ELSE 0 END<>CASE WHEN ((COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') OR (COALESCE($!s0s!$.customcheckbox2__c, '0') = '1')) THEN 1 ELSE 0 END)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilRound.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilRound.xml
new file mode 100644
index 00000000..4c0ec8be
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilRound.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).mul($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).mul($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).mul($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).toDP(18).floor())
+ ((($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))*$F.nvl(context.record.customnumber2__c,0))>=0?Math.ceil(($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))*$F.nvl(context.record.customnumber2__c,0)):Math.floor(($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))*$F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber2__c!=null)?((((context.record.customnumber1__c/context.record.customnumber2__c)*context.record.customnumber2__c)>=0?Math.ceil((context.record.customnumber1__c/context.record.customnumber2__c)*context.record.customnumber2__c):Math.floor((context.record.customnumber1__c/context.record.customnumber2__c)*context.record.customnumber2__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c.div(context.record.customnumber2__c).mul(context.record.customnumber2__c).isPos()?context.record.customnumber1__c.div(context.record.customnumber2__c).mul(context.record.customnumber2__c).toDP(18).ceil():context.record.customnumber1__c.div(context.record.customnumber2__c).mul(context.record.customnumber2__c).toDP(18).floor())):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilSimple.xml
new file mode 100644
index 00000000..eae9a825
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilSimple.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor())
+ (($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor())):null
+
+ CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesAbs.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesAbs.xml
new file mode 100644
index 00000000..f5c798a2
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesAbs.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs().isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs().toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs().toDP(18).floor())
+ ((Math.abs($F.nvl(context.record.customnumber1__c,0)))>=0?Math.ceil(Math.abs($F.nvl(context.record.customnumber1__c,0))):Math.floor(Math.abs($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(((Math.abs(context.record.customnumber1__c))>=0?Math.ceil(Math.abs(context.record.customnumber1__c)):Math.floor(Math.abs(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c.abs().isPos()?context.record.customnumber1__c.abs().toDP(18).ceil():context.record.customnumber1__c.abs().toDP(18).floor())):null
+
+ CASE WHEN ABS(COALESCE($!s0s!$.customnumber1__c, 0))>=0 THEN CEIL(ROUND(ABS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) ELSE FLOOR(ROUND(ABS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN ABS($!s0s!$.customnumber1__c)>=0 THEN CEIL(ROUND(ABS($!s0s!$.customnumber1__c)::numeric(38,18),33)) ELSE FLOOR(ROUND(ABS($!s0s!$.customnumber1__c)::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesCase.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesCase.xml
new file mode 100644
index 00000000..f1ce6da8
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesCase.xml
@@ -0,0 +1,15 @@
+
+
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber3__c,new $F.Decimal('0'))).isPos()?((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber3__c,new $F.Decimal('0'))).toDP(18).ceil():((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber3__c,new $F.Decimal('0'))).toDP(18).floor())
+ ((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0)))>=0?Math.ceil(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0))):Math.floor(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0))))
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null)?(((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c))>=0?Math.ceil(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)):Math.floor(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)))):null
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null)?((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c).isPos()?((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c).toDP(18).ceil():((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c).toDP(18).floor())):null
+
+ CASE WHEN CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END>=0 THEN CEIL(ROUND(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END::numeric(38,18),33)) ELSE FLOOR(ROUND(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END>=0 THEN CEIL(ROUND(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END::numeric(38,18),33)) ELSE FLOOR(ROUND(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesCeil.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesCeil.xml
new file mode 100644
index 00000000..3af3d4bb
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesCeil.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor()).isPos()?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor()).toDP(18).ceil():($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor()).toDP(18).floor())
+ (((($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0))))>=0?Math.ceil((($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0)))):Math.floor((($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0)))))
+ (context.record.customnumber1__c!=null)?(((((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c)))>=0?Math.ceil(((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c))):Math.floor(((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c))))):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor()).isPos()?(context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor()).toDP(18).ceil():(context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor()).toDP(18).floor())):null
+
+ CASE WHEN CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END>=0 THEN CEIL(ROUND(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END::numeric(38,18),33)) ELSE FLOOR(ROUND(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END>=0 THEN CEIL(ROUND(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END::numeric(38,18),33)) ELSE FLOOR(ROUND(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesFloor.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesFloor.xml
new file mode 100644
index 00000000..c2780ad7
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesFloor.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil()).isPos()?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil()).toDP(18).ceil():($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil()).toDP(18).floor())
+ (((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0))))>=0?Math.ceil((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0)))):Math.floor((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0)))))
+ (context.record.customnumber1__c!=null)?(((((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c)))>=0?Math.ceil(((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c))):Math.floor(((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c))))):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil()).isPos()?(context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil()).toDP(18).ceil():(context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil()).toDP(18).floor())):null
+
+ CASE WHEN CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END>=0 THEN CEIL(ROUND(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END::numeric(38,18),33)) ELSE FLOOR(ROUND(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END>=0 THEN CEIL(ROUND(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END::numeric(38,18),33)) ELSE FLOOR(ROUND(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesIf.xml
new file mode 100644
index 00000000..e1e0ccf6
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesIf.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor())
+ (($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor())):null
+
+ CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesLen.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesLen.xml
new file mode 100644
index 00000000..d2f3f75a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesLen.xml
@@ -0,0 +1,15 @@
+
+
+ ((new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).isPos()?(new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).toDP(18).ceil():(new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).toDP(18).floor())
+ ((($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length))>=0?Math.ceil(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length)):Math.floor(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length)))
+ ((($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length))>=0?Math.ceil(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length)):Math.floor(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length)))
+ ((new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).isPos()?(new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).toDP(18).ceil():(new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).toDP(18).floor())
+
+ CASE WHEN COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric>=0 THEN CEIL(ROUND(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric>=0 THEN CEIL(ROUND(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesLn.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesLn.xml
new file mode 100644
index 00000000..496c05e2
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesLn.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln().isPos()?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln().toDP(18).ceil():($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln().toDP(18).floor())
+ ((Math.log($F.nvl(context.record.customnumber1__c,0)))>=0?Math.ceil(Math.log($F.nvl(context.record.customnumber1__c,0))):Math.floor(Math.log($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(((Math.log(context.record.customnumber1__c))>=0?Math.ceil(Math.log(context.record.customnumber1__c)):Math.floor(Math.log(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c).ln().isPos()?(context.record.customnumber1__c).ln().toDP(18).ceil():(context.record.customnumber1__c).ln().toDP(18).floor())):null
+
+ CASE WHEN LN(COALESCE($!s0s!$.customnumber1__c, 0))>=0 THEN CEIL(ROUND(LN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) ELSE FLOOR(ROUND(LN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) END
+ COALESCE($!s0s!$.customnumber1__c, 0)<=0
+
+
+ CASE WHEN LN($!s0s!$.customnumber1__c)>=0 THEN CEIL(ROUND(LN($!s0s!$.customnumber1__c)::numeric(38,18),33)) ELSE FLOOR(ROUND(LN($!s0s!$.customnumber1__c)::numeric(38,18),33)) END
+ $!s0s!$.customnumber1__c<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesLog.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesLog.xml
new file mode 100644
index 00000000..fec4b8af
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesLog.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10).isPos()?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10).toDP(18).ceil():($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10).toDP(18).floor())
+ ((Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10)>=0?Math.ceil(Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10):Math.floor(Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10))
+ (context.record.customnumber1__c!=null)?(((Math.log(context.record.customnumber1__c)/Math.LN10)>=0?Math.ceil(Math.log(context.record.customnumber1__c)/Math.LN10):Math.floor(Math.log(context.record.customnumber1__c)/Math.LN10))):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c).log(10).isPos()?(context.record.customnumber1__c).log(10).toDP(18).ceil():(context.record.customnumber1__c).log(10).toDP(18).floor())):null
+
+ CASE WHEN LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))>=0 THEN CEIL(ROUND(LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) ELSE FLOOR(ROUND(LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) END
+ COALESCE($!s0s!$.customnumber1__c, 0)<=0
+
+
+ CASE WHEN LOG(10, $!s0s!$.customnumber1__c)>=0 THEN CEIL(ROUND(LOG(10, $!s0s!$.customnumber1__c)::numeric(38,18),33)) ELSE FLOOR(ROUND(LOG(10, $!s0s!$.customnumber1__c)::numeric(38,18),33)) END
+ $!s0s!$.customnumber1__c<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesMOD.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesMOD.xml
new file mode 100644
index 00000000..31c05645
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesMOD.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).toDP(18).floor())
+ (((($F.nvl(context.record.customnumber1__c,0))%($F.nvl(context.record.customnumber2__c,0))))>=0?Math.ceil((($F.nvl(context.record.customnumber1__c,0))%($F.nvl(context.record.customnumber2__c,0)))):Math.floor((($F.nvl(context.record.customnumber1__c,0))%($F.nvl(context.record.customnumber2__c,0)))))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((((context.record.customnumber1__c)%(context.record.customnumber2__c)))>=0?Math.ceil(((context.record.customnumber1__c)%(context.record.customnumber2__c))):Math.floor(((context.record.customnumber1__c)%(context.record.customnumber2__c))))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c.mod(context.record.customnumber2__c).isPos()?context.record.customnumber1__c.mod(context.record.customnumber2__c).toDP(18).ceil():context.record.customnumber1__c.mod(context.record.customnumber2__c).toDP(18).floor())):null
+
+ CASE WHEN MOD(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0))>=0 THEN CEIL(ROUND(MOD(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0))::numeric(38,18),33)) ELSE FLOOR(ROUND(MOD(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0))::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN MOD($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c)>=0 THEN CEIL(ROUND(MOD($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c)::numeric(38,18),33)) ELSE FLOOR(ROUND(MOD($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c)::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesMultiply.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesMultiply.xml
new file mode 100644
index 00000000..8317aa28
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesMultiply.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).mul($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))).isPos()?$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).mul($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))).toDP(18).ceil():$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).mul($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))).toDP(18).floor())
+ (($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)*$F.nvl(context.record.customcurrency1__c,0))>=0?Math.ceil($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)*$F.nvl(context.record.customcurrency1__c,0)):Math.floor($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)*$F.nvl(context.record.customcurrency1__c,0)))
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customcurrency1__c!=null)?(((context.record.custompercent1__c/100.0*context.record.customcurrency1__c)>=0?Math.ceil(context.record.custompercent1__c/100.0*context.record.customcurrency1__c):Math.floor(context.record.custompercent1__c/100.0*context.record.customcurrency1__c))):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customcurrency1__c!=null)?((context.record.custompercent1__c.div(100).mul(context.record.customcurrency1__c).isPos()?context.record.custompercent1__c.div(100).mul(context.record.customcurrency1__c).toDP(18).ceil():context.record.custompercent1__c.div(100).mul(context.record.customcurrency1__c).toDP(18).floor())):null
+
+ CASE WHEN (COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) * COALESCE($!s0s!$.customcurrency1__c, 0))>=0 THEN CEIL(ROUND((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) * COALESCE($!s0s!$.customcurrency1__c, 0))::numeric(38,18),33)) ELSE FLOOR(ROUND((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) * COALESCE($!s0s!$.customcurrency1__c, 0))::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN (($!s0s!$.custompercent1__c / 100.0) * $!s0s!$.customcurrency1__c)>=0 THEN CEIL(ROUND((($!s0s!$.custompercent1__c / 100.0) * $!s0s!$.customcurrency1__c)::numeric(38,18),33)) ELSE FLOOR(ROUND((($!s0s!$.custompercent1__c / 100.0) * $!s0s!$.customcurrency1__c)::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesPlus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesPlus.xml
new file mode 100644
index 00000000..0d2e8d35
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesPlus.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).add($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).isPos()?($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).add($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).toDP(18).ceil():($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).add($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).toDP(18).floor())
+ ((($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)+$F.nvl(context.record.customnumber1__c,0)))>=0?Math.ceil(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)+$F.nvl(context.record.customnumber1__c,0))):Math.floor(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)+$F.nvl(context.record.customnumber1__c,0))))
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customnumber1__c!=null)?((((context.record.custompercent1__c/100.0+context.record.customnumber1__c))>=0?Math.ceil((context.record.custompercent1__c/100.0+context.record.customnumber1__c)):Math.floor((context.record.custompercent1__c/100.0+context.record.customnumber1__c)))):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customnumber1__c!=null)?(((context.record.custompercent1__c.div(100).add(context.record.customnumber1__c)).isPos()?(context.record.custompercent1__c.div(100).add(context.record.customnumber1__c)).toDP(18).ceil():(context.record.custompercent1__c.div(100).add(context.record.customnumber1__c)).toDP(18).floor())):null
+
+ CASE WHEN (COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)+COALESCE($!s0s!$.customnumber1__c, 0))>=0 THEN CEIL(ROUND((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)+COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) ELSE FLOOR(ROUND((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)+COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN (($!s0s!$.custompercent1__c / 100.0)+$!s0s!$.customnumber1__c)>=0 THEN CEIL(ROUND((($!s0s!$.custompercent1__c / 100.0)+$!s0s!$.customnumber1__c)::numeric(38,18),33)) ELSE FLOOR(ROUND((($!s0s!$.custompercent1__c / 100.0)+$!s0s!$.customnumber1__c)::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesRound.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesRound.xml
new file mode 100644
index 00000000..e66078c3
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesRound.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).isPos()?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).toDP(18).ceil():($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).toDP(18).floor())
+ ((($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0)))>=0?Math.ceil(($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))):Math.floor(($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c))>=0?Math.ceil((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)):Math.floor((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0)).isPos()?(context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0)).toDP(18).ceil():(context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0)).toDP(18).floor())):null
+
+ CASE WHEN ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)>=0 THEN CEIL(ROUND(ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)::numeric(38,18),33)) ELSE FLOOR(ROUND(ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)>=0 THEN CEIL(ROUND(ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)::numeric(38,18),33)) ELSE FLOOR(ROUND(ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesSqrt.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesSqrt.xml
new file mode 100644
index 00000000..5bb3e559
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesSqrt.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).isPos()?$F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).toDP(18).ceil():$F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).toDP(18).floor())
+ ((Math.sqrt($F.nvl(context.record.customnumber1__c,0)))>=0?Math.ceil(Math.sqrt($F.nvl(context.record.customnumber1__c,0))):Math.floor(Math.sqrt($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(((Math.sqrt(context.record.customnumber1__c))>=0?Math.ceil(Math.sqrt(context.record.customnumber1__c)):Math.floor(Math.sqrt(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?(($F.Decimal.sqrt(context.record.customnumber1__c).isPos()?$F.Decimal.sqrt(context.record.customnumber1__c).toDP(18).ceil():$F.Decimal.sqrt(context.record.customnumber1__c).toDP(18).floor())):null
+
+ CASE WHEN SQRT(COALESCE($!s0s!$.customnumber1__c, 0))>=0 THEN CEIL(ROUND(SQRT(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) ELSE FLOOR(ROUND(SQRT(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) END
+ COALESCE($!s0s!$.customnumber1__c, 0)<0
+
+
+ CASE WHEN SQRT($!s0s!$.customnumber1__c)>=0 THEN CEIL(ROUND(SQRT($!s0s!$.customnumber1__c)::numeric(38,18),33)) ELSE FLOOR(ROUND(SQRT($!s0s!$.customnumber1__c)::numeric(38,18),33)) END
+ $!s0s!$.customnumber1__c<0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesValue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesValue.xml
new file mode 100644
index 00000000..7befdd73
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCeilUsesValue.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null)?(($F.Decimal(context.record.customtext1__c).isPos()?$F.Decimal(context.record.customtext1__c).toDP(18).ceil():$F.Decimal(context.record.customtext1__c).toDP(18).floor())):null
+ (context.record.customtext1__c!=null)?(((Number(context.record.customtext1__c))>=0?Math.ceil(Number(context.record.customtext1__c)):Math.floor(Number(context.record.customtext1__c)))):null
+ (context.record.customtext1__c!=null)?(((Number(context.record.customtext1__c))>=0?Math.ceil(Number(context.record.customtext1__c)):Math.floor(Number(context.record.customtext1__c)))):null
+ (context.record.customtext1__c!=null)?(($F.Decimal(context.record.customtext1__c).isPos()?$F.Decimal(context.record.customtext1__c).toDP(18).ceil():$F.Decimal(context.record.customtext1__c).toDP(18).floor())):null
+
+ CASE WHEN CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))>=0 THEN CEIL(ROUND(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))::numeric(38,18),33)) ELSE FLOOR(ROUND(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))::numeric(38,18),33)) END
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$'
+
+
+ CASE WHEN CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))>=0 THEN CEIL(ROUND(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))::numeric(38,18),33)) ELSE FLOOR(ROUND(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))::numeric(38,18),33)) END
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testChr.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testChr.xml
new file mode 100644
index 00000000..0b9ed254
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testChr.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber__c,new $F.Decimal('0')).toNumber()>0?String.fromCodePoint(Math.trunc($F.nvl(context.record.customnumber__c,new $F.Decimal('0')).toNumber())):null)
+ ($F.nvl(context.record.customnumber__c,0)>0?String.fromCodePoint(Math.trunc($F.nvl(context.record.customnumber__c,0))):null)
+ (context.record.customnumber__c&&context.record.customnumber__c>0?String.fromCodePoint(Math.trunc(context.record.customnumber__c)):null)
+ (context.record.customnumber__c&&context.record.customnumber__c.toNumber()>0?String.fromCodePoint(Math.trunc(context.record.customnumber__c.toNumber())):null)
+
+ CHR(TRUNC(COALESCE($!s0s!$.customnumber__c, 0))::integer)
+ (COALESCE($!s0s!$.customnumber__c, 0)<1 OR COALESCE($!s0s!$.customnumber__c, 0)>1114111)
+
+
+ CHR(TRUNC($!s0s!$.customnumber__c)::integer)
+ ($!s0s!$.customnumber__c<1 OR $!s0s!$.customnumber__c>1114111)
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCommentsInsideFormula.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCommentsInsideFormula.xml
new file mode 100644
index 00000000..4d2e780c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCommentsInsideFormula.xml
@@ -0,0 +1,15 @@
+
+
+ ((new $F.Decimal(new Date(new Date().setUTCHours(0,0,0,0)).getUTCFullYear())).eq(new $F.Decimal('2009'))?new $F.Decimal('0'):new $F.Decimal('0'))
+ ((new Date(new Date().setUTCHours(0,0,0,0)).getUTCFullYear())==(2009)?0:0)
+ ((new Date(new Date().setUTCHours(0,0,0,0)).getUTCFullYear())==(2009)?0:0)
+ ((new $F.Decimal(new Date(new Date().setUTCHours(0,0,0,0)).getUTCFullYear())).eq(new $F.Decimal('2009'))?new $F.Decimal('0'):new $F.Decimal('0'))
+
+ CASE WHEN (EXTRACT(YEAR FROM __TODAY__)::numeric=2009) THEN 0 ELSE 0 END
+ null
+
+
+ CASE WHEN (EXTRACT(YEAR FROM __TODAY__)::numeric=2009) THEN 0 ELSE 0 END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testConstDoubleNegation.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testConstDoubleNegation.xml
new file mode 100644
index 00000000..325be95d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testConstDoubleNegation.xml
@@ -0,0 +1,15 @@
+
+
+ ((((($F.nvl(context.record.customnumber__c,new $F.Decimal('0')).sub(new $F.Decimal('2').neg())).add($F.nvl(context.record.customnumber__c,new $F.Decimal('0')))).sub(new $F.Decimal('2').neg())).add($F.nvl(context.record.customnumber__c,new $F.Decimal('0')))).sub(new $F.Decimal('2').neg()))
+ ((((($F.nvl(context.record.customnumber__c,0)-(-2))+$F.nvl(context.record.customnumber__c,0))-(-2))+$F.nvl(context.record.customnumber__c,0))-(-2))
+ (context.record.customnumber__c!=null&&context.record.customnumber__c!=null&&context.record.customnumber__c!=null)?((((((context.record.customnumber__c-(-2))+context.record.customnumber__c)-(-2))+context.record.customnumber__c)-(-2))):null
+ (context.record.customnumber__c!=null&&context.record.customnumber__c!=null&&context.record.customnumber__c!=null)?((((((context.record.customnumber__c.sub(new $F.Decimal('2').neg())).add(context.record.customnumber__c)).sub(new $F.Decimal('2').neg())).add(context.record.customnumber__c)).sub(new $F.Decimal('2').neg()))):null
+
+ (((((COALESCE($!s0s!$.customnumber__c, 0)-(-2))+COALESCE($!s0s!$.customnumber__c, 0))-(-2))+COALESCE($!s0s!$.customnumber__c, 0))-(-2))
+ null
+
+
+ ((((($!s0s!$.customnumber__c-(-2))+$!s0s!$.customnumber__c)-(-2))+$!s0s!$.customnumber__c)-(-2))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCosine.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCosine.xml
new file mode 100644
index 00000000..6675ab89
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testCosine.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.cos($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ Math.cos($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.cos(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.cos(context.record.customnumber1__c)):null
+
+ COS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)
+ null
+
+
+ COS($!s0s!$.customnumber1__c)::numeric(38,18)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDATEVALUEWithString.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDATEVALUEWithString.xml
new file mode 100644
index 00000000..a0c5cac2
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDATEVALUEWithString.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null)?(new Date(new Date(context.record.customtext1__c).setUTCHours(0,0,0,0))):null
+ (context.record.customtext1__c!=null)?(new Date(new Date(context.record.customtext1__c).setUTCHours(0,0,0,0))):null
+ (context.record.customtext1__c!=null)?(new Date(new Date(context.record.customtext1__c).setUTCHours(0,0,0,0))):null
+ (context.record.customtext1__c!=null)?(new Date(new Date(context.record.customtext1__c).setUTCHours(0,0,0,0))):null
+
+ TO_DATE($!s0s!$.customtext1__c, 'YYYY-MM-DD')
+ NOT $!s0s!$.customtext1__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$'
+
+
+ TO_DATE($!s0s!$.customtext1__c, 'YYYY-MM-DD')
+ NOT $!s0s!$.customtext1__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDate.xml
new file mode 100644
index 00000000..b10af0a8
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDate.xml
@@ -0,0 +1,7 @@
+
+
+ new Date(Date.UTC($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber(),$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toNumber()-1,$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')).toNumber()))
+ new Date(Date.UTC($F.nvl(context.record.customnumber1__c,0),$F.nvl(context.record.customnumber2__c,0)-1,$F.nvl(context.record.customnumber3__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber3__c!=null)?(new Date(Date.UTC(context.record.customnumber1__c,context.record.customnumber2__c-1,context.record.customnumber3__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber3__c!=null)?(new Date(Date.UTC(context.record.customnumber1__c.toNumber(),context.record.customnumber2__c.toNumber()-1,context.record.customnumber3__c.toNumber()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateAllConstants.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateAllConstants.xml
new file mode 100644
index 00000000..fbce5717
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateAllConstants.xml
@@ -0,0 +1,15 @@
+
+
+ new Date(Date.UTC(new $F.Decimal('2012').toNumber(),new $F.Decimal('2').toNumber()-1,new $F.Decimal('29').toNumber()))
+ new Date(Date.UTC(2012,2-1,29))
+ new Date(Date.UTC(2012,2-1,29))
+ new Date(Date.UTC(new $F.Decimal('2012').toNumber(),new $F.Decimal('2').toNumber()-1,new $F.Decimal('29').toNumber()))
+
+ TO_DATE((2012) || '-' || LEAST(GREATEST((2)::int, 1), 12) || '-' || LEAST(GREATEST((29)::int, 1), 31), 'YYYY-MM-DD')
+ null
+
+
+ TO_DATE((2012) || '-' || LEAST(GREATEST((2)::int, 1), 12) || '-' || LEAST(GREATEST((29)::int, 1), 31), 'YYYY-MM-DD')
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateAllConstantsNonLeap.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateAllConstantsNonLeap.xml
new file mode 100644
index 00000000..96df3769
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateAllConstantsNonLeap.xml
@@ -0,0 +1,15 @@
+
+
+ new Date(Date.UTC(new $F.Decimal('2011').toNumber(),new $F.Decimal('2').toNumber()-1,new $F.Decimal('29').toNumber()))
+ new Date(Date.UTC(2011,2-1,29))
+ new Date(Date.UTC(2011,2-1,29))
+ new Date(Date.UTC(new $F.Decimal('2011').toNumber(),new $F.Decimal('2').toNumber()-1,new $F.Decimal('29').toNumber()))
+
+ TO_DATE((2011) || '-' || LEAST(GREATEST((2)::int, 1), 12) || '-' || LEAST(GREATEST((29)::int, 1), 31), 'YYYY-MM-DD')
+ 1=1
+
+
+ TO_DATE((2011) || '-' || LEAST(GREATEST((2)::int, 1), 12) || '-' || LEAST(GREATEST((29)::int, 1), 31), 'YYYY-MM-DD')
+ 1=1
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateConstConstVar.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateConstConstVar.xml
new file mode 100644
index 00000000..e55f0085
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateConstConstVar.xml
@@ -0,0 +1,15 @@
+
+
+ new Date(Date.UTC(new $F.Decimal('2012').toNumber(),new $F.Decimal('11').toNumber()-1,$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')).toNumber()))
+ new Date(Date.UTC(2012,11-1,$F.nvl(context.record.customnumber3__c,0)))
+ (context.record.customnumber3__c!=null)?(new Date(Date.UTC(2012,11-1,context.record.customnumber3__c))):null
+ (context.record.customnumber3__c!=null)?(new Date(Date.UTC(new $F.Decimal('2012').toNumber(),new $F.Decimal('11').toNumber()-1,context.record.customnumber3__c.toNumber()))):null
+
+ TO_DATE((2012) || '-' || LEAST(GREATEST((11)::int, 1), 12) || '-' || LEAST(GREATEST((CAST(FLOOR(COALESCE($!s0s!$.customnumber3__c, 0)) AS TEXT))::int, 1), 31), 'YYYY-MM-DD')
+ COALESCE($!s0s!$.customnumber3__c, 0) is null OR COALESCE($!s0s!$.customnumber3__c, 0)< 1 OR COALESCE($!s0s!$.customnumber3__c, 0) >= 32 OR COALESCE($!s0s!$.customnumber3__c, 0) >= 31
+
+
+ CASE WHEN $!s0s!$.customnumber3__c IS NULL THEN NULL ELSE TO_DATE((2012) || '-' || LEAST(GREATEST((11)::int, 1), 12) || '-' || LEAST(GREATEST((CAST(FLOOR($!s0s!$.customnumber3__c) AS TEXT))::int, 1), 31), 'YYYY-MM-DD') END
+ NOT ($!s0s!$.customnumber3__c IS NULL ) AND ($!s0s!$.customnumber3__c is null OR $!s0s!$.customnumber3__c< 1 OR $!s0s!$.customnumber3__c >= 32 OR $!s0s!$.customnumber3__c >= 31)
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateConstVarConst.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateConstVarConst.xml
new file mode 100644
index 00000000..e55e846d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateConstVarConst.xml
@@ -0,0 +1,15 @@
+
+
+ new Date(Date.UTC(new $F.Decimal('2012').toNumber(),$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toNumber()-1,new $F.Decimal('28').toNumber()))
+ new Date(Date.UTC(2012,$F.nvl(context.record.customnumber2__c,0)-1,28))
+ (context.record.customnumber2__c!=null)?(new Date(Date.UTC(2012,context.record.customnumber2__c-1,28))):null
+ (context.record.customnumber2__c!=null)?(new Date(Date.UTC(new $F.Decimal('2012').toNumber(),context.record.customnumber2__c.toNumber()-1,new $F.Decimal('28').toNumber()))):null
+
+ TO_DATE((2012) || '-' || LEAST(GREATEST((CAST(FLOOR(COALESCE($!s0s!$.customnumber2__c, 0)) AS TEXT))::int, 1), 12) || '-' || LEAST(GREATEST((28)::int, 1), 31), 'YYYY-MM-DD')
+ COALESCE($!s0s!$.customnumber2__c, 0) is null OR FLOOR(COALESCE($!s0s!$.customnumber2__c, 0)) NOT IN (1,2,3,4,5,6,7,8,9,10,11,12)
+
+
+ CASE WHEN $!s0s!$.customnumber2__c IS NULL THEN NULL ELSE TO_DATE((2012) || '-' || LEAST(GREATEST((CAST(FLOOR($!s0s!$.customnumber2__c) AS TEXT))::int, 1), 12) || '-' || LEAST(GREATEST((28)::int, 1), 31), 'YYYY-MM-DD') END
+ NOT ($!s0s!$.customnumber2__c IS NULL ) AND ($!s0s!$.customnumber2__c is null OR FLOOR($!s0s!$.customnumber2__c) NOT IN (1,2,3,4,5,6,7,8,9,10,11,12))
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateConstVarVar.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateConstVarVar.xml
new file mode 100644
index 00000000..4b3b0912
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateConstVarVar.xml
@@ -0,0 +1,15 @@
+
+
+ new Date(Date.UTC(new $F.Decimal('2012').toNumber(),$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toNumber()-1,$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')).toNumber()))
+ new Date(Date.UTC(2012,$F.nvl(context.record.customnumber2__c,0)-1,$F.nvl(context.record.customnumber3__c,0)))
+ (context.record.customnumber2__c!=null&&context.record.customnumber3__c!=null)?(new Date(Date.UTC(2012,context.record.customnumber2__c-1,context.record.customnumber3__c))):null
+ (context.record.customnumber2__c!=null&&context.record.customnumber3__c!=null)?(new Date(Date.UTC(new $F.Decimal('2012').toNumber(),context.record.customnumber2__c.toNumber()-1,context.record.customnumber3__c.toNumber()))):null
+
+ TO_DATE((2012) || '-' || LEAST(GREATEST((CAST(FLOOR(COALESCE($!s0s!$.customnumber2__c, 0)) AS TEXT))::int, 1), 12) || '-' || LEAST(GREATEST((CAST(FLOOR(COALESCE($!s0s!$.customnumber3__c, 0)) AS TEXT))::int, 1), 31), 'YYYY-MM-DD')
+ COALESCE($!s0s!$.customnumber2__c, 0) is null OR FLOOR(COALESCE($!s0s!$.customnumber2__c, 0)) NOT IN (1,2,3,4,5,6,7,8,9,10,11,12) OR COALESCE($!s0s!$.customnumber3__c, 0) is null OR COALESCE($!s0s!$.customnumber3__c, 0)< 1 OR COALESCE($!s0s!$.customnumber3__c, 0) >= 32 OR COALESCE($!s0s!$.customnumber3__c, 0) >= EXTRACT(DAY FROM (date_trunc('month',TO_DATE((2012) || '-' || LEAST(GREATEST((FLOOR(COALESCE($!s0s!$.customnumber2__c, 0)))::int, 1), 12), 'YYYY-MM'))+ interval '1 month -1 day')::timestamp)::numeric+1
+
+
+ CASE WHEN $!s0s!$.customnumber2__c IS NULL THEN NULL WHEN $!s0s!$.customnumber3__c IS NULL THEN NULL ELSE TO_DATE((2012) || '-' || LEAST(GREATEST((CAST(FLOOR($!s0s!$.customnumber2__c) AS TEXT))::int, 1), 12) || '-' || LEAST(GREATEST((CAST(FLOOR($!s0s!$.customnumber3__c) AS TEXT))::int, 1), 31), 'YYYY-MM-DD') END
+ NOT ($!s0s!$.customnumber2__c IS NULL OR $!s0s!$.customnumber3__c IS NULL ) AND ($!s0s!$.customnumber2__c is null OR FLOOR($!s0s!$.customnumber2__c) NOT IN (1,2,3,4,5,6,7,8,9,10,11,12) OR $!s0s!$.customnumber3__c is null OR $!s0s!$.customnumber3__c< 1 OR $!s0s!$.customnumber3__c >= 32 OR $!s0s!$.customnumber3__c >= EXTRACT(DAY FROM (date_trunc('month',TO_DATE((2012) || '-' || LEAST(GREATEST((FLOOR($!s0s!$.customnumber2__c))::int, 1), 12), 'YYYY-MM'))+ interval '1 month -1 day')::timestamp)::numeric+1 )
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateLeapConstantDay.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateLeapConstantDay.xml
new file mode 100644
index 00000000..25d4eed8
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateLeapConstantDay.xml
@@ -0,0 +1,7 @@
+
+
+ new Date(Date.UTC($F.nvl(context.record.year__c,new $F.Decimal('0')).toNumber(),$F.nvl(context.record.month__c,new $F.Decimal('0')).toNumber()-1,new $F.Decimal('29').toNumber()))
+ new Date(Date.UTC($F.nvl(context.record.year__c,0),$F.nvl(context.record.month__c,0)-1,29))
+ (context.record.year__c!=null&&context.record.month__c!=null)?(new Date(Date.UTC(context.record.year__c,context.record.month__c-1,29))):null
+ (context.record.year__c!=null&&context.record.month__c!=null)?(new Date(Date.UTC(context.record.year__c.toNumber(),context.record.month__c.toNumber()-1,new $F.Decimal('29').toNumber()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateLeapConstantMonth.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateLeapConstantMonth.xml
new file mode 100644
index 00000000..5cb7b30e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateLeapConstantMonth.xml
@@ -0,0 +1,7 @@
+
+
+ new Date(Date.UTC($F.nvl(context.record.year__c,new $F.Decimal('0')).toNumber(),new $F.Decimal('2').toNumber()-1,$F.nvl(context.record.day__c,new $F.Decimal('0')).toNumber()))
+ new Date(Date.UTC($F.nvl(context.record.year__c,0),2-1,$F.nvl(context.record.day__c,0)))
+ (context.record.year__c!=null&&context.record.day__c!=null)?(new Date(Date.UTC(context.record.year__c,2-1,context.record.day__c))):null
+ (context.record.year__c!=null&&context.record.day__c!=null)?(new Date(Date.UTC(context.record.year__c.toNumber(),new $F.Decimal('2').toNumber()-1,context.record.day__c.toNumber()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateLeapYear.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateLeapYear.xml
new file mode 100644
index 00000000..27c24932
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateLeapYear.xml
@@ -0,0 +1,15 @@
+
+
+ new Date(Date.UTC(new $F.Decimal('2012').toNumber(),new $F.Decimal('2').toNumber()-1,$F.nvl(context.record.day__c,new $F.Decimal('0')).toNumber()))
+ new Date(Date.UTC(2012,2-1,$F.nvl(context.record.day__c,0)))
+ (context.record.day__c!=null)?(new Date(Date.UTC(2012,2-1,context.record.day__c))):null
+ (context.record.day__c!=null)?(new Date(Date.UTC(new $F.Decimal('2012').toNumber(),new $F.Decimal('2').toNumber()-1,context.record.day__c.toNumber()))):null
+
+ TO_DATE((2012) || '-' || LEAST(GREATEST((2)::int, 1), 12) || '-' || LEAST(GREATEST((CAST(FLOOR(COALESCE($!s0s!$.day__c, 0)) AS TEXT))::int, 1), 31), 'YYYY-MM-DD')
+ COALESCE($!s0s!$.day__c, 0) is null OR COALESCE($!s0s!$.day__c, 0)< 1 OR COALESCE($!s0s!$.day__c, 0) >= 32 OR COALESCE($!s0s!$.day__c, 0) >= 30
+
+
+ CASE WHEN $!s0s!$.day__c IS NULL THEN NULL ELSE TO_DATE((2012) || '-' || LEAST(GREATEST((2)::int, 1), 12) || '-' || LEAST(GREATEST((CAST(FLOOR($!s0s!$.day__c) AS TEXT))::int, 1), 31), 'YYYY-MM-DD') END
+ NOT ($!s0s!$.day__c IS NULL ) AND ($!s0s!$.day__c is null OR $!s0s!$.day__c< 1 OR $!s0s!$.day__c >= 32 OR $!s0s!$.day__c >= 30)
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateLeapYear2.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateLeapYear2.xml
new file mode 100644
index 00000000..5c04401f
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateLeapYear2.xml
@@ -0,0 +1,15 @@
+
+
+ new Date(Date.UTC(new $F.Decimal('2012').toNumber(),$F.nvl(context.record.month__c,new $F.Decimal('0')).toNumber()-1,new $F.Decimal('29').toNumber()))
+ new Date(Date.UTC(2012,$F.nvl(context.record.month__c,0)-1,29))
+ (context.record.month__c!=null)?(new Date(Date.UTC(2012,context.record.month__c-1,29))):null
+ (context.record.month__c!=null)?(new Date(Date.UTC(new $F.Decimal('2012').toNumber(),context.record.month__c.toNumber()-1,new $F.Decimal('29').toNumber()))):null
+
+ TO_DATE((2012) || '-' || LEAST(GREATEST((CAST(FLOOR(COALESCE($!s0s!$.month__c, 0)) AS TEXT))::int, 1), 12) || '-' || LEAST(GREATEST((29)::int, 1), 31), 'YYYY-MM-DD')
+ COALESCE($!s0s!$.month__c, 0) is null OR FLOOR(COALESCE($!s0s!$.month__c, 0)) NOT IN (1,2,3,4,5,6,7,8,9,10,11,12)
+
+
+ CASE WHEN $!s0s!$.month__c IS NULL THEN NULL ELSE TO_DATE((2012) || '-' || LEAST(GREATEST((CAST(FLOOR($!s0s!$.month__c) AS TEXT))::int, 1), 12) || '-' || LEAST(GREATEST((29)::int, 1), 31), 'YYYY-MM-DD') END
+ NOT ($!s0s!$.month__c IS NULL ) AND ($!s0s!$.month__c is null OR FLOOR($!s0s!$.month__c) NOT IN (1,2,3,4,5,6,7,8,9,10,11,12))
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateNonLeapYear.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateNonLeapYear.xml
new file mode 100644
index 00000000..d2efed62
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateNonLeapYear.xml
@@ -0,0 +1,15 @@
+
+
+ new Date(Date.UTC(new $F.Decimal('2011').toNumber(),new $F.Decimal('2').toNumber()-1,$F.nvl(context.record.day__c,new $F.Decimal('0')).toNumber()))
+ new Date(Date.UTC(2011,2-1,$F.nvl(context.record.day__c,0)))
+ (context.record.day__c!=null)?(new Date(Date.UTC(2011,2-1,context.record.day__c))):null
+ (context.record.day__c!=null)?(new Date(Date.UTC(new $F.Decimal('2011').toNumber(),new $F.Decimal('2').toNumber()-1,context.record.day__c.toNumber()))):null
+
+ TO_DATE((2011) || '-' || LEAST(GREATEST((2)::int, 1), 12) || '-' || LEAST(GREATEST((CAST(FLOOR(COALESCE($!s0s!$.day__c, 0)) AS TEXT))::int, 1), 31), 'YYYY-MM-DD')
+ COALESCE($!s0s!$.day__c, 0) is null OR COALESCE($!s0s!$.day__c, 0)< 1 OR COALESCE($!s0s!$.day__c, 0) >= 32 OR COALESCE($!s0s!$.day__c, 0) >= 29
+
+
+ CASE WHEN $!s0s!$.day__c IS NULL THEN NULL ELSE TO_DATE((2011) || '-' || LEAST(GREATEST((2)::int, 1), 12) || '-' || LEAST(GREATEST((CAST(FLOOR($!s0s!$.day__c) AS TEXT))::int, 1), 31), 'YYYY-MM-DD') END
+ NOT ($!s0s!$.day__c IS NULL ) AND ($!s0s!$.day__c is null OR $!s0s!$.day__c< 1 OR $!s0s!$.day__c >= 32 OR $!s0s!$.day__c >= 29)
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateNonLeapYear2.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateNonLeapYear2.xml
new file mode 100644
index 00000000..3c1ea92e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateNonLeapYear2.xml
@@ -0,0 +1,15 @@
+
+
+ new Date(Date.UTC(new $F.Decimal('2011').toNumber(),$F.nvl(context.record.month__c,new $F.Decimal('0')).toNumber()-1,new $F.Decimal('29').toNumber()))
+ new Date(Date.UTC(2011,$F.nvl(context.record.month__c,0)-1,29))
+ (context.record.month__c!=null)?(new Date(Date.UTC(2011,context.record.month__c-1,29))):null
+ (context.record.month__c!=null)?(new Date(Date.UTC(new $F.Decimal('2011').toNumber(),context.record.month__c.toNumber()-1,new $F.Decimal('29').toNumber()))):null
+
+ TO_DATE((2011) || '-' || LEAST(GREATEST((CAST(FLOOR(COALESCE($!s0s!$.month__c, 0)) AS TEXT))::int, 1), 12) || '-' || LEAST(GREATEST((29)::int, 1), 31), 'YYYY-MM-DD')
+ COALESCE($!s0s!$.month__c, 0) is null OR FLOOR(COALESCE($!s0s!$.month__c, 0)) NOT IN (1,2,3,4,5,6,7,8,9,10,11,12) OR FLOOR(COALESCE($!s0s!$.month__c, 0))=2
+
+
+ CASE WHEN $!s0s!$.month__c IS NULL THEN NULL ELSE TO_DATE((2011) || '-' || LEAST(GREATEST((CAST(FLOOR($!s0s!$.month__c) AS TEXT))::int, 1), 12) || '-' || LEAST(GREATEST((29)::int, 1), 31), 'YYYY-MM-DD') END
+ NOT ($!s0s!$.month__c IS NULL ) AND ($!s0s!$.month__c is null OR FLOOR($!s0s!$.month__c) NOT IN (1,2,3,4,5,6,7,8,9,10,11,12) OR FLOOR($!s0s!$.month__c)=2)
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateTimeText.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateTimeText.xml
new file mode 100644
index 00000000..300948b4
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateTimeText.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).toISOString().replace('T',' ').substring(0,19)+'Z')):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).toISOString().replace('T',' ').substring(0,19)+'Z')):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).toISOString().replace('T',' ').substring(0,19)+'Z')):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).toISOString().replace('T',' ').substring(0,19)+'Z')):null
+
+ (CONCAT(TO_CHAR(DATE_TRUNC('second', ($!s0s!$.customdatetime1__c)::timestamp), 'YYYY-MM-DD HH24:MI:SS'), 'Z' ))
+ null
+
+
+ (CONCAT(TO_CHAR(DATE_TRUNC('second', ($!s0s!$.customdatetime1__c)::timestamp), 'YYYY-MM-DD HH24:MI:SS'), 'Z' ))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateTimeValueWithInvalidString.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateTimeValueWithInvalidString.xml
new file mode 100644
index 00000000..59cbffb2
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateTimeValueWithInvalidString.xml
@@ -0,0 +1,15 @@
+
+
+ $F.parseDateTime("sample ")
+ $F.parseDateTime("sample ")
+ $F.parseDateTime("sample ")
+ $F.parseDateTime("sample ")
+
+ NULL
+ 0=0
+
+
+ NULL
+ 0=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateTimeValueWithValidInValid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateTimeValueWithValidInValid.xml
new file mode 100644
index 00000000..06945fe9
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateTimeValueWithValidInValid.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?($F.parseDateTime(context.record.dateString__c)):null
+ (context.record.dateString__c!=null)?($F.parseDateTime(context.record.dateString__c)):null
+ (context.record.dateString__c!=null)?($F.parseDateTime(context.record.dateString__c)):null
+ (context.record.dateString__c!=null)?($F.parseDateTime(context.record.dateString__c)):null
+
+ TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
+ TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateTimeValueWithValidString.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateTimeValueWithValidString.xml
new file mode 100644
index 00000000..10c5e95e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateTimeValueWithValidString.xml
@@ -0,0 +1,15 @@
+
+
+ $F.parseDateTime("2005-11-15 17:00:00 ")
+ $F.parseDateTime("2005-11-15 17:00:00 ")
+ $F.parseDateTime("2005-11-15 17:00:00 ")
+ $F.parseDateTime("2005-11-15 17:00:00 ")
+
+ TO_TIMESTAMP('2005-11-15 17:00:00 ', 'YYYY-MM-DD HH24:MI:SS')
+ null
+
+
+ TO_TIMESTAMP('2005-11-15 17:00:00 ', 'YYYY-MM-DD HH24:MI:SS')
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateVarConstConst.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateVarConstConst.xml
new file mode 100644
index 00000000..f35cb2ef
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateVarConstConst.xml
@@ -0,0 +1,7 @@
+
+
+ new Date(Date.UTC($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber(),new $F.Decimal('11').toNumber()-1,new $F.Decimal('25').toNumber()))
+ new Date(Date.UTC($F.nvl(context.record.customnumber1__c,0),11-1,25))
+ (context.record.customnumber1__c!=null)?(new Date(Date.UTC(context.record.customnumber1__c,11-1,25))):null
+ (context.record.customnumber1__c!=null)?(new Date(Date.UTC(context.record.customnumber1__c.toNumber(),new $F.Decimal('11').toNumber()-1,new $F.Decimal('25').toNumber()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateVarConstVar.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateVarConstVar.xml
new file mode 100644
index 00000000..f6d5bd4c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateVarConstVar.xml
@@ -0,0 +1,7 @@
+
+
+ new Date(Date.UTC($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber(),new $F.Decimal('12').toNumber()-1,$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')).toNumber()))
+ new Date(Date.UTC($F.nvl(context.record.customnumber1__c,0),12-1,$F.nvl(context.record.customnumber3__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber3__c!=null)?(new Date(Date.UTC(context.record.customnumber1__c,12-1,context.record.customnumber3__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber3__c!=null)?(new Date(Date.UTC(context.record.customnumber1__c.toNumber(),new $F.Decimal('12').toNumber()-1,context.record.customnumber3__c.toNumber()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateVarVarConst.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateVarVarConst.xml
new file mode 100644
index 00000000..c6bf4003
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateVarVarConst.xml
@@ -0,0 +1,7 @@
+
+
+ new Date(Date.UTC($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber(),$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toNumber()-1,new $F.Decimal('28').toNumber()))
+ new Date(Date.UTC($F.nvl(context.record.customnumber1__c,0),$F.nvl(context.record.customnumber2__c,0)-1,28))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(new Date(Date.UTC(context.record.customnumber1__c,context.record.customnumber2__c-1,28))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(new Date(Date.UTC(context.record.customnumber1__c.toNumber(),context.record.customnumber2__c.toNumber()-1,new $F.Decimal('28').toNumber()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateVariableYear.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateVariableYear.xml
new file mode 100644
index 00000000..67f45fb6
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDateVariableYear.xml
@@ -0,0 +1,7 @@
+
+
+ new Date(Date.UTC($F.nvl(context.record.year__c,new $F.Decimal('0')).toNumber(),new $F.Decimal('2').toNumber()-1,new $F.Decimal('29').toNumber()))
+ new Date(Date.UTC($F.nvl(context.record.year__c,0),2-1,29))
+ (context.record.year__c!=null)?(new Date(Date.UTC(context.record.year__c,2-1,29))):null
+ (context.record.year__c!=null)?(new Date(Date.UTC(context.record.year__c.toNumber(),new $F.Decimal('2').toNumber()-1,new $F.Decimal('29').toNumber()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDayOfYear.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDayOfYear.xml
new file mode 100644
index 00000000..ad77e01d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDayOfYear.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?((new $F.Decimal($F.dayofyear(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?($F.dayofyear(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?($F.dayofyear(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?((new $F.Decimal($F.dayofyear(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))))):null
+
+ CAST(TO_CHAR($!s0s!$.customdate1__c, 'DDD') AS NUMERIC)
+ null
+
+
+ CAST(TO_CHAR($!s0s!$.customdate1__c, 'DDD') AS NUMERIC)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDistance.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDistance.xml
new file mode 100644
index 00000000..a5f542a2
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testDistance.xml
@@ -0,0 +1,7 @@
+
+
+ typeof $formula==='undefined'?undefined:$formula.disance({latitude:$F.nvl(context.record.customNumber1__c,new $F.Decimal('0')),longitude:$F.nvl(context.record.customNumber2__c,new $F.Decimal('0'))},{latitude:new $F.Decimal('33.37088'),longitude:new $F.Decimal('122.61715').neg()},"mi")
+ typeof $formula==='undefined'?undefined:$formula.disance({latitude:$F.nvl(context.record.customNumber1__c,0),longitude:$F.nvl(context.record.customNumber2__c,0)},{latitude:33.37088,longitude:(-122.61715)},"mi")
+ (context.record.customNumber1__c!=null&&context.record.customNumber2__c!=null)?(typeof $formula==='undefined'?undefined:$formula.disance({latitude:context.record.customNumber1__c,longitude:context.record.customNumber2__c},{latitude:33.37088,longitude:(-122.61715)},"mi")):null
+ (context.record.customNumber1__c!=null&&context.record.customNumber2__c!=null)?(typeof $formula==='undefined'?undefined:$formula.disance({latitude:context.record.customNumber1__c,longitude:context.record.customNumber2__c},{latitude:new $F.Decimal('33.37088'),longitude:new $F.Decimal('122.61715').neg()},"mi")):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpSimple.xml
new file mode 100644
index 00000000..0c429739
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpSimple.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ Math.exp($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.exp(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.exp(context.record.customnumber1__c)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesAbs.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesAbs.xml
new file mode 100644
index 00000000..81d0dc01
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesAbs.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs())
+ Math.exp(Math.abs($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(Math.exp(Math.abs(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.exp(context.record.customnumber1__c.abs())):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesCeil.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesCeil.xml
new file mode 100644
index 00000000..f0c40d02
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesCeil.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor()))
+ Math.exp((($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(Math.exp(((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.exp((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesFloor.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesFloor.xml
new file mode 100644
index 00000000..8a94a4f3
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesFloor.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil()))
+ Math.exp((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(Math.exp(((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.exp((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesIf.xml
new file mode 100644
index 00000000..9b7989ab
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesIf.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ Math.exp($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.exp(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.exp(context.record.customnumber1__c)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesLen.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesLen.xml
new file mode 100644
index 00000000..ab760bea
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesLen.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp((new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))))
+ Math.exp(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length))
+ Math.exp(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length))
+ $F.Decimal.exp((new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))))
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesLn.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesLn.xml
new file mode 100644
index 00000000..b94986ae
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesLn.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.Decimal.exp(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln())).mul('1e'+new $F.Decimal('0').toFixed(0)).round().div('1e'+new $F.Decimal('0').toFixed(0))
+ Number(Number(Math.exp(Math.log($F.nvl(context.record.customnumber1__c,0)))).toFixed(0<=20?0:20))
+ (context.record.customnumber1__c!=null)?(Number(Number(Math.exp(Math.log(context.record.customnumber1__c))).toFixed(0<=20?0:20))):null
+ (context.record.customnumber1__c!=null)?(($F.Decimal.exp((context.record.customnumber1__c).ln())).mul('1e'+new $F.Decimal('0').toFixed(0)).round().div('1e'+new $F.Decimal('0').toFixed(0))):null
+
+ ROUND(EXP(LN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)), 0::integer)
+ COALESCE($!s0s!$.customnumber1__c, 0)<=0
+
+
+ ROUND(EXP(LN($!s0s!$.customnumber1__c)::numeric(38,18)), 0::integer)
+ $!s0s!$.customnumber1__c<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesLog.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesLog.xml
new file mode 100644
index 00000000..53d9685f
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesLog.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.exp(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10))
+ Math.exp(Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10)
+ (context.record.customnumber1__c!=null)?(Math.exp(Math.log(context.record.customnumber1__c)/Math.LN10)):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.exp((context.record.customnumber1__c).log(10))):null
+
+ EXP(LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18))
+ COALESCE($!s0s!$.customnumber1__c, 0)<=0
+
+
+ EXP(LOG(10, $!s0s!$.customnumber1__c)::numeric(38,18))
+ $!s0s!$.customnumber1__c<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesMOD.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesMOD.xml
new file mode 100644
index 00000000..07b92dcf
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesMOD.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))))
+ Math.exp((($F.nvl(context.record.customnumber1__c,0))%($F.nvl(context.record.customnumber2__c,0))))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.exp(((context.record.customnumber1__c)%(context.record.customnumber2__c)))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?($F.Decimal.exp(context.record.customnumber1__c.mod(context.record.customnumber2__c))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesMinus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesMinus.xml
new file mode 100644
index 00000000..5ce97604
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesMinus.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).sub($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))))
+ Math.exp(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)-$F.nvl(context.record.customcurrency1__c,0)))
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customcurrency1__c!=null)?(Math.exp((context.record.custompercent1__c/100.0-context.record.customcurrency1__c))):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customcurrency1__c!=null)?($F.Decimal.exp((context.record.custompercent1__c.div(100).sub(context.record.customcurrency1__c)))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesPlus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesPlus.xml
new file mode 100644
index 00000000..2c194eae
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesPlus.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp($F.nvl(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).add($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))),new $F.Decimal('0')))
+ Math.exp($F.nvl(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)+$F.nvl(context.record.customnumber1__c,0)),0))
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customnumber1__c!=null&&(context.record.custompercent1__c/100.0+context.record.customnumber1__c)!=null)?(Math.exp((context.record.custompercent1__c/100.0+context.record.customnumber1__c))):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customnumber1__c!=null&&(context.record.custompercent1__c.div(100).add(context.record.customnumber1__c))!=null)?($F.Decimal.exp((context.record.custompercent1__c.div(100).add(context.record.customnumber1__c)))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesRound.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesRound.xml
new file mode 100644
index 00000000..c3e0bc9d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesRound.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)))
+ Math.exp(($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.exp((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?($F.Decimal.exp((context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0)))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesSqrt.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesSqrt.xml
new file mode 100644
index 00000000..48db6b1f
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesSqrt.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp($F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))))
+ Math.exp(Math.sqrt($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(Math.exp(Math.sqrt(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.exp($F.Decimal.sqrt(context.record.customnumber1__c))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesValue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesValue.xml
new file mode 100644
index 00000000..d17f3692
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExpUsesValue.xml
@@ -0,0 +1,7 @@
+
+
+ (context.record.customtext1__c!=null)?($F.Decimal.exp($F.Decimal(context.record.customtext1__c))):null
+ (context.record.customtext1__c!=null)?(Math.exp(Number(context.record.customtext1__c))):null
+ (context.record.customtext1__c!=null)?(Math.exp(Number(context.record.customtext1__c))):null
+ (context.record.customtext1__c!=null)?($F.Decimal.exp($F.Decimal(context.record.customtext1__c))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExponentiationOperator.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExponentiationOperator.xml
new file mode 100644
index 00000000..5acddf11
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testExponentiationOperator.xml
@@ -0,0 +1,7 @@
+
+
+ new $F.Decimal(Math.pow($F.nvl(context.record.customNumber1__c,new $F.Decimal('0')),$F.nvl(context.record.customNumber2__c,new $F.Decimal('0'))))
+ Math.pow($F.nvl(context.record.customNumber1__c,0),$F.nvl(context.record.customNumber2__c,0))
+ (context.record.customNumber1__c!=null&&context.record.customNumber2__c!=null)?(Math.pow(context.record.customNumber1__c,context.record.customNumber2__c)):null
+ (context.record.customNumber1__c!=null&&context.record.customNumber2__c!=null)?(new $F.Decimal(Math.pow(context.record.customNumber1__c,context.record.customNumber2__c))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFindOnText.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFindOnText.xml
new file mode 100644
index 00000000..2e7829b5
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFindOnText.xml
@@ -0,0 +1,15 @@
+
+
+ (new $F.Decimal(((context.record.customText1__c)?(context.record.customText1__c.indexOf("Text")+1):0)))
+ ((context.record.customText1__c)?(context.record.customText1__c.indexOf("Text")+1):0)
+ ((context.record.customText1__c)?(context.record.customText1__c.indexOf("Text")+1):0)
+ (new $F.Decimal(((context.record.customText1__c)?(context.record.customText1__c.indexOf("Text")+1):0)))
+
+ COALESCE(STRPOS($!s0s!$.customText1__c, 'Text'), 0)
+ null
+
+
+ COALESCE(STRPOS($!s0s!$.customText1__c, 'Text'), 0)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFindOnTextWithIndex.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFindOnTextWithIndex.xml
new file mode 100644
index 00000000..acd5e2d8
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFindOnTextWithIndex.xml
@@ -0,0 +1,15 @@
+
+
+ (new $F.Decimal(((context.record.customText2__c)?(context.record.customText2__c.indexOf(context.record.customText1__c,$F.nvl(context.record.customNumber__c,new $F.Decimal('0'))-1)+1):0)))
+ ((context.record.customText2__c)?(context.record.customText2__c.indexOf(context.record.customText1__c,$F.nvl(context.record.customNumber__c,0)-1)+1):0)
+ ((context.record.customText2__c)?(context.record.customText2__c.indexOf(context.record.customText1__c,context.record.customNumber__c-1)+1):0)
+ (new $F.Decimal(((context.record.customText2__c)?(context.record.customText2__c.indexOf(context.record.customText1__c,context.record.customNumber__c-1)+1):0)))
+
+ COALESCE(CASE WHEN COALESCE(STRPOS(SUBSTR($!s0s!$.customText2__c,GREATEST(COALESCE(COALESCE($!s0s!$.customNumber__c, 0), 1),1)::integer),$!s0s!$.customText1__c),0) > 0 THEN STRPOS(SUBSTR($!s0s!$.customText2__c,GREATEST(COALESCE(COALESCE($!s0s!$.customNumber__c, 0), 1),1)::integer),$!s0s!$.customText1__c) + GREATEST(COALESCE(COALESCE($!s0s!$.customNumber__c, 0), 1),1) - 1 ELSE 0 END, 0)
+ null
+
+
+ COALESCE(CASE WHEN COALESCE(STRPOS(SUBSTR($!s0s!$.customText2__c,GREATEST(COALESCE($!s0s!$.customNumber__c, 1),1)::integer),$!s0s!$.customText1__c),0) > 0 THEN STRPOS(SUBSTR($!s0s!$.customText2__c,GREATEST(COALESCE($!s0s!$.customNumber__c, 1),1)::integer),$!s0s!$.customText1__c) + GREATEST(COALESCE($!s0s!$.customNumber__c, 1),1) - 1 ELSE 0 END, 0)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorRound.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorRound.xml
new file mode 100644
index 00000000..eedb65ab
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorRound.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).mul($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).mul($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).mul($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).toDP(18).ceil())
+ ((($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))*$F.nvl(context.record.customnumber2__c,0))>=0?Math.floor(($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))*$F.nvl(context.record.customnumber2__c,0)):Math.ceil(($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))*$F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber2__c!=null)?((((context.record.customnumber1__c/context.record.customnumber2__c)*context.record.customnumber2__c)>=0?Math.floor((context.record.customnumber1__c/context.record.customnumber2__c)*context.record.customnumber2__c):Math.ceil((context.record.customnumber1__c/context.record.customnumber2__c)*context.record.customnumber2__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c.div(context.record.customnumber2__c).mul(context.record.customnumber2__c).isPos()?context.record.customnumber1__c.div(context.record.customnumber2__c).mul(context.record.customnumber2__c).toDP(18).floor():context.record.customnumber1__c.div(context.record.customnumber2__c).mul(context.record.customnumber2__c).toDP(18).ceil())):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorSimple.xml
new file mode 100644
index 00000000..225e7652
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorSimple.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil())
+ (($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil())):null
+
+ CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesAbs.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesAbs.xml
new file mode 100644
index 00000000..1e8aa05d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesAbs.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs().isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs().toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs().toDP(18).ceil())
+ ((Math.abs($F.nvl(context.record.customnumber1__c,0)))>=0?Math.floor(Math.abs($F.nvl(context.record.customnumber1__c,0))):Math.ceil(Math.abs($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(((Math.abs(context.record.customnumber1__c))>=0?Math.floor(Math.abs(context.record.customnumber1__c)):Math.ceil(Math.abs(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c.abs().isPos()?context.record.customnumber1__c.abs().toDP(18).floor():context.record.customnumber1__c.abs().toDP(18).ceil())):null
+
+ CASE WHEN ABS(COALESCE($!s0s!$.customnumber1__c, 0))>=0 THEN FLOOR(ROUND(ABS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) ELSE CEIL(ROUND(ABS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN ABS($!s0s!$.customnumber1__c)>=0 THEN FLOOR(ROUND(ABS($!s0s!$.customnumber1__c)::numeric(38,18),33)) ELSE CEIL(ROUND(ABS($!s0s!$.customnumber1__c)::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesCase.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesCase.xml
new file mode 100644
index 00000000..55af09b4
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesCase.xml
@@ -0,0 +1,15 @@
+
+
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber3__c,new $F.Decimal('0'))).isPos()?((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber3__c,new $F.Decimal('0'))).toDP(18).floor():((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber3__c,new $F.Decimal('0'))).toDP(18).ceil())
+ ((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0)))>=0?Math.floor(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0))):Math.ceil(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0))))
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null)?(((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c))>=0?Math.floor(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)):Math.ceil(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)))):null
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null)?((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c).isPos()?((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c).toDP(18).floor():((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c).toDP(18).ceil())):null
+
+ CASE WHEN CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END>=0 THEN FLOOR(ROUND(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END::numeric(38,18),33)) ELSE CEIL(ROUND(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END>=0 THEN FLOOR(ROUND(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END::numeric(38,18),33)) ELSE CEIL(ROUND(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesCeil.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesCeil.xml
new file mode 100644
index 00000000..ddc3f7fd
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesCeil.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor()).isPos()?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor()).toDP(18).floor():($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor()).toDP(18).ceil())
+ (((($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0))))>=0?Math.floor((($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0)))):Math.ceil((($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0)))))
+ (context.record.customnumber1__c!=null)?(((((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c)))>=0?Math.floor(((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c))):Math.ceil(((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c))))):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor()).isPos()?(context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor()).toDP(18).floor():(context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor()).toDP(18).ceil())):null
+
+ CASE WHEN CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END>=0 THEN FLOOR(ROUND(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END::numeric(38,18),33)) ELSE CEIL(ROUND(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END>=0 THEN FLOOR(ROUND(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END::numeric(38,18),33)) ELSE CEIL(ROUND(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesFloor.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesFloor.xml
new file mode 100644
index 00000000..76ad9250
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesFloor.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil()).isPos()?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil()).toDP(18).floor():($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil()).toDP(18).ceil())
+ (((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0))))>=0?Math.floor((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0)))):Math.ceil((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0)))))
+ (context.record.customnumber1__c!=null)?(((((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c)))>=0?Math.floor(((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c))):Math.ceil(((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c))))):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil()).isPos()?(context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil()).toDP(18).floor():(context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil()).toDP(18).ceil())):null
+
+ CASE WHEN CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END>=0 THEN FLOOR(ROUND(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END::numeric(38,18),33)) ELSE CEIL(ROUND(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END>=0 THEN FLOOR(ROUND(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END::numeric(38,18),33)) ELSE CEIL(ROUND(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesIf.xml
new file mode 100644
index 00000000..942196aa
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesIf.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil())
+ (($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil())):null
+
+ CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesLen.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesLen.xml
new file mode 100644
index 00000000..d67f412e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesLen.xml
@@ -0,0 +1,15 @@
+
+
+ ((new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).isPos()?(new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).toDP(18).floor():(new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).toDP(18).ceil())
+ ((($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length))>=0?Math.floor(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length)):Math.ceil(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length)))
+ ((($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length))>=0?Math.floor(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length)):Math.ceil(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length)))
+ ((new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).isPos()?(new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).toDP(18).floor():(new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length))).toDP(18).ceil())
+
+ CASE WHEN COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric>=0 THEN FLOOR(ROUND(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric>=0 THEN FLOOR(ROUND(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesLn.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesLn.xml
new file mode 100644
index 00000000..00ca6af4
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesLn.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln().isPos()?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln().toDP(18).floor():($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln().toDP(18).ceil())
+ ((Math.log($F.nvl(context.record.customnumber1__c,0)))>=0?Math.floor(Math.log($F.nvl(context.record.customnumber1__c,0))):Math.ceil(Math.log($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(((Math.log(context.record.customnumber1__c))>=0?Math.floor(Math.log(context.record.customnumber1__c)):Math.ceil(Math.log(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c).ln().isPos()?(context.record.customnumber1__c).ln().toDP(18).floor():(context.record.customnumber1__c).ln().toDP(18).ceil())):null
+
+ CASE WHEN LN(COALESCE($!s0s!$.customnumber1__c, 0))>=0 THEN FLOOR(ROUND(LN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) ELSE CEIL(ROUND(LN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) END
+ COALESCE($!s0s!$.customnumber1__c, 0)<=0
+
+
+ CASE WHEN LN($!s0s!$.customnumber1__c)>=0 THEN FLOOR(ROUND(LN($!s0s!$.customnumber1__c)::numeric(38,18),33)) ELSE CEIL(ROUND(LN($!s0s!$.customnumber1__c)::numeric(38,18),33)) END
+ $!s0s!$.customnumber1__c<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesLog.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesLog.xml
new file mode 100644
index 00000000..991ebd93
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesLog.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10).isPos()?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10).toDP(18).floor():($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10).toDP(18).ceil())
+ ((Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10)>=0?Math.floor(Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10):Math.ceil(Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10))
+ (context.record.customnumber1__c!=null)?(((Math.log(context.record.customnumber1__c)/Math.LN10)>=0?Math.floor(Math.log(context.record.customnumber1__c)/Math.LN10):Math.ceil(Math.log(context.record.customnumber1__c)/Math.LN10))):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c).log(10).isPos()?(context.record.customnumber1__c).log(10).toDP(18).floor():(context.record.customnumber1__c).log(10).toDP(18).ceil())):null
+
+ CASE WHEN LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))>=0 THEN FLOOR(ROUND(LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) ELSE CEIL(ROUND(LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) END
+ COALESCE($!s0s!$.customnumber1__c, 0)<=0
+
+
+ CASE WHEN LOG(10, $!s0s!$.customnumber1__c)>=0 THEN FLOOR(ROUND(LOG(10, $!s0s!$.customnumber1__c)::numeric(38,18),33)) ELSE CEIL(ROUND(LOG(10, $!s0s!$.customnumber1__c)::numeric(38,18),33)) END
+ $!s0s!$.customnumber1__c<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesMOD.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesMOD.xml
new file mode 100644
index 00000000..6f828dcc
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesMOD.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).toDP(18).ceil())
+ (((($F.nvl(context.record.customnumber1__c,0))%($F.nvl(context.record.customnumber2__c,0))))>=0?Math.floor((($F.nvl(context.record.customnumber1__c,0))%($F.nvl(context.record.customnumber2__c,0)))):Math.ceil((($F.nvl(context.record.customnumber1__c,0))%($F.nvl(context.record.customnumber2__c,0)))))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((((context.record.customnumber1__c)%(context.record.customnumber2__c)))>=0?Math.floor(((context.record.customnumber1__c)%(context.record.customnumber2__c))):Math.ceil(((context.record.customnumber1__c)%(context.record.customnumber2__c))))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c.mod(context.record.customnumber2__c).isPos()?context.record.customnumber1__c.mod(context.record.customnumber2__c).toDP(18).floor():context.record.customnumber1__c.mod(context.record.customnumber2__c).toDP(18).ceil())):null
+
+ CASE WHEN MOD(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0))>=0 THEN FLOOR(ROUND(MOD(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0))::numeric(38,18),33)) ELSE CEIL(ROUND(MOD(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0))::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN MOD($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c)>=0 THEN FLOOR(ROUND(MOD($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c)::numeric(38,18),33)) ELSE CEIL(ROUND(MOD($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c)::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesMinus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesMinus.xml
new file mode 100644
index 00000000..15e23cab
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesMinus.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).sub($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).isPos()?($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).sub($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).toDP(18).floor():($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).sub($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).toDP(18).ceil())
+ ((($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)-$F.nvl(context.record.customnumber1__c,0)))>=0?Math.floor(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)-$F.nvl(context.record.customnumber1__c,0))):Math.ceil(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)-$F.nvl(context.record.customnumber1__c,0))))
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customnumber1__c!=null)?((((context.record.custompercent1__c/100.0-context.record.customnumber1__c))>=0?Math.floor((context.record.custompercent1__c/100.0-context.record.customnumber1__c)):Math.ceil((context.record.custompercent1__c/100.0-context.record.customnumber1__c)))):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customnumber1__c!=null)?(((context.record.custompercent1__c.div(100).sub(context.record.customnumber1__c)).isPos()?(context.record.custompercent1__c.div(100).sub(context.record.customnumber1__c)).toDP(18).floor():(context.record.custompercent1__c.div(100).sub(context.record.customnumber1__c)).toDP(18).ceil())):null
+
+ CASE WHEN (COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)-COALESCE($!s0s!$.customnumber1__c, 0))>=0 THEN FLOOR(ROUND((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)-COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) ELSE CEIL(ROUND((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)-COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN (($!s0s!$.custompercent1__c / 100.0)-$!s0s!$.customnumber1__c)>=0 THEN FLOOR(ROUND((($!s0s!$.custompercent1__c / 100.0)-$!s0s!$.customnumber1__c)::numeric(38,18),33)) ELSE CEIL(ROUND((($!s0s!$.custompercent1__c / 100.0)-$!s0s!$.customnumber1__c)::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesMultiply.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesMultiply.xml
new file mode 100644
index 00000000..01405b92
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesMultiply.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).mul($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))),new $F.Decimal('0')).isPos()?$F.nvl($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).mul($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))),new $F.Decimal('0')).toDP(18).floor():$F.nvl($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).mul($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))),new $F.Decimal('0')).toDP(18).ceil())
+ (($F.nvl($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)*$F.nvl(context.record.customcurrency1__c,0),0))>=0?Math.floor($F.nvl($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)*$F.nvl(context.record.customcurrency1__c,0),0)):Math.ceil($F.nvl($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)*$F.nvl(context.record.customcurrency1__c,0),0)))
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customcurrency1__c!=null&&context.record.custompercent1__c/100.0*context.record.customcurrency1__c!=null)?(((context.record.custompercent1__c/100.0*context.record.customcurrency1__c)>=0?Math.floor(context.record.custompercent1__c/100.0*context.record.customcurrency1__c):Math.ceil(context.record.custompercent1__c/100.0*context.record.customcurrency1__c))):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customcurrency1__c!=null&&context.record.custompercent1__c.div(100).mul(context.record.customcurrency1__c)!=null)?((context.record.custompercent1__c.div(100).mul(context.record.customcurrency1__c).isPos()?context.record.custompercent1__c.div(100).mul(context.record.customcurrency1__c).toDP(18).floor():context.record.custompercent1__c.div(100).mul(context.record.customcurrency1__c).toDP(18).ceil())):null
+
+ CASE WHEN COALESCE((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) * COALESCE($!s0s!$.customcurrency1__c, 0)), 0)>=0 THEN FLOOR(ROUND(COALESCE((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) * COALESCE($!s0s!$.customcurrency1__c, 0)), 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) * COALESCE($!s0s!$.customcurrency1__c, 0)), 0)::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN (($!s0s!$.custompercent1__c / 100.0) * $!s0s!$.customcurrency1__c)>=0 THEN FLOOR(ROUND((($!s0s!$.custompercent1__c / 100.0) * $!s0s!$.customcurrency1__c)::numeric(38,18),33)) ELSE CEIL(ROUND((($!s0s!$.custompercent1__c / 100.0) * $!s0s!$.customcurrency1__c)::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesRound.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesRound.xml
new file mode 100644
index 00000000..91d27e7a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesRound.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).isPos()?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).toDP(18).floor():($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).toDP(18).ceil())
+ ((($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0)))>=0?Math.floor(($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))):Math.ceil(($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c))>=0?Math.floor((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)):Math.ceil((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0)).isPos()?(context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0)).toDP(18).floor():(context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0)).toDP(18).ceil())):null
+
+ CASE WHEN ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)>=0 THEN FLOOR(ROUND(ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)::numeric(38,18),33)) ELSE CEIL(ROUND(ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)>=0 THEN FLOOR(ROUND(ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)::numeric(38,18),33)) ELSE CEIL(ROUND(ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesSqrt.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesSqrt.xml
new file mode 100644
index 00000000..651d330e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesSqrt.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).isPos()?$F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).toDP(18).floor():$F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).toDP(18).ceil())
+ ((Math.sqrt($F.nvl(context.record.customnumber1__c,0)))>=0?Math.floor(Math.sqrt($F.nvl(context.record.customnumber1__c,0))):Math.ceil(Math.sqrt($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(((Math.sqrt(context.record.customnumber1__c))>=0?Math.floor(Math.sqrt(context.record.customnumber1__c)):Math.ceil(Math.sqrt(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?(($F.Decimal.sqrt(context.record.customnumber1__c).isPos()?$F.Decimal.sqrt(context.record.customnumber1__c).toDP(18).floor():$F.Decimal.sqrt(context.record.customnumber1__c).toDP(18).ceil())):null
+
+ CASE WHEN SQRT(COALESCE($!s0s!$.customnumber1__c, 0))>=0 THEN FLOOR(ROUND(SQRT(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) ELSE CEIL(ROUND(SQRT(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18),33)) END
+ COALESCE($!s0s!$.customnumber1__c, 0)<0
+
+
+ CASE WHEN SQRT($!s0s!$.customnumber1__c)>=0 THEN FLOOR(ROUND(SQRT($!s0s!$.customnumber1__c)::numeric(38,18),33)) ELSE CEIL(ROUND(SQRT($!s0s!$.customnumber1__c)::numeric(38,18),33)) END
+ $!s0s!$.customnumber1__c<0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesValue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesValue.xml
new file mode 100644
index 00000000..4117731d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFloorUsesValue.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null)?(($F.Decimal(context.record.customtext1__c).isPos()?$F.Decimal(context.record.customtext1__c).toDP(18).floor():$F.Decimal(context.record.customtext1__c).toDP(18).ceil())):null
+ (context.record.customtext1__c!=null)?(((Number(context.record.customtext1__c))>=0?Math.floor(Number(context.record.customtext1__c)):Math.ceil(Number(context.record.customtext1__c)))):null
+ (context.record.customtext1__c!=null)?(((Number(context.record.customtext1__c))>=0?Math.floor(Number(context.record.customtext1__c)):Math.ceil(Number(context.record.customtext1__c)))):null
+ (context.record.customtext1__c!=null)?(($F.Decimal(context.record.customtext1__c).isPos()?$F.Decimal(context.record.customtext1__c).toDP(18).floor():$F.Decimal(context.record.customtext1__c).toDP(18).ceil())):null
+
+ CASE WHEN CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))>=0 THEN FLOOR(ROUND(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))::numeric(38,18),33)) ELSE CEIL(ROUND(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))::numeric(38,18),33)) END
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$'
+
+
+ CASE WHEN CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))>=0 THEN FLOOR(ROUND(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))::numeric(38,18),33)) ELSE CEIL(ROUND(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))::numeric(38,18),33)) END
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatCurrency.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatCurrency.xml
new file mode 100644
index 00000000..72a88962
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatCurrency.xml
@@ -0,0 +1,7 @@
+
+
+ (context.record.isocode__c?new Intl.NumberFormat('en-US',{style:'currency',currency:context.record.isocode__c,currencyDisplay:'code'}).format($F.nvl(context.record.customNumber1__c,new $F.Decimal('0'))):(' '+new Intl.NumberFormat('en-US',{minimumFractionDigits:2}).format($F.nvl(context.record.customNumber1__c,new $F.Decimal('0'))))).replace(/\u00a0/,' ')
+ (context.record.isocode__c?new Intl.NumberFormat('en-US',{style:'currency',currency:context.record.isocode__c,currencyDisplay:'code'}).format($F.nvl(context.record.customNumber1__c,0)):(' '+new Intl.NumberFormat('en-US',{minimumFractionDigits:2}).format($F.nvl(context.record.customNumber1__c,0)))).replace(/\u00a0/,' ')
+ (context.record.customNumber1__c!=null)?((context.record.isocode__c?new Intl.NumberFormat('en-US',{style:'currency',currency:context.record.isocode__c,currencyDisplay:'code'}).format(context.record.customNumber1__c):(' '+new Intl.NumberFormat('en-US',{minimumFractionDigits:2}).format(context.record.customNumber1__c))).replace(/\u00a0/,' ')):null
+ (context.record.customNumber1__c!=null)?((context.record.isocode__c?new Intl.NumberFormat('en-US',{style:'currency',currency:context.record.isocode__c,currencyDisplay:'code'}).format(context.record.customNumber1__c):(' '+new Intl.NumberFormat('en-US',{minimumFractionDigits:2}).format(context.record.customNumber1__c))).replace(/\u00a0/,' ')):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationDateTime.xml
new file mode 100644
index 00000000..89656829
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null&&($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?($F.formatduration(Math.abs((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/1000),true)):null
+ (($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null&&($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?($F.formatduration(Math.abs((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/1000),true)):null
+ (($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null&&($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?($F.formatduration(Math.abs((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/1000),true)):null
+ (($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null&&($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?($F.formatduration(Math.abs((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/1000),true)):null
+
+ (EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric)))::int/86400)||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric)))::int%86400)/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric)))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric)))::int%60)::text,2,'0')
+ null
+
+
+ (EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric)))::int/86400)||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric)))::int%86400)/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric)))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric)))::int%60)::text,2,'0')
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationSeconds.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationSeconds.xml
new file mode 100644
index 00000000..03b04187
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationSeconds.xml
@@ -0,0 +1,15 @@
+
+
+ $F.formatduration(Math.abs($F.nvl(context.record.customNumber1__c,new $F.Decimal('0')).toNumber()),false)
+ $F.formatduration(Math.abs($F.nvl(context.record.customNumber1__c,0)),false)
+ (context.record.customNumber1__c!=null)?($F.formatduration(Math.abs(context.record.customNumber1__c),false)):null
+ (context.record.customNumber1__c!=null)?($F.formatduration(Math.abs(context.record.customNumber1__c.toNumber()),false)):null
+
+ LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int%60)::text,2,'0')
+ null
+
+
+ LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int%60)::text,2,'0')
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationSecondsBool.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationSecondsBool.xml
new file mode 100644
index 00000000..73fbec2d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationSecondsBool.xml
@@ -0,0 +1,15 @@
+
+
+ $F.formatduration(Math.abs($F.nvl(context.record.customNumber1__c,new $F.Decimal('0')).toNumber()),context.record.customcheckbox1__c)
+ $F.formatduration(Math.abs($F.nvl(context.record.customNumber1__c,0)),context.record.customcheckbox1__c)
+ (context.record.customNumber1__c!=null)?($F.formatduration(Math.abs(context.record.customNumber1__c),context.record.customcheckbox1__c)):null
+ (context.record.customNumber1__c!=null)?($F.formatduration(Math.abs(context.record.customNumber1__c.toNumber()),context.record.customcheckbox1__c)):null
+
+ CASE WHEN (COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') THEN (EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int/86400)||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int%86400)/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int%60)::text,2,'0') ELSE LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int%60)::text,2,'0') END
+ null
+
+
+ CASE WHEN (COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') THEN (EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int/86400)||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int%86400)/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int%60)::text,2,'0') ELSE LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int%60)::text,2,'0') END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationTime.xml
new file mode 100644
index 00000000..dcc53540
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationTime.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.timeString1__c!=null&&context.record.timeString2__c!=null)?($F.formatduration(Math.abs((new Date(new Date(context.record.timeString1__c).setUTCFullYear(1970,0,1)).getTime()-new Date(new Date(context.record.timeString2__c).setUTCFullYear(1970,0,1)).getTime())/1000),false)):null
+ (context.record.timeString1__c!=null&&context.record.timeString2__c!=null)?($F.formatduration(Math.abs((new Date(new Date(context.record.timeString1__c).setUTCFullYear(1970,0,1)).getTime()-new Date(new Date(context.record.timeString2__c).setUTCFullYear(1970,0,1)).getTime())/1000),false)):null
+ (context.record.timeString1__c!=null&&context.record.timeString2__c!=null)?($F.formatduration(Math.abs((new Date(new Date(context.record.timeString1__c).setUTCFullYear(1970,0,1)).getTime()-new Date(new Date(context.record.timeString2__c).setUTCFullYear(1970,0,1)).getTime())/1000),false)):null
+ (context.record.timeString1__c!=null&&context.record.timeString2__c!=null)?($F.formatduration(Math.abs((new Date(new Date(context.record.timeString1__c).setUTCFullYear(1970,0,1)).getTime()-new Date(new Date(context.record.timeString2__c).setUTCFullYear(1970,0,1)).getTime())/1000),false)):null
+
+ LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000)-(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000))/1000)))::int/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000)-(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000))/1000)))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000)-(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000))/1000)))::int%60)::text,2,'0')
+ NOT $!s0s!$.timeString1__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$' OR NOT $!s0s!$.timeString2__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$'
+
+
+ LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000)-(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000))/1000)))::int/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000)-(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000))/1000)))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000)-(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000))/1000)))::int%60)::text,2,'0')
+ NOT $!s0s!$.timeString1__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$' OR NOT $!s0s!$.timeString2__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationWithFalse.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationWithFalse.xml
new file mode 100644
index 00000000..72591a9c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationWithFalse.xml
@@ -0,0 +1,15 @@
+
+
+ $F.formatduration(Math.abs($F.nvl(context.record.customNumber1__c,new $F.Decimal('0')).toNumber()),false)
+ $F.formatduration(Math.abs($F.nvl(context.record.customNumber1__c,0)),false)
+ (context.record.customNumber1__c!=null)?($F.formatduration(Math.abs(context.record.customNumber1__c),false)):null
+ (context.record.customNumber1__c!=null)?($F.formatduration(Math.abs(context.record.customNumber1__c.toNumber()),false)):null
+
+ LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int%60)::text,2,'0')
+ null
+
+
+ LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int%60)::text,2,'0')
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationWithTrue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationWithTrue.xml
new file mode 100644
index 00000000..cc5a54a8
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFormatDurationWithTrue.xml
@@ -0,0 +1,15 @@
+
+
+ $F.formatduration(Math.abs($F.nvl(context.record.customNumber1__c,new $F.Decimal('0')).toNumber()),true)
+ $F.formatduration(Math.abs($F.nvl(context.record.customNumber1__c,0)),true)
+ (context.record.customNumber1__c!=null)?($F.formatduration(Math.abs(context.record.customNumber1__c),true)):null
+ (context.record.customNumber1__c!=null)?($F.formatduration(Math.abs(context.record.customNumber1__c.toNumber()),true)):null
+
+ (EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int/86400)||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int%86400)/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS(COALESCE($!s0s!$.customNumber1__c, 0))))::int%60)::text,2,'0')
+ null
+
+
+ (EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int/86400)||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int%86400)/3600)::text,2,'0')||':'||LPAD(((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int%3600)/60)::text,2,'0')||':'||LPAD((EXTRACT(EPOCH FROM (INTERVAL '1 second' * ABS($!s0s!$.customNumber1__c)))::int%60)::text,2,'0')
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFromUnixTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFromUnixTime.xml
new file mode 100644
index 00000000..1e19af91
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFromUnixTime.xml
@@ -0,0 +1,15 @@
+
+
+ new Date(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber())*1000)
+ new Date(($F.nvl(context.record.customnumber1__c,0))*1000)
+ (context.record.customnumber1__c!=null)?(new Date((context.record.customnumber1__c)*1000)):null
+ (context.record.customnumber1__c!=null)?(new Date((context.record.customnumber1__c.toNumber())*1000)):null
+
+ TO_TIMESTAMP(COALESCE($!s0s!$.customnumber1__c, 0))
+ null
+
+
+ TO_TIMESTAMP($!s0s!$.customnumber1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFunctionLeft.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFunctionLeft.xml
new file mode 100644
index 00000000..c89ccd18
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFunctionLeft.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext__c!=null)?(context.record.customtext__c.substring(0,$F.nvl(context.record.customnumber__c,new $F.Decimal('0')))):null
+ (context.record.customtext__c!=null)?(context.record.customtext__c.substring(0,$F.nvl(context.record.customnumber__c,0))):null
+ (context.record.customtext__c!=null&&context.record.customnumber__c!=null)?(context.record.customtext__c.substring(0,context.record.customnumber__c)):null
+ (context.record.customtext__c!=null&&context.record.customnumber__c!=null)?(context.record.customtext__c.substring(0,context.record.customnumber__c)):null
+
+ SUBSTR($!s0s!$.customtext__c, 1, GREATEST(COALESCE($!s0s!$.customnumber__c, 0),0)::integer)
+ null
+
+
+ SUBSTR($!s0s!$.customtext__c, 1, GREATEST($!s0s!$.customnumber__c,0)::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFunctionRight.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFunctionRight.xml
new file mode 100644
index 00000000..d3731fa0
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testFunctionRight.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext__c!=null)?((($F.nvl(context.record.customnumber__c,new $F.Decimal('0'))<=0)?'':context.record.customtext__c).slice(-($F.nvl(context.record.customnumber__c,new $F.Decimal('0'))))):null
+ (context.record.customtext__c!=null)?((($F.nvl(context.record.customnumber__c,0)<=0)?'':context.record.customtext__c).slice(-($F.nvl(context.record.customnumber__c,0)))):null
+ (context.record.customtext__c!=null&&context.record.customnumber__c!=null)?(((context.record.customnumber__c<=0)?'':context.record.customtext__c).slice(-(context.record.customnumber__c))):null
+ (context.record.customtext__c!=null&&context.record.customnumber__c!=null)?(((context.record.customnumber__c<=0)?'':context.record.customtext__c).slice(-(context.record.customnumber__c))):null
+
+ RIGHT($!s0s!$.customtext__c, GREATEST(COALESCE($!s0s!$.customnumber__c, 0), 0)::integer)
+ null
+
+
+ RIGHT($!s0s!$.customtext__c, GREATEST($!s0s!$.customnumber__c, 0)::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testHourValueWithValidInValid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testHourValueWithValidInValid.xml
new file mode 100644
index 00000000..f4e2321f
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testHourValueWithValidInValid.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?(new $F.Decimal(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getUTCHours())):null
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getUTCHours()):null
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getUTCHours()):null
+ (context.record.dateString__c!=null)?(new $F.Decimal(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getUTCHours())):null
+
+ TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000/3600000)
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
+ TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000/3600000)
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testHourWithAddOperator.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testHourWithAddOperator.xml
new file mode 100644
index 00000000..c8d989d7
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testHourWithAddOperator.xml
@@ -0,0 +1,15 @@
+
+
+ new $F.Decimal('11')
+ 11
+ 11
+ new $F.Decimal('11')
+
+ 11
+ null
+
+
+ 11
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testHourWithValidString.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testHourWithValidString.xml
new file mode 100644
index 00000000..0171a1d7
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testHourWithValidString.xml
@@ -0,0 +1,15 @@
+
+
+ new $F.Decimal('10')
+ 10
+ 10
+ new $F.Decimal('10')
+
+ 10
+ null
+
+
+ 10
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithCur.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithCur.xml
new file mode 100644
index 00000000..5ecc0324
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithCur.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==$F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))?new $F.Decimal('0'):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))
+ ((null==$F.nvl(context.record.customcurrency1__c,0))?0:$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))
+ ((null==context.record.customcurrency1__c)?0:(context.record.custompercent1__c!=null?(context.record.custompercent1__c/100.0):null))
+ ((null==context.record.customcurrency1__c)?new $F.Decimal('0'):(context.record.custompercent1__c!=null?(context.record.custompercent1__c.div(100)):null))
+
+ CASE WHEN (COALESCE($!s0s!$.customcurrency1__c, 0) IS NULL) THEN 0 ELSE COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customcurrency1__c IS NULL) THEN 0 ELSE ($!s0s!$.custompercent1__c / 100.0) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithDate.xml
new file mode 100644
index 00000000..724f2a38
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithDate.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))?($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))):null)
+ ((null==($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))?($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))):null)
+ ((null==($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))?($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))):null)
+ ((null==($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))?($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))):null)
+
+ CASE WHEN ($!s0s!$.customdate1__c IS NULL) THEN COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) ELSE CAST(NULL AS DATE) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdate1__c IS NULL) THEN COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) ELSE CAST(NULL AS DATE) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithDateTime.xml
new file mode 100644
index 00000000..d26595be
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)))?($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)):null)
+ ((null==($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)))?($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)):null)
+ ((null==($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)))?($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)):null)
+ ((null==($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)))?($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)):null)
+
+ CASE WHEN ($!s0s!$.customdatetime1__c IS NULL) THEN COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) ELSE CAST(NULL AS DATE) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdatetime1__c IS NULL) THEN COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) ELSE CAST(NULL AS DATE) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithEmail.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithEmail.xml
new file mode 100644
index 00000000..3f61e959
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithEmail.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==context.record.customemail1__c)?null:context.record.customtextarea1__c)
+ ((null==context.record.customemail1__c)?null:context.record.customtextarea1__c)
+ ((null==context.record.customemail1__c)?null:context.record.customtextarea1__c)
+ ((null==context.record.customemail1__c)?null:context.record.customtextarea1__c)
+
+ CASE WHEN ($!s0s!$.customemail1__c IS NULL) THEN NULL ELSE $!s0s!$.customtextarea1__c END
+ null
+
+
+ CASE WHEN ($!s0s!$.customemail1__c IS NULL) THEN NULL ELSE $!s0s!$.customtextarea1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithError.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithError.xml
new file mode 100644
index 00000000..455f1e2a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithError.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))))?null:$F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))
+ ((null==($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0)))?null:$F.nvl(context.record.customcurrency1__c,0))
+ (!(context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)||(null==(context.record.customnumber1__c/context.record.customnumber2__c))?null:context.record.customcurrency1__c)
+ (!(context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)||(null==context.record.customnumber1__c.div(context.record.customnumber2__c))?null:context.record.customcurrency1__c)
+
+ CASE WHEN ((COALESCE($!s0s!$.customnumber1__c, 0)/COALESCE($!s0s!$.customnumber2__c, 0)) IS NULL) THEN CAST(NULL AS DECIMAL(38,18)) ELSE COALESCE($!s0s!$.customcurrency1__c, 0) END
+ COALESCE($!s0s!$.customnumber2__c, 0)=0
+
+
+ CASE WHEN (($!s0s!$.customnumber1__c/$!s0s!$.customnumber2__c) IS NULL) THEN CAST(NULL AS DECIMAL(38,18)) ELSE $!s0s!$.customcurrency1__c END
+ $!s0s!$.customnumber2__c=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithNum.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithNum.xml
new file mode 100644
index 00000000..3281f8af
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithNum.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))?new $F.Decimal('0'):$F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))
+ ((null==$F.nvl(context.record.customnumber1__c,0))?0:$F.nvl(context.record.customcurrency1__c,0))
+ ((null==context.record.customnumber1__c)?0:context.record.customcurrency1__c)
+ ((null==context.record.customnumber1__c)?new $F.Decimal('0'):context.record.customcurrency1__c)
+
+ CASE WHEN (COALESCE($!s0s!$.customnumber1__c, 0) IS NULL) THEN 0 ELSE COALESCE($!s0s!$.customcurrency1__c, 0) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customnumber1__c IS NULL) THEN 0 ELSE $!s0s!$.customcurrency1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithPer.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithPer.xml
new file mode 100644
index 00000000..e75be095
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithPer.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))?new $F.Decimal('0'):$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ ((null==$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))?0:$F.nvl(context.record.customnumber1__c,0))
+ (!(context.record.custompercent1__c!=null)||(null==context.record.custompercent1__c/100.0)?0:context.record.customnumber1__c)
+ (!(context.record.custompercent1__c!=null)||(null==context.record.custompercent1__c.div(100))?new $F.Decimal('0'):context.record.customnumber1__c)
+
+ CASE WHEN (COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) IS NULL) THEN 0 ELSE COALESCE($!s0s!$.customnumber1__c, 0) END
+ null
+
+
+ CASE WHEN (($!s0s!$.custompercent1__c / 100.0) IS NULL) THEN 0 ELSE $!s0s!$.customnumber1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithPhone.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithPhone.xml
new file mode 100644
index 00000000..13c40a67
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithPhone.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==context.record.customphone1__c)?null:context.record.customtextarea1__c)
+ ((null==context.record.customphone1__c)?null:context.record.customtextarea1__c)
+ ((null==context.record.customphone1__c)?null:context.record.customtextarea1__c)
+ ((null==context.record.customphone1__c)?null:context.record.customtextarea1__c)
+
+ CASE WHEN ($!s0s!$.customphone1__c IS NULL) THEN NULL ELSE $!s0s!$.customtextarea1__c END
+ null
+
+
+ CASE WHEN ($!s0s!$.customphone1__c IS NULL) THEN NULL ELSE $!s0s!$.customtextarea1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithText.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithText.xml
new file mode 100644
index 00000000..0a32f844
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithText.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==context.record.customtext1__c)?"NULL":context.record.customtextarea1__c)
+ ((null==context.record.customtext1__c)?"NULL":context.record.customtextarea1__c)
+ ((null==context.record.customtext1__c)?"NULL":context.record.customtextarea1__c)
+ ((null==context.record.customtext1__c)?"NULL":context.record.customtextarea1__c)
+
+ CASE WHEN ($!s0s!$.customtext1__c IS NULL) THEN 'NULL' ELSE $!s0s!$.customtextarea1__c END
+ null
+
+
+ CASE WHEN ($!s0s!$.customtext1__c IS NULL) THEN 'NULL' ELSE $!s0s!$.customtextarea1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithTextArea.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithTextArea.xml
new file mode 100644
index 00000000..890e2d1e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithTextArea.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==context.record.customtextarea1__c)?null:context.record.customtext1__c)
+ ((null==context.record.customtextarea1__c)?null:context.record.customtext1__c)
+ ((null==context.record.customtextarea1__c)?null:context.record.customtext1__c)
+ ((null==context.record.customtextarea1__c)?null:context.record.customtext1__c)
+
+ CASE WHEN ($!s0s!$.customtextarea1__c IS NULL) THEN NULL ELSE $!s0s!$.customtext1__c END
+ null
+
+
+ CASE WHEN ($!s0s!$.customtextarea1__c IS NULL) THEN NULL ELSE $!s0s!$.customtext1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithUrl.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithUrl.xml
new file mode 100644
index 00000000..5e355a4b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISBLANKWithUrl.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==context.record.customurl1__c)?null:context.record.customtextarea1__c)
+ ((null==context.record.customurl1__c)?null:context.record.customtextarea1__c)
+ ((null==context.record.customurl1__c)?null:context.record.customtextarea1__c)
+ ((null==context.record.customurl1__c)?null:context.record.customtextarea1__c)
+
+ CASE WHEN ($!s0s!$.customurl1__c IS NULL) THEN NULL ELSE $!s0s!$.customtextarea1__c END
+ null
+
+
+ CASE WHEN ($!s0s!$.customurl1__c IS NULL) THEN NULL ELSE $!s0s!$.customtextarea1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithCur.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithCur.xml
new file mode 100644
index 00000000..ab109fa5
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithCur.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==$F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))?new $F.Decimal('0'):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))
+ ((null==$F.nvl(context.record.customcurrency1__c,0))?0:$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))
+ ((null==context.record.customcurrency1__c)?0:(context.record.custompercent1__c!=null?(context.record.custompercent1__c/100.0):null))
+ ((null==context.record.customcurrency1__c)?new $F.Decimal('0'):(context.record.custompercent1__c!=null?(context.record.custompercent1__c.div(100)):null))
+
+ CASE WHEN (COALESCE($!s0s!$.customcurrency1__c, 0) IS NULL) THEN 0 ELSE COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customcurrency1__c IS NULL) THEN 0 ELSE ($!s0s!$.custompercent1__c / 100.0) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithDate.xml
new file mode 100644
index 00000000..e3bfddac
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithDate.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))?($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))):null)
+ ((null==($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))?($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))):null)
+ ((null==($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))?($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))):null)
+ ((null==($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))?($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))):null)
+
+ CASE WHEN ($!s0s!$.customdate1__c IS NULL) THEN COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) ELSE CAST(NULL AS DATE) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdate1__c IS NULL) THEN COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) ELSE CAST(NULL AS DATE) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithDateTime.xml
new file mode 100644
index 00000000..a6236339
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)))?($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)):null)
+ ((null==($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)))?($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)):null)
+ ((null==($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)))?($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)):null)
+ ((null==($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)))?($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)):null)
+
+ CASE WHEN ($!s0s!$.customdatetime1__c IS NULL) THEN COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) ELSE CAST(NULL AS DATE) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdatetime1__c IS NULL) THEN COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) ELSE CAST(NULL AS DATE) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithEmail.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithEmail.xml
new file mode 100644
index 00000000..38b1fca0
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithEmail.xml
@@ -0,0 +1,15 @@
+
+
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+
+ $!s0s!$.customtextarea1__c
+ null
+
+
+ $!s0s!$.customtextarea1__c
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithError.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithError.xml
new file mode 100644
index 00000000..d3d4551f
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithError.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))))?null:$F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))
+ ((null==($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0)))?null:$F.nvl(context.record.customcurrency1__c,0))
+ (!(context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)||(null==(context.record.customnumber1__c/context.record.customnumber2__c))?null:context.record.customcurrency1__c)
+ (!(context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)||(null==context.record.customnumber1__c.div(context.record.customnumber2__c))?null:context.record.customcurrency1__c)
+
+ CASE WHEN ((COALESCE($!s0s!$.customnumber1__c, 0)/COALESCE($!s0s!$.customnumber2__c, 0)) IS NULL) THEN CAST(NULL AS DECIMAL(38,18)) ELSE COALESCE($!s0s!$.customcurrency1__c, 0) END
+ COALESCE($!s0s!$.customnumber2__c, 0)=0
+
+
+ CASE WHEN (($!s0s!$.customnumber1__c/$!s0s!$.customnumber2__c) IS NULL) THEN CAST(NULL AS DECIMAL(38,18)) ELSE $!s0s!$.customcurrency1__c END
+ $!s0s!$.customnumber2__c=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithNum.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithNum.xml
new file mode 100644
index 00000000..5dc44225
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithNum.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))?new $F.Decimal('0'):$F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))
+ ((null==$F.nvl(context.record.customnumber1__c,0))?0:$F.nvl(context.record.customcurrency1__c,0))
+ ((null==context.record.customnumber1__c)?0:context.record.customcurrency1__c)
+ ((null==context.record.customnumber1__c)?new $F.Decimal('0'):context.record.customcurrency1__c)
+
+ CASE WHEN (COALESCE($!s0s!$.customnumber1__c, 0) IS NULL) THEN 0 ELSE COALESCE($!s0s!$.customcurrency1__c, 0) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customnumber1__c IS NULL) THEN 0 ELSE $!s0s!$.customcurrency1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithPer.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithPer.xml
new file mode 100644
index 00000000..f5b9ab5b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithPer.xml
@@ -0,0 +1,15 @@
+
+
+ ((null==$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))?new $F.Decimal('0'):$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ ((null==$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))?0:$F.nvl(context.record.customnumber1__c,0))
+ (!(context.record.custompercent1__c!=null)||(null==context.record.custompercent1__c/100.0)?0:context.record.customnumber1__c)
+ (!(context.record.custompercent1__c!=null)||(null==context.record.custompercent1__c.div(100))?new $F.Decimal('0'):context.record.customnumber1__c)
+
+ CASE WHEN (COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) IS NULL) THEN 0 ELSE COALESCE($!s0s!$.customnumber1__c, 0) END
+ null
+
+
+ CASE WHEN (($!s0s!$.custompercent1__c / 100.0) IS NULL) THEN 0 ELSE $!s0s!$.customnumber1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithPhone.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithPhone.xml
new file mode 100644
index 00000000..778f7030
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithPhone.xml
@@ -0,0 +1,15 @@
+
+
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+
+ $!s0s!$.customtextarea1__c
+ null
+
+
+ $!s0s!$.customtextarea1__c
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithText.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithText.xml
new file mode 100644
index 00000000..a52b3a1c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithText.xml
@@ -0,0 +1,15 @@
+
+
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+
+ $!s0s!$.customtextarea1__c
+ null
+
+
+ $!s0s!$.customtextarea1__c
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithTextArea.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithTextArea.xml
new file mode 100644
index 00000000..86467472
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithTextArea.xml
@@ -0,0 +1,15 @@
+
+
+ context.record.customtext1__c
+ context.record.customtext1__c
+ context.record.customtext1__c
+ context.record.customtext1__c
+
+ $!s0s!$.customtext1__c
+ null
+
+
+ $!s0s!$.customtext1__c
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithUrl.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithUrl.xml
new file mode 100644
index 00000000..50606ff2
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNULLWithUrl.xml
@@ -0,0 +1,15 @@
+
+
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+
+ $!s0s!$.customtextarea1__c
+ null
+
+
+ $!s0s!$.customtextarea1__c
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNUMBER.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNUMBER.xml
new file mode 100644
index 00000000..76084cda
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testISNUMBER.xml
@@ -0,0 +1,15 @@
+
+
+ (!isNaN(context.record.customtext1__c)?new $F.Decimal('1'):new $F.Decimal('0'))
+ (!isNaN(context.record.customtext1__c)?1:0)
+ (!isNaN(context.record.customtext1__c)?1:0)
+ (!isNaN(context.record.customtext1__c)?new $F.Decimal('1'):new $F.Decimal('0'))
+
+ CASE WHEN REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$' THEN 1 ELSE 0 END
+ null
+
+
+ CASE WHEN REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$' THEN 1 ELSE 0 END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfANDFunc.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfANDFunc.xml
new file mode 100644
index 00000000..7f50a92f
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfANDFunc.xml
@@ -0,0 +1,7 @@
+
+
+ (context.record.customcheckbox1__c!=null&&context.record.customcheckbox2__c!=null && ((context.record.customcheckbox1__c)&&(context.record.customcheckbox2__c))?(context.record.customcheckbox3__c?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):new Date(Date.UTC($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber(),$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toNumber()-1,$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')).toNumber())))
+ (context.record.customcheckbox1__c!=null&&context.record.customcheckbox2__c!=null && ((context.record.customcheckbox1__c)&&(context.record.customcheckbox2__c))?(context.record.customcheckbox3__c?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):new Date(Date.UTC($F.nvl(context.record.customnumber1__c,0),$F.nvl(context.record.customnumber2__c,0)-1,$F.nvl(context.record.customnumber3__c,0))))
+ (context.record.customcheckbox1__c!=null&&context.record.customcheckbox2__c!=null && ((context.record.customcheckbox1__c)&&(context.record.customcheckbox2__c))?(context.record.customcheckbox3__c?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):(context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber3__c!=null?(new Date(Date.UTC(context.record.customnumber1__c,context.record.customnumber2__c-1,context.record.customnumber3__c))):null))
+ (context.record.customcheckbox1__c!=null&&context.record.customcheckbox2__c!=null && ((context.record.customcheckbox1__c)&&(context.record.customcheckbox2__c))?(context.record.customcheckbox3__c?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):(context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber3__c!=null?(new Date(Date.UTC(context.record.customnumber1__c.toNumber(),context.record.customnumber2__c.toNumber()-1,context.record.customnumber3__c.toNumber()))):null))
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfAndNull.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfAndNull.xml
new file mode 100644
index 00000000..9b1c32ae
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfAndNull.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl((null!=null&&context.record.customcheckbox1__c!=null && ((null)&&(context.record.customcheckbox1__c))?"T":"F"),'')+$F.nvl((context.record.customcheckbox1__c!=null&&null!=null && ((context.record.customcheckbox1__c)&&(null))?"T":"F"),'')
+ $F.nvl((null!=null&&context.record.customcheckbox1__c!=null && ((null)&&(context.record.customcheckbox1__c))?"T":"F"),'')+$F.nvl((context.record.customcheckbox1__c!=null&&null!=null && ((context.record.customcheckbox1__c)&&(null))?"T":"F"),'')
+ $F.nvl((null!=null&&context.record.customcheckbox1__c!=null && ((null)&&(context.record.customcheckbox1__c))?"T":"F"),'')+$F.nvl((context.record.customcheckbox1__c!=null&&null!=null && ((context.record.customcheckbox1__c)&&(null))?"T":"F"),'')
+ $F.nvl((null!=null&&context.record.customcheckbox1__c!=null && ((null)&&(context.record.customcheckbox1__c))?"T":"F"),'')+$F.nvl((context.record.customcheckbox1__c!=null&&null!=null && ((context.record.customcheckbox1__c)&&(null))?"T":"F"),'')
+
+ CONCAT(CASE WHEN ((1=0) AND (COALESCE($!s0s!$.customcheckbox1__c, '0') = '1')) THEN 'T' ELSE 'F' END, CASE WHEN ((COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') AND (1=0)) THEN 'T' ELSE 'F' END)
+ null
+
+
+ CONCAT(CASE WHEN ((1=0) AND (COALESCE($!s0s!$.customcheckbox1__c, '0') = '1')) THEN 'T' ELSE 'F' END, CASE WHEN ((COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') AND (1=0)) THEN 'T' ELSE 'F' END)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfBeginsUsesEmail.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfBeginsUsesEmail.xml
new file mode 100644
index 00000000..ce636f9d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfBeginsUsesEmail.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customemail1__c!=null&&context.record.customtext1__c!=null && (!context.record.customtext1__c||context.record.customemail1__c.lastIndexOf($F.nvl(context.record.customtext1__c,''),0)===0)?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')):$F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))
+ (context.record.customemail1__c!=null&&context.record.customtext1__c!=null && (!context.record.customtext1__c||context.record.customemail1__c.lastIndexOf($F.nvl(context.record.customtext1__c,''),0)===0)?$F.nvl(context.record.customnumber1__c,0):$F.nvl(context.record.customcurrency1__c,0))
+ (context.record.customemail1__c!=null&&context.record.customtext1__c!=null && (!context.record.customtext1__c||context.record.customemail1__c.lastIndexOf($F.nvl(context.record.customtext1__c,''),0)===0)?context.record.customnumber1__c:context.record.customcurrency1__c)
+ (context.record.customemail1__c!=null&&context.record.customtext1__c!=null && (!context.record.customtext1__c||context.record.customemail1__c.lastIndexOf($F.nvl(context.record.customtext1__c,''),0)===0)?context.record.customnumber1__c:context.record.customcurrency1__c)
+
+ CASE WHEN (($!s0s!$.customtext1__c IS NULL) OR (STRPOS($!s0s!$.customemail1__c, $!s0s!$.customtext1__c) = 1)) THEN COALESCE($!s0s!$.customnumber1__c, 0) ELSE COALESCE($!s0s!$.customcurrency1__c, 0) END
+ null
+
+
+ CASE WHEN (($!s0s!$.customtext1__c IS NULL) OR (STRPOS($!s0s!$.customemail1__c, $!s0s!$.customtext1__c) = 1)) THEN $!s0s!$.customnumber1__c ELSE $!s0s!$.customcurrency1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfBeginsUsesPhone.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfBeginsUsesPhone.xml
new file mode 100644
index 00000000..37165036
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfBeginsUsesPhone.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customphone1__c!=null&&context.record.customtext1__c!=null && (!context.record.customtext1__c||context.record.customphone1__c.lastIndexOf($F.nvl(context.record.customtext1__c,''),0)===0)?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))
+ (context.record.customphone1__c!=null&&context.record.customtext1__c!=null && (!context.record.customtext1__c||context.record.customphone1__c.lastIndexOf($F.nvl(context.record.customtext1__c,''),0)===0)?$F.nvl(context.record.customnumber1__c,0):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))
+ (context.record.customphone1__c!=null&&context.record.customtext1__c!=null && (!context.record.customtext1__c||context.record.customphone1__c.lastIndexOf($F.nvl(context.record.customtext1__c,''),0)===0)?context.record.customnumber1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c/100.0):null))
+ (context.record.customphone1__c!=null&&context.record.customtext1__c!=null && (!context.record.customtext1__c||context.record.customphone1__c.lastIndexOf($F.nvl(context.record.customtext1__c,''),0)===0)?context.record.customnumber1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c.div(100)):null))
+
+ CASE WHEN (($!s0s!$.customtext1__c IS NULL) OR (STRPOS($!s0s!$.customphone1__c, $!s0s!$.customtext1__c) = 1)) THEN COALESCE($!s0s!$.customnumber1__c, 0) ELSE COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) END
+ null
+
+
+ CASE WHEN (($!s0s!$.customtext1__c IS NULL) OR (STRPOS($!s0s!$.customphone1__c, $!s0s!$.customtext1__c) = 1)) THEN $!s0s!$.customnumber1__c ELSE ($!s0s!$.custompercent1__c / 100.0) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfBeginsUsesText.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfBeginsUsesText.xml
new file mode 100644
index 00000000..9411d843
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfBeginsUsesText.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null&&context.record.customtext2__c!=null && (!context.record.customtext2__c||context.record.customtext1__c.lastIndexOf($F.nvl(context.record.customtext2__c,''),0)===0)?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))
+ (context.record.customtext1__c!=null&&context.record.customtext2__c!=null && (!context.record.customtext2__c||context.record.customtext1__c.lastIndexOf($F.nvl(context.record.customtext2__c,''),0)===0)?$F.nvl(context.record.customnumber1__c,0):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))
+ (context.record.customtext1__c!=null&&context.record.customtext2__c!=null && (!context.record.customtext2__c||context.record.customtext1__c.lastIndexOf($F.nvl(context.record.customtext2__c,''),0)===0)?context.record.customnumber1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c/100.0):null))
+ (context.record.customtext1__c!=null&&context.record.customtext2__c!=null && (!context.record.customtext2__c||context.record.customtext1__c.lastIndexOf($F.nvl(context.record.customtext2__c,''),0)===0)?context.record.customnumber1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c.div(100)):null))
+
+ CASE WHEN (($!s0s!$.customtext2__c IS NULL) OR (STRPOS($!s0s!$.customtext1__c, $!s0s!$.customtext2__c) = 1)) THEN COALESCE($!s0s!$.customnumber1__c, 0) ELSE COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) END
+ null
+
+
+ CASE WHEN (($!s0s!$.customtext2__c IS NULL) OR (STRPOS($!s0s!$.customtext1__c, $!s0s!$.customtext2__c) = 1)) THEN $!s0s!$.customnumber1__c ELSE ($!s0s!$.custompercent1__c / 100.0) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfBeginsUsesTextArea.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfBeginsUsesTextArea.xml
new file mode 100644
index 00000000..588b84c3
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfBeginsUsesTextArea.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtextarea1__c!=null&&context.record.customtext1__c!=null && (!context.record.customtext1__c||context.record.customtextarea1__c.lastIndexOf($F.nvl(context.record.customtext1__c,''),0)===0)?$F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))
+ (context.record.customtextarea1__c!=null&&context.record.customtext1__c!=null && (!context.record.customtext1__c||context.record.customtextarea1__c.lastIndexOf($F.nvl(context.record.customtext1__c,''),0)===0)?$F.nvl(context.record.customcurrency1__c,0):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))
+ (context.record.customtextarea1__c!=null&&context.record.customtext1__c!=null && (!context.record.customtext1__c||context.record.customtextarea1__c.lastIndexOf($F.nvl(context.record.customtext1__c,''),0)===0)?context.record.customcurrency1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c/100.0):null))
+ (context.record.customtextarea1__c!=null&&context.record.customtext1__c!=null && (!context.record.customtext1__c||context.record.customtextarea1__c.lastIndexOf($F.nvl(context.record.customtext1__c,''),0)===0)?context.record.customcurrency1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c.div(100)):null))
+
+ CASE WHEN (($!s0s!$.customtext1__c IS NULL) OR (STRPOS($!s0s!$.customtextarea1__c, $!s0s!$.customtext1__c) = 1)) THEN COALESCE($!s0s!$.customcurrency1__c, 0) ELSE COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) END
+ null
+
+
+ CASE WHEN (($!s0s!$.customtext1__c IS NULL) OR (STRPOS($!s0s!$.customtextarea1__c, $!s0s!$.customtext1__c) = 1)) THEN $!s0s!$.customcurrency1__c ELSE ($!s0s!$.custompercent1__c / 100.0) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsFunc.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsFunc.xml
new file mode 100644
index 00000000..4f90395b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsFunc.xml
@@ -0,0 +1,15 @@
+
+
+ ((!context.record.customtext2__c||(($F.nvl(context.record.customtext1__c,'')).indexOf(context.record.customtext2__c)>=0))?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs():($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toDP(18).ceil()))
+ ((!context.record.customtext2__c||(($F.nvl(context.record.customtext1__c,'')).indexOf(context.record.customtext2__c)>=0))?Math.abs($F.nvl(context.record.customnumber1__c,0)):(($F.nvl(context.record.customnumber2__c,0))>=0?Math.floor($F.nvl(context.record.customnumber2__c,0)):Math.ceil($F.nvl(context.record.customnumber2__c,0))))
+ ((!context.record.customtext2__c||(($F.nvl(context.record.customtext1__c,'')).indexOf(context.record.customtext2__c)>=0))?(context.record.customnumber1__c!=null?(Math.abs(context.record.customnumber1__c)):null):(context.record.customnumber2__c!=null?(((context.record.customnumber2__c)>=0?Math.floor(context.record.customnumber2__c):Math.ceil(context.record.customnumber2__c))):null))
+ ((!context.record.customtext2__c||(($F.nvl(context.record.customtext1__c,'')).indexOf(context.record.customtext2__c)>=0))?(context.record.customnumber1__c!=null?(context.record.customnumber1__c.abs()):null):(context.record.customnumber2__c!=null?((context.record.customnumber2__c.isPos()?context.record.customnumber2__c.toDP(18).floor():context.record.customnumber2__c.toDP(18).ceil())):null))
+
+ CASE WHEN (($!s0s!$.customtext2__c IS NULL) OR (STRPOS($!s0s!$.customtext1__c, $!s0s!$.customtext2__c) >= 1)) THEN ABS(COALESCE($!s0s!$.customnumber1__c, 0)) ELSE CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber2__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber2__c, 0)::numeric(38,18),33)) END END
+ null
+
+
+ CASE WHEN (($!s0s!$.customtext2__c IS NULL) OR (STRPOS($!s0s!$.customtext1__c, $!s0s!$.customtext2__c) >= 1)) THEN COALESCE(ABS($!s0s!$.customnumber1__c),CAST(NULL AS DECIMAL(38,18))) ELSE COALESCE(CASE WHEN $!s0s!$.customnumber2__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber2__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber2__c::numeric(38,18),33)) END,CAST(NULL AS DECIMAL(38,18))) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsUsesEmail.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsUsesEmail.xml
new file mode 100644
index 00000000..d5448f41
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsUsesEmail.xml
@@ -0,0 +1,15 @@
+
+
+ ((!context.record.customtext1__c||(($F.nvl(context.record.customemail1__c,'')).indexOf(context.record.customtext1__c)>=0))?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')):$F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))
+ ((!context.record.customtext1__c||(($F.nvl(context.record.customemail1__c,'')).indexOf(context.record.customtext1__c)>=0))?$F.nvl(context.record.customnumber1__c,0):$F.nvl(context.record.customcurrency1__c,0))
+ ((!context.record.customtext1__c||(($F.nvl(context.record.customemail1__c,'')).indexOf(context.record.customtext1__c)>=0))?context.record.customnumber1__c:context.record.customcurrency1__c)
+ ((!context.record.customtext1__c||(($F.nvl(context.record.customemail1__c,'')).indexOf(context.record.customtext1__c)>=0))?context.record.customnumber1__c:context.record.customcurrency1__c)
+
+ CASE WHEN (($!s0s!$.customtext1__c IS NULL) OR (STRPOS($!s0s!$.customemail1__c, $!s0s!$.customtext1__c) >= 1)) THEN COALESCE($!s0s!$.customnumber1__c, 0) ELSE COALESCE($!s0s!$.customcurrency1__c, 0) END
+ null
+
+
+ CASE WHEN (($!s0s!$.customtext1__c IS NULL) OR (STRPOS($!s0s!$.customemail1__c, $!s0s!$.customtext1__c) >= 1)) THEN $!s0s!$.customnumber1__c ELSE $!s0s!$.customcurrency1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsUsesPhone.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsUsesPhone.xml
new file mode 100644
index 00000000..04fd45e6
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsUsesPhone.xml
@@ -0,0 +1,15 @@
+
+
+ ((!context.record.customtext1__c||(($F.nvl(context.record.customphone1__c,'')).indexOf(context.record.customtext1__c)>=0))?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))
+ ((!context.record.customtext1__c||(($F.nvl(context.record.customphone1__c,'')).indexOf(context.record.customtext1__c)>=0))?$F.nvl(context.record.customnumber1__c,0):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))
+ ((!context.record.customtext1__c||(($F.nvl(context.record.customphone1__c,'')).indexOf(context.record.customtext1__c)>=0))?context.record.customnumber1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c/100.0):null))
+ ((!context.record.customtext1__c||(($F.nvl(context.record.customphone1__c,'')).indexOf(context.record.customtext1__c)>=0))?context.record.customnumber1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c.div(100)):null))
+
+ CASE WHEN (($!s0s!$.customtext1__c IS NULL) OR (STRPOS($!s0s!$.customphone1__c, $!s0s!$.customtext1__c) >= 1)) THEN COALESCE($!s0s!$.customnumber1__c, 0) ELSE COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) END
+ null
+
+
+ CASE WHEN (($!s0s!$.customtext1__c IS NULL) OR (STRPOS($!s0s!$.customphone1__c, $!s0s!$.customtext1__c) >= 1)) THEN $!s0s!$.customnumber1__c ELSE ($!s0s!$.custompercent1__c / 100.0) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsUsesText.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsUsesText.xml
new file mode 100644
index 00000000..85739636
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsUsesText.xml
@@ -0,0 +1,15 @@
+
+
+ ((!context.record.customtext2__c||(($F.nvl(context.record.customtext1__c,'')).indexOf(context.record.customtext2__c)>=0))?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))
+ ((!context.record.customtext2__c||(($F.nvl(context.record.customtext1__c,'')).indexOf(context.record.customtext2__c)>=0))?$F.nvl(context.record.customnumber1__c,0):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))
+ ((!context.record.customtext2__c||(($F.nvl(context.record.customtext1__c,'')).indexOf(context.record.customtext2__c)>=0))?context.record.customnumber1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c/100.0):null))
+ ((!context.record.customtext2__c||(($F.nvl(context.record.customtext1__c,'')).indexOf(context.record.customtext2__c)>=0))?context.record.customnumber1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c.div(100)):null))
+
+ CASE WHEN (($!s0s!$.customtext2__c IS NULL) OR (STRPOS($!s0s!$.customtext1__c, $!s0s!$.customtext2__c) >= 1)) THEN COALESCE($!s0s!$.customnumber1__c, 0) ELSE COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) END
+ null
+
+
+ CASE WHEN (($!s0s!$.customtext2__c IS NULL) OR (STRPOS($!s0s!$.customtext1__c, $!s0s!$.customtext2__c) >= 1)) THEN $!s0s!$.customnumber1__c ELSE ($!s0s!$.custompercent1__c / 100.0) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsUsesTextArea.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsUsesTextArea.xml
new file mode 100644
index 00000000..4bd5d913
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfContainsUsesTextArea.xml
@@ -0,0 +1,15 @@
+
+
+ ((!context.record.customtext1__c||(($F.nvl(context.record.customtextarea1__c,'')).indexOf(context.record.customtext1__c)>=0))?$F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))
+ ((!context.record.customtext1__c||(($F.nvl(context.record.customtextarea1__c,'')).indexOf(context.record.customtext1__c)>=0))?$F.nvl(context.record.customcurrency1__c,0):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))
+ ((!context.record.customtext1__c||(($F.nvl(context.record.customtextarea1__c,'')).indexOf(context.record.customtext1__c)>=0))?context.record.customcurrency1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c/100.0):null))
+ ((!context.record.customtext1__c||(($F.nvl(context.record.customtextarea1__c,'')).indexOf(context.record.customtext1__c)>=0))?context.record.customcurrency1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c.div(100)):null))
+
+ CASE WHEN (($!s0s!$.customtext1__c IS NULL) OR (STRPOS($!s0s!$.customtextarea1__c, $!s0s!$.customtext1__c) >= 1)) THEN COALESCE($!s0s!$.customcurrency1__c, 0) ELSE COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) END
+ null
+
+
+ CASE WHEN (($!s0s!$.customtext1__c IS NULL) OR (STRPOS($!s0s!$.customtextarea1__c, $!s0s!$.customtext1__c) >= 1)) THEN $!s0s!$.customcurrency1__c ELSE ($!s0s!$.custompercent1__c / 100.0) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareEqual.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareEqual.xml
new file mode 100644
index 00000000..6022eef4
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareEqual.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()))==(($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()))?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()))==(($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()))?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()))==(($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()))?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()))==(($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()))?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+
+ CASE WHEN ($!s0s!$.customdate1__c=$!s0s!$.customdate2__c) THEN COALESCE($!s0s!$.customdatetime1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdate1__c=$!s0s!$.customdate2__c) THEN COALESCE($!s0s!$.customdatetime1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareGreaterThan.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareGreaterThan.xml
new file mode 100644
index 00000000..5fd3c7c3
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareGreaterThan.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+
+ CASE WHEN ($!s0s!$.customdate1__c>$!s0s!$.customdate2__c) THEN COALESCE($!s0s!$.customdatetime1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdate1__c>$!s0s!$.customdate2__c) THEN COALESCE($!s0s!$.customdatetime1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareGreaterThanOrEqual.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareGreaterThanOrEqual.xml
new file mode 100644
index 00000000..b63a6848
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareGreaterThanOrEqual.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>=($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>=($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>=($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>=($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+
+ CASE WHEN ($!s0s!$.customdate1__c>=$!s0s!$.customdate2__c) THEN COALESCE($!s0s!$.customdatetime1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdate1__c>=$!s0s!$.customdate2__c) THEN COALESCE($!s0s!$.customdatetime1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareLessThan.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareLessThan.xml
new file mode 100644
index 00000000..a79fb049
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareLessThan.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))<($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))<($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))<($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))<($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+
+ CASE WHEN ($!s0s!$.customdate1__c<$!s0s!$.customdate2__c) THEN COALESCE($!s0s!$.customdatetime1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdate1__c<$!s0s!$.customdate2__c) THEN COALESCE($!s0s!$.customdatetime1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareLessThanOrEqual.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareLessThanOrEqual.xml
new file mode 100644
index 00000000..78aea524
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateCompareLessThanOrEqual.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))<=($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))<=($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))<=($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ ((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))<=($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):null)?($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+
+ CASE WHEN ($!s0s!$.customdate1__c<=$!s0s!$.customdate2__c) THEN COALESCE($!s0s!$.customdatetime1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdate1__c<=$!s0s!$.customdate2__c) THEN COALESCE($!s0s!$.customdatetime1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareEqual.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareEqual.xml
new file mode 100644
index 00000000..bdbc3ab1
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareEqual.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()))==(($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime()))?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()))==(($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime()))?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()))==(($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime()))?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()))==(($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime()))?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+
+ CASE WHEN ($!s0s!$.customdatetime1__c=$!s0s!$.customdatetime2__c) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdatetime1__c=$!s0s!$.customdatetime2__c) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareGreaterThan.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareGreaterThan.xml
new file mode 100644
index 00000000..84576a9d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareGreaterThan.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))>($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))>($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))>($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))>($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+
+ CASE WHEN ($!s0s!$.customdatetime1__c>$!s0s!$.customdatetime2__c) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdatetime1__c>$!s0s!$.customdatetime2__c) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareGtThanOrEqual.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareGtThanOrEqual.xml
new file mode 100644
index 00000000..544dec74
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareGtThanOrEqual.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))>=($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))>=($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))>=($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))>=($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+
+ CASE WHEN ($!s0s!$.customdatetime1__c>=$!s0s!$.customdatetime2__c) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdatetime1__c>=$!s0s!$.customdatetime2__c) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareLessThan.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareLessThan.xml
new file mode 100644
index 00000000..4a501d00
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareLessThan.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))<($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))<($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))<($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))<($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+
+ CASE WHEN ($!s0s!$.customdatetime1__c<$!s0s!$.customdatetime2__c) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdatetime1__c<$!s0s!$.customdatetime2__c) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareLessThanOrEqual.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareLessThanOrEqual.xml
new file mode 100644
index 00000000..4c3f2d00
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfDateTimeCompareLessThanOrEqual.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))<=($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))<=($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))<=($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ ((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))<=($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))):null)?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+
+ CASE WHEN ($!s0s!$.customdatetime1__c<=$!s0s!$.customdatetime2__c) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customdatetime1__c<=$!s0s!$.customdatetime2__c) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdate2__c,CAST(NULL AS DATE)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorBigDivide.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorBigDivide.xml
new file mode 100644
index 00000000..7b359a56
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorBigDivide.xml
@@ -0,0 +1,7 @@
+
+
+ (isNaN($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).mul($F.nvl(context.record.customnumber3__c,new $F.Decimal('0')))))?new $F.Decimal('0'):$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).mul($F.nvl(context.record.customnumber3__c,new $F.Decimal('0')))
+ (isNaN(($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))*$F.nvl(context.record.customnumber3__c,0)))?0:($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))*$F.nvl(context.record.customnumber3__c,0)
+ (!(context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber3__c!=null) || isNaN((context.record.customnumber1__c/context.record.customnumber2__c)*context.record.customnumber3__c))?0:(context.record.customnumber1__c/context.record.customnumber2__c)*context.record.customnumber3__c
+ (!(context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber3__c!=null) || isNaN(context.record.customnumber1__c.div(context.record.customnumber2__c).mul(context.record.customnumber3__c)))?new $F.Decimal('0'):context.record.customnumber1__c.div(context.record.customnumber2__c).mul(context.record.customnumber3__c)
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorDateTimeValueWithInvalidString.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorDateTimeValueWithInvalidString.xml
new file mode 100644
index 00000000..ae82a1bb
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorDateTimeValueWithInvalidString.xml
@@ -0,0 +1,15 @@
+
+
+ (Object.prototype.toString.call($F.parseDateTime("sample ")) !== '[object Date]') || isNaN($F.parseDateTime("sample ").getTime())?$F.parseDateTime("2005-11-15 17:00:00 "):$F.parseDateTime("sample ")
+ (Object.prototype.toString.call($F.parseDateTime("sample ")) !== '[object Date]') || isNaN($F.parseDateTime("sample ").getTime())?$F.parseDateTime("2005-11-15 17:00:00 "):$F.parseDateTime("sample ")
+ (Object.prototype.toString.call($F.parseDateTime("sample ")) !== '[object Date]') || isNaN($F.parseDateTime("sample ").getTime())?$F.parseDateTime("2005-11-15 17:00:00 "):$F.parseDateTime("sample ")
+ (Object.prototype.toString.call($F.parseDateTime("sample ")) !== '[object Date]') || isNaN($F.parseDateTime("sample ").getTime())?$F.parseDateTime("2005-11-15 17:00:00 "):$F.parseDateTime("sample ")
+
+ CASE WHEN 0=0 THEN TO_TIMESTAMP('2005-11-15 17:00:00 ', 'YYYY-MM-DD HH24:MI:SS') ELSE NULL END
+ null
+
+
+ CASE WHEN 0=0 THEN TO_TIMESTAMP('2005-11-15 17:00:00 ', 'YYYY-MM-DD HH24:MI:SS') ELSE NULL END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorDateTimeValueWithValidInValid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorDateTimeValueWithValidInValid.xml
new file mode 100644
index 00000000..7d9418c7
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorDateTimeValueWithValidInValid.xml
@@ -0,0 +1,15 @@
+
+
+ (!(context.record.dateString__c!=null) || Object.prototype.toString.call($F.parseDateTime(context.record.dateString__c)) !== '[object Date]') || isNaN($F.parseDateTime(context.record.dateString__c).getTime())?$F.parseDateTime("2005-11-15 17:00:00 "):$F.parseDateTime(context.record.dateString__c)
+ (!(context.record.dateString__c!=null) || Object.prototype.toString.call($F.parseDateTime(context.record.dateString__c)) !== '[object Date]') || isNaN($F.parseDateTime(context.record.dateString__c).getTime())?$F.parseDateTime("2005-11-15 17:00:00 "):$F.parseDateTime(context.record.dateString__c)
+ (!(context.record.dateString__c!=null) || Object.prototype.toString.call($F.parseDateTime(context.record.dateString__c)) !== '[object Date]') || isNaN($F.parseDateTime(context.record.dateString__c).getTime())?$F.parseDateTime("2005-11-15 17:00:00 "):$F.parseDateTime(context.record.dateString__c)
+ (!(context.record.dateString__c!=null) || Object.prototype.toString.call($F.parseDateTime(context.record.dateString__c)) !== '[object Date]') || isNaN($F.parseDateTime(context.record.dateString__c).getTime())?$F.parseDateTime("2005-11-15 17:00:00 "):$F.parseDateTime(context.record.dateString__c)
+
+ CASE WHEN NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$' THEN TO_TIMESTAMP('2005-11-15 17:00:00 ', 'YYYY-MM-DD HH24:MI:SS') ELSE TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') END
+ null
+
+
+ CASE WHEN NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$' THEN TO_TIMESTAMP('2005-11-15 17:00:00 ', 'YYYY-MM-DD HH24:MI:SS') ELSE TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorSqrt.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorSqrt.xml
new file mode 100644
index 00000000..705b2149
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorSqrt.xml
@@ -0,0 +1,15 @@
+
+
+ (isNaN($F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))))?new $F.Decimal('1').neg():$F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ (isNaN(Math.sqrt($F.nvl(context.record.customnumber1__c,0))))?(-1):Math.sqrt($F.nvl(context.record.customnumber1__c,0))
+ (!(context.record.customnumber1__c!=null) || isNaN(Math.sqrt(context.record.customnumber1__c)))?(-1):Math.sqrt(context.record.customnumber1__c)
+ (!(context.record.customnumber1__c!=null) || isNaN($F.Decimal.sqrt(context.record.customnumber1__c)))?new $F.Decimal('1').neg():$F.Decimal.sqrt(context.record.customnumber1__c)
+
+ CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)<0 THEN (-1) ELSE SQRT(COALESCE($!s0s!$.customnumber1__c, 0)) END
+ null
+
+
+ CASE WHEN $!s0s!$.customnumber1__c<0 THEN (-1) ELSE SQRT($!s0s!$.customnumber1__c) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorTextTimeValueWithValidInValid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorTextTimeValueWithValidInValid.xml
new file mode 100644
index 00000000..9c0937af
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfErrorTextTimeValueWithValidInValid.xml
@@ -0,0 +1,15 @@
+
+
+ !(context.record.dateString__c!=null)?null:new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).toISOString().substring(11,23)
+ !(context.record.dateString__c!=null)?null:new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).toISOString().substring(11,23)
+ !(context.record.dateString__c!=null)?null:new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).toISOString().substring(11,23)
+ !(context.record.dateString__c!=null)?null:new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).toISOString().substring(11,23)
+
+ CASE WHEN NOT $!s0s!$.dateString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$' THEN NULL ELSE LPAD(TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/3600000)::int::text,2,'0') || ':' || LPAD((TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/60000)::int % 60)::text,2,'0') || ':' || LPAD((TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/1000)::int % 60)::text,2,'0') || '.' || LPAD((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000::int % 1000)::text,3,'0') END
+ null
+
+
+ CASE WHEN NOT $!s0s!$.dateString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$' THEN NULL ELSE LPAD(TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/3600000)::int::text,2,'0') || ':' || LPAD((TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/60000)::int % 60)::text,2,'0') || ':' || LPAD((TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/1000)::int % 60)::text,2,'0') || '.' || LPAD((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000::int % 1000)::text,3,'0') END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfIf.xml
new file mode 100644
index 00000000..13fc2800
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfIf.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?true:false)?"true":"false")
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?true:false)?"true":"false")
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?true:false)?"true":"false")
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?true:false)?"true":"false")
+
+ CASE WHEN (CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN 1 ELSE 0 END) = 1 THEN 'true' ELSE 'false' END
+ null
+
+
+ CASE WHEN (CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN 1 ELSE 0 END) = 1 THEN 'true' ELSE 'false' END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNotNull.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNotNull.xml
new file mode 100644
index 00000000..210e206c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNotNull.xml
@@ -0,0 +1,15 @@
+
+
+ "False"
+ "False"
+ "False"
+ "False"
+
+ 'False'
+ null
+
+
+ 'False'
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNullElseIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNullElseIf.xml
new file mode 100644
index 00000000..c3488b4c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNullElseIf.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?true:null)?"true":"false")
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?true:null)?"true":"false")
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?true:null)?"true":"false")
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?true:null)?"true":"false")
+
+ CASE WHEN (CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN 1 ELSE 0 END) = 1 THEN 'true' ELSE 'false' END
+ null
+
+
+ CASE WHEN (CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN 1 ELSE 0 END) = 1 THEN 'true' ELSE 'false' END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNullNullIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNullNullIf.xml
new file mode 100644
index 00000000..438b1cba
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNullNullIf.xml
@@ -0,0 +1,7 @@
+
+
+ (((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?null:null))==(new $F.Decimal('0'))?"true":"false")
+ (((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?null:null))==(0)?"true":"false")
+ (((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?null:null))==(0)?"true":"false")
+ (((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?null:null))==(new $F.Decimal('0'))?"true":"false")
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNullThenIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNullThenIf.xml
new file mode 100644
index 00000000..c607de9b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNullThenIf.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?null:false)?"true":"false")
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?null:false)?"true":"false")
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?null:false)?"true":"false")
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?null:false)?"true":"false")
+
+ CASE WHEN (CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN 0 ELSE 0 END) = 1 THEN 'true' ELSE 'false' END
+ null
+
+
+ CASE WHEN (CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN 0 ELSE 0 END) = 1 THEN 'true' ELSE 'false' END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareEqual.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareEqual.xml
new file mode 100644
index 00000000..bbd8d954
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareEqual.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).eq($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))?context.record.customtext1__c:context.record.customphone1__c)
+ (($F.nvl(context.record.customnumber1__c,0))==($F.nvl(context.record.customcurrency1__c,0))?context.record.customtext1__c:context.record.customphone1__c)
+ ((context.record.customnumber1__c)==(context.record.customcurrency1__c)?context.record.customtext1__c:context.record.customphone1__c)
+ (context.record.customnumber1__c!=null&&context.record.customcurrency1__c!=null && ((context.record.customnumber1__c).eq(context.record.customcurrency1__c))?context.record.customtext1__c:context.record.customphone1__c)
+
+ CASE WHEN (COALESCE($!s0s!$.customnumber1__c, 0)=COALESCE($!s0s!$.customcurrency1__c, 0)) THEN $!s0s!$.customtext1__c ELSE $!s0s!$.customphone1__c END
+ null
+
+
+ CASE WHEN ($!s0s!$.customnumber1__c=$!s0s!$.customcurrency1__c) THEN $!s0s!$.customtext1__c ELSE $!s0s!$.customphone1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareGreater.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareGreater.xml
new file mode 100644
index 00000000..60326fc5
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareGreater.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).comparedTo($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))) > 0)?$F.nvl(context.record.customcurrency2__c,new $F.Decimal('0')):$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))
+ (($F.nvl(context.record.customnumber1__c,0)>$F.nvl(context.record.customcurrency1__c,0))?$F.nvl(context.record.customcurrency2__c,0):$F.nvl(context.record.customnumber2__c,0))
+ ((context.record.customnumber1__c!=null&&context.record.customcurrency1__c!=null?(context.record.customnumber1__c>context.record.customcurrency1__c):null)?context.record.customcurrency2__c:context.record.customnumber2__c)
+ ((context.record.customnumber1__c!=null&&context.record.customcurrency1__c!=null?(context.record.customnumber1__c.comparedTo(context.record.customcurrency1__c) > 0):null)?context.record.customcurrency2__c:context.record.customnumber2__c)
+
+ CASE WHEN (COALESCE($!s0s!$.customnumber1__c, 0)>COALESCE($!s0s!$.customcurrency1__c, 0)) THEN COALESCE($!s0s!$.customcurrency2__c, 0) ELSE COALESCE($!s0s!$.customnumber2__c, 0) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customnumber1__c>$!s0s!$.customcurrency1__c) THEN $!s0s!$.customcurrency2__c ELSE $!s0s!$.customnumber2__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareGreaterOrEqual.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareGreaterOrEqual.xml
new file mode 100644
index 00000000..2f6bd23b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareGreaterOrEqual.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')).comparedTo($F.nvl(context.record.customcurrency2__c,new $F.Decimal('0'))) >= 0)?$F.nvl(context.record.customcurrency3__c,new $F.Decimal('0')):$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ (($F.nvl(context.record.customcurrency1__c,0)>=$F.nvl(context.record.customcurrency2__c,0))?$F.nvl(context.record.customcurrency3__c,0):$F.nvl(context.record.customnumber1__c,0))
+ ((context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null?(context.record.customcurrency1__c>=context.record.customcurrency2__c):null)?context.record.customcurrency3__c:context.record.customnumber1__c)
+ ((context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null?(context.record.customcurrency1__c.comparedTo(context.record.customcurrency2__c) >= 0):null)?context.record.customcurrency3__c:context.record.customnumber1__c)
+
+ CASE WHEN (COALESCE($!s0s!$.customcurrency1__c, 0)>=COALESCE($!s0s!$.customcurrency2__c, 0)) THEN COALESCE($!s0s!$.customcurrency3__c, 0) ELSE COALESCE($!s0s!$.customnumber1__c, 0) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customcurrency1__c>=$!s0s!$.customcurrency2__c) THEN $!s0s!$.customcurrency3__c ELSE $!s0s!$.customnumber1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareLess.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareLess.xml
new file mode 100644
index 00000000..4e639a86
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareLess.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')).comparedTo($F.nvl(context.record.customcurrency2__c,new $F.Decimal('0'))) < 0)?$F.nvl(context.record.customcurrency3__c,new $F.Decimal('0')):$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ (($F.nvl(context.record.customcurrency1__c,0)<$F.nvl(context.record.customcurrency2__c,0))?$F.nvl(context.record.customcurrency3__c,0):$F.nvl(context.record.customnumber1__c,0))
+ ((context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null?(context.record.customcurrency1__c<context.record.customcurrency2__c):null)?context.record.customcurrency3__c:context.record.customnumber1__c)
+ ((context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null?(context.record.customcurrency1__c.comparedTo(context.record.customcurrency2__c) < 0):null)?context.record.customcurrency3__c:context.record.customnumber1__c)
+
+ CASE WHEN (COALESCE($!s0s!$.customcurrency1__c, 0)<COALESCE($!s0s!$.customcurrency2__c, 0)) THEN COALESCE($!s0s!$.customcurrency3__c, 0) ELSE COALESCE($!s0s!$.customnumber1__c, 0) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customcurrency1__c<$!s0s!$.customcurrency2__c) THEN $!s0s!$.customcurrency3__c ELSE $!s0s!$.customnumber1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareLessOrEqual.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareLessOrEqual.xml
new file mode 100644
index 00000000..a28f9cd6
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareLessOrEqual.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')).comparedTo($F.nvl(context.record.customcurrency2__c,new $F.Decimal('0'))) <= 0)?$F.nvl(context.record.customcurrency3__c,new $F.Decimal('0')):$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ (($F.nvl(context.record.customcurrency1__c,0)<=$F.nvl(context.record.customcurrency2__c,0))?$F.nvl(context.record.customcurrency3__c,0):$F.nvl(context.record.customnumber1__c,0))
+ ((context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null?(context.record.customcurrency1__c<=context.record.customcurrency2__c):null)?context.record.customcurrency3__c:context.record.customnumber1__c)
+ ((context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null?(context.record.customcurrency1__c.comparedTo(context.record.customcurrency2__c) <= 0):null)?context.record.customcurrency3__c:context.record.customnumber1__c)
+
+ CASE WHEN (COALESCE($!s0s!$.customcurrency1__c, 0)<=COALESCE($!s0s!$.customcurrency2__c, 0)) THEN COALESCE($!s0s!$.customcurrency3__c, 0) ELSE COALESCE($!s0s!$.customnumber1__c, 0) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customcurrency1__c<=$!s0s!$.customcurrency2__c) THEN $!s0s!$.customcurrency3__c ELSE $!s0s!$.customnumber1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareNotEqual.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareNotEqual.xml
new file mode 100644
index 00000000..7974e6a7
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumCompareNotEqual.xml
@@ -0,0 +1,15 @@
+
+
+ ((!($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))).eq($F.nvl(context.record.customcurrency2__c,new $F.Decimal('0'))))?$F.nvl(context.record.customcurrency3__c,new $F.Decimal('0')):$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ (($F.nvl(context.record.customcurrency1__c,0))!=($F.nvl(context.record.customcurrency2__c,0))?$F.nvl(context.record.customcurrency3__c,0):$F.nvl(context.record.customnumber1__c,0))
+ ((context.record.customcurrency1__c)!=(context.record.customcurrency2__c)?context.record.customcurrency3__c:context.record.customnumber1__c)
+ ((!(context.record.customcurrency1__c).eq(context.record.customcurrency2__c))?context.record.customcurrency3__c:context.record.customnumber1__c)
+
+ CASE WHEN (COALESCE($!s0s!$.customcurrency1__c, 0)<>COALESCE($!s0s!$.customcurrency2__c, 0)) THEN COALESCE($!s0s!$.customcurrency3__c, 0) ELSE COALESCE($!s0s!$.customnumber1__c, 0) END
+ null
+
+
+ CASE WHEN ($!s0s!$.customcurrency1__c<>$!s0s!$.customcurrency2__c) THEN $!s0s!$.customcurrency3__c ELSE $!s0s!$.customnumber1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumIf.xml
new file mode 100644
index 00000000..75a3a163
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumIf.xml
@@ -0,0 +1,15 @@
+
+
+ (((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?new $F.Decimal('1'):new $F.Decimal('2'))).eq(new $F.Decimal('1'))?"true":"false")
+ (((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?1:2))==(1)?"true":"false")
+ (((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?1:2))==(1)?"true":"false")
+ (((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?new $F.Decimal('1'):new $F.Decimal('2'))).eq(new $F.Decimal('1'))?"true":"false")
+
+ CASE WHEN (CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN 1 ELSE 2 END=1) THEN 'true' ELSE 'false' END
+ null
+
+
+ CASE WHEN (CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN 1 ELSE 2 END=1) THEN 'true' ELSE 'false' END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumNullIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumNullIf.xml
new file mode 100644
index 00000000..0cb010e4
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfNumNullIf.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?new $F.Decimal('1'):null)!=null && (((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?new $F.Decimal('1'):null)).eq(new $F.Decimal('1')))?"true":"false")
+ (((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?1:null))==(1)?"true":"false")
+ (((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?1:null))==(1)?"true":"false")
+ ((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?new $F.Decimal('1'):null)!=null && (((($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?new $F.Decimal('1'):null)).eq(new $F.Decimal('1')))?"true":"false")
+
+ CASE WHEN (CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN 1 ELSE CAST(NULL AS DECIMAL(38,18)) END=1) THEN 'true' ELSE 'false' END
+ null
+
+
+ CASE WHEN (CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN 1 ELSE CAST(NULL AS DECIMAL(38,18)) END=1) THEN 'true' ELSE 'false' END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfORFunc.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfORFunc.xml
new file mode 100644
index 00000000..6893f326
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfORFunc.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false)?(context.record.customcheckbox3__c?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):new Date(Date.UTC($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber(),$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toNumber()-1,$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')).toNumber())))
+ ($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false)?(context.record.customcheckbox3__c?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):new Date(Date.UTC($F.nvl(context.record.customnumber1__c,0),$F.nvl(context.record.customnumber2__c,0)-1,$F.nvl(context.record.customnumber3__c,0))))
+ ($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false)?(context.record.customcheckbox3__c?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):(context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber3__c!=null?(new Date(Date.UTC(context.record.customnumber1__c,context.record.customnumber2__c-1,context.record.customnumber3__c))):null))
+ ($F.nvl((context.record.customcheckbox1__c)||(context.record.customcheckbox2__c),false)?(context.record.customcheckbox3__c?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))):(context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber3__c!=null?(new Date(Date.UTC(context.record.customnumber1__c.toNumber(),context.record.customnumber2__c.toNumber()-1,context.record.customnumber3__c.toNumber()))):null))
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfOrNull.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfOrNull.xml
new file mode 100644
index 00000000..12150b80
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfOrNull.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(($F.nvl((null)||(context.record.customcheckbox1__c),false)?"T":"F"),'')+$F.nvl(($F.nvl((context.record.customcheckbox1__c)||(null),false)?"T":"F"),'')
+ $F.nvl(($F.nvl((null)||(context.record.customcheckbox1__c),false)?"T":"F"),'')+$F.nvl(($F.nvl((context.record.customcheckbox1__c)||(null),false)?"T":"F"),'')
+ $F.nvl(($F.nvl((null)||(context.record.customcheckbox1__c),false)?"T":"F"),'')+$F.nvl(($F.nvl((context.record.customcheckbox1__c)||(null),false)?"T":"F"),'')
+ $F.nvl(($F.nvl((null)||(context.record.customcheckbox1__c),false)?"T":"F"),'')+$F.nvl(($F.nvl((context.record.customcheckbox1__c)||(null),false)?"T":"F"),'')
+
+ CONCAT(CASE WHEN ((1=0) OR (COALESCE($!s0s!$.customcheckbox1__c, '0') = '1')) THEN 'T' ELSE 'F' END, CASE WHEN ((COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') OR (1=0)) THEN 'T' ELSE 'F' END)
+ null
+
+
+ CONCAT(CASE WHEN ((1=0) OR (COALESCE($!s0s!$.customcheckbox1__c, '0') = '1')) THEN 'T' ELSE 'F' END, CASE WHEN ((COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') OR (1=0)) THEN 'T' ELSE 'F' END)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfReturningNullForDateTimeType.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfReturningNullForDateTimeType.xml
new file mode 100644
index 00000000..55f6abe0
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfReturningNullForDateTimeType.xml
@@ -0,0 +1,15 @@
+
+
+ null
+ null
+ null
+ null
+
+ NULL
+ null
+
+
+ NULL
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfReturningNullForDateType.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfReturningNullForDateType.xml
new file mode 100644
index 00000000..360705a0
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfReturningNullForDateType.xml
@@ -0,0 +1,7 @@
+
+
+ null
+ null
+ null
+ null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfReturningNullForNumericType.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfReturningNullForNumericType.xml
new file mode 100644
index 00000000..59edd66e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfReturningNullForNumericType.xml
@@ -0,0 +1,15 @@
+
+
+ null
+ null
+ null
+ null
+
+ NULL
+ null
+
+
+ NULL
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareEqualReturnDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareEqualReturnDate.xml
new file mode 100644
index 00000000..0317665f
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareEqualReturnDate.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customemail1__c])?null:context.record.customemail1__c),'')+'x'))==($F.noe(($F.anl([context.record.customemail1__c])?null:context.record.customemail1__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):(($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?((new Date(($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()+86400000*(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))|0)))):null))
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customemail1__c])?null:context.record.customemail1__c),'')+'x'))==($F.noe(($F.anl([context.record.customemail1__c])?null:context.record.customemail1__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):(($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null?((new Date(($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()+86400000*(($F.nvl(context.record.customnumber1__c,0))|0)))):null))
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customemail1__c])?null:context.record.customemail1__c),'')+'x'))==($F.noe(($F.anl([context.record.customemail1__c])?null:context.record.customemail1__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):(($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null&&context.record.customnumber1__c!=null?((new Date(($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()+86400000*((context.record.customnumber1__c)|0)))):null))
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customemail1__c])?null:context.record.customemail1__c),'')+'x'))==($F.noe(($F.anl([context.record.customemail1__c])?null:context.record.customemail1__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))):(($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null&&context.record.customnumber1__c!=null?((new Date(($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime()+86400000*((context.record.customnumber1__c)|0)))):null))
+
+ CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customemail1__c, 'x'))=COALESCE($!s0s!$.customemail1__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE(DATE_TRUNC('second', ($!s0s!$.customdate2__c+(INTERVAL '1 second'*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0))*86400.0)))::timestamp,CAST(NULL AS DATE)) END
+ null
+
+
+ CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customemail1__c, 'x'))=COALESCE($!s0s!$.customemail1__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE(DATE_TRUNC('second', ($!s0s!$.customdate2__c+(INTERVAL '1 second'*TRUNC($!s0s!$.customnumber1__c)*86400.0)))::timestamp,CAST(NULL AS DATE)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareEqualReturnDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareEqualReturnDateTime.xml
new file mode 100644
index 00000000..349bb4b4
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareEqualReturnDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.noe(($F.anl([context.record.customphone1__c])?null:context.record.customphone1__c),$F.nvl(($F.anl([context.record.customphone2__c])?null:context.record.customphone2__c),'')+'x'))==($F.noe(($F.anl([context.record.customphone2__c])?null:context.record.customphone2__c),$F.nvl(($F.anl([context.record.customphone1__c])?null:context.record.customphone1__c),'')+'x'))?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))))*1000)))):null):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ (($F.noe(($F.anl([context.record.customphone1__c])?null:context.record.customphone1__c),$F.nvl(($F.anl([context.record.customphone2__c])?null:context.record.customphone2__c),'')+'x'))==($F.noe(($F.anl([context.record.customphone2__c])?null:context.record.customphone2__c),$F.nvl(($F.anl([context.record.customphone1__c])?null:context.record.customphone1__c),'')+'x'))?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*($F.nvl(context.record.customcurrency1__c,0)))*1000)))):null):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ (($F.noe(($F.anl([context.record.customphone1__c])?null:context.record.customphone1__c),$F.nvl(($F.anl([context.record.customphone2__c])?null:context.record.customphone2__c),'')+'x'))==($F.noe(($F.anl([context.record.customphone2__c])?null:context.record.customphone2__c),$F.nvl(($F.anl([context.record.customphone1__c])?null:context.record.customphone1__c),'')+'x'))?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customcurrency1__c!=null?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*(context.record.customcurrency1__c))*1000)))):null):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ (($F.noe(($F.anl([context.record.customphone1__c])?null:context.record.customphone1__c),$F.nvl(($F.anl([context.record.customphone2__c])?null:context.record.customphone2__c),'')+'x'))==($F.noe(($F.anl([context.record.customphone2__c])?null:context.record.customphone2__c),$F.nvl(($F.anl([context.record.customphone1__c])?null:context.record.customphone1__c),'')+'x'))?(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customcurrency1__c!=null?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*(context.record.customcurrency1__c))*1000)))):null):($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+
+ CASE WHEN (COALESCE($!s0s!$.customphone1__c, CONCAT($!s0s!$.customphone2__c, 'x'))=COALESCE($!s0s!$.customphone2__c, CONCAT($!s0s!$.customphone1__c, 'x'))) THEN COALESCE(DATE_TRUNC('second', ($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*COALESCE($!s0s!$.customcurrency1__c, 0)*86400.0)))::timestamp,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END
+ null
+
+
+ CASE WHEN (COALESCE($!s0s!$.customphone1__c, CONCAT($!s0s!$.customphone2__c, 'x'))=COALESCE($!s0s!$.customphone2__c, CONCAT($!s0s!$.customphone1__c, 'x'))) THEN COALESCE(DATE_TRUNC('second', ($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*$!s0s!$.customcurrency1__c*86400.0)))::timestamp,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareEqualReturnNum.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareEqualReturnNum.xml
new file mode 100644
index 00000000..0a36f7ea
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareEqualReturnNum.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')):$F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')))
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?$F.nvl(context.record.customnumber1__c,0):$F.nvl(context.record.customcurrency1__c,0))
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?context.record.customnumber1__c:context.record.customcurrency1__c)
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?context.record.customnumber1__c:context.record.customcurrency1__c)
+
+ CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN COALESCE($!s0s!$.customnumber1__c, 0) ELSE COALESCE($!s0s!$.customcurrency1__c, 0) END
+ null
+
+
+ CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN $!s0s!$.customnumber1__c ELSE $!s0s!$.customcurrency1__c END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareEqualReturnText.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareEqualReturnText.xml
new file mode 100644
index 00000000..d5d4e969
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareEqualReturnText.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?"true":"false")
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?"true":"false")
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?"true":"false")
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))==($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?"true":"false")
+
+ CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN 'true' ELSE 'false' END
+ null
+
+
+ CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))=COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN 'true' ELSE 'false' END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareGreaterEqual.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareGreaterEqual.xml
new file mode 100644
index 00000000..cfe0cc9d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareGreaterEqual.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c>=context.record.text2__c):false)
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c>=context.record.text2__c):false)
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c>=context.record.text2__c):false)
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c>=context.record.text2__c):false)
+
+ (($!s0s!$.text1__c COLLATE "POSIX")>=($!s0s!$.text2__c COLLATE "POSIX"))
+ null
+
+
+ (($!s0s!$.text1__c COLLATE "POSIX")>=($!s0s!$.text2__c COLLATE "POSIX"))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareGreaterThan.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareGreaterThan.xml
new file mode 100644
index 00000000..603365cf
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareGreaterThan.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c>context.record.text2__c):false)
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c>context.record.text2__c):false)
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c>context.record.text2__c):false)
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c>context.record.text2__c):false)
+
+ (($!s0s!$.text1__c COLLATE "POSIX")>($!s0s!$.text2__c COLLATE "POSIX"))
+ null
+
+
+ (($!s0s!$.text1__c COLLATE "POSIX")>($!s0s!$.text2__c COLLATE "POSIX"))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareLessEqual.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareLessEqual.xml
new file mode 100644
index 00000000..28575fc2
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareLessEqual.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c<=context.record.text2__c):false)
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c<=context.record.text2__c):false)
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c<=context.record.text2__c):false)
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c<=context.record.text2__c):false)
+
+ (($!s0s!$.text1__c COLLATE "POSIX")<=($!s0s!$.text2__c COLLATE "POSIX"))
+ null
+
+
+ (($!s0s!$.text1__c COLLATE "POSIX")<=($!s0s!$.text2__c COLLATE "POSIX"))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareLessThan.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareLessThan.xml
new file mode 100644
index 00000000..4554da4a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareLessThan.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c<context.record.text2__c):false)
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c<context.record.text2__c):false)
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c<context.record.text2__c):false)
+ (context.record.text1__c!=null&&context.record.text2__c!=null?(context.record.text1__c<context.record.text2__c):false)
+
+ (($!s0s!$.text1__c COLLATE "POSIX")<($!s0s!$.text2__c COLLATE "POSIX"))
+ null
+
+
+ (($!s0s!$.text1__c COLLATE "POSIX")<($!s0s!$.text2__c COLLATE "POSIX"))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareNotEqualReturnNum.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareNotEqualReturnNum.xml
new file mode 100644
index 00000000..0ea9861c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfTextCompareNotEqualReturnNum.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))!=($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')))
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))!=($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?$F.nvl(context.record.customnumber1__c,0):$F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))!=($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?context.record.customnumber1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c/100.0):null))
+ (($F.noe(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),$F.nvl(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),'')+'x'))!=($F.noe(($F.anl([context.record.customtext2__c])?null:context.record.customtext2__c),$F.nvl(($F.anl([context.record.customtext1__c])?null:context.record.customtext1__c),'')+'x'))?context.record.customnumber1__c:(context.record.custompercent1__c!=null?(context.record.custompercent1__c.div(100)):null))
+
+ CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))<>COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN COALESCE($!s0s!$.customnumber1__c, 0) ELSE COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) END
+ null
+
+
+ CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customtext2__c, 'x'))<>COALESCE($!s0s!$.customtext2__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN $!s0s!$.customnumber1__c ELSE ($!s0s!$.custompercent1__c / 100.0) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfUsesFalse.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfUsesFalse.xml
new file mode 100644
index 00000000..efa5a146
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfUsesFalse.xml
@@ -0,0 +1,15 @@
+
+
+ new $F.Decimal('0')
+ 0
+ 0
+ new $F.Decimal('0')
+
+ 0
+ null
+
+
+ 0
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfUsesTrue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfUsesTrue.xml
new file mode 100644
index 00000000..0644e9de
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIfUsesTrue.xml
@@ -0,0 +1,15 @@
+
+
+ new $F.Decimal('1')
+ 1
+ 1
+ new $F.Decimal('1')
+
+ 1
+ null
+
+
+ 1
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2Date.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2Date.xml
new file mode 100644
index 00000000..b4b9fec2
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2Date.xml
@@ -0,0 +1,15 @@
+
+
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0))).getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0))).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0))).getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0))).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0))).getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0))).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0))).getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0))).getTime()))>=0)
+
+ $!s0s!$.customdate__c IN ($!s0s!$.customin1__c)
+ null
+
+
+ $!s0s!$.customdate__c IN ($!s0s!$.customin1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateNull.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateNull.xml
new file mode 100644
index 00000000..d1c3cebb
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateNull.xml
@@ -0,0 +1,15 @@
+
+
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0))).getTime()),(null)].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0))).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0))).getTime()),(null)].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0))).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0))).getTime()),(null)].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0))).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0))).getTime()),(null)].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0))).getTime()))>=0)
+
+ $!s0s!$.customdate__c IN ($!s0s!$.customin1__c,NULL)
+ null
+
+
+ $!s0s!$.customdate__c IN ($!s0s!$.customin1__c,NULL)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateNullConst.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateNullConst.xml
new file mode 100644
index 00000000..dc9b4e88
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateNullConst.xml
@@ -0,0 +1,15 @@
+
+
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0))).getTime()),(new Date(Date.UTC(new $F.Decimal('2004').toNumber(),new $F.Decimal('2').toNumber()-1,new $F.Decimal('28').toNumber())).getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0))).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0))).getTime()),(new Date(Date.UTC(2004,2-1,28)).getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0))).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0))).getTime()),(new Date(Date.UTC(2004,2-1,28)).getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0))).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customin1__c])?null:new Date(new Date(context.record.customin1__c).setUTCHours(0,0,0,0))).getTime()),(new Date(Date.UTC(new $F.Decimal('2004').toNumber(),new $F.Decimal('2').toNumber()-1,new $F.Decimal('28').toNumber())).getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate__c])?null:new Date(new Date(context.record.customdate__c).setUTCHours(0,0,0,0))).getTime()))>=0)
+
+ $!s0s!$.customdate__c IN ($!s0s!$.customin1__c,TO_DATE((2004) || '-' || LEAST(GREATEST((2)::int, 1), 12) || '-' || LEAST(GREATEST((28)::int, 1), 31), 'YYYY-MM-DD'))
+ null
+
+
+ $!s0s!$.customdate__c IN ($!s0s!$.customin1__c,TO_DATE((2004) || '-' || LEAST(GREATEST((2)::int, 1), 12) || '-' || LEAST(GREATEST((28)::int, 1), 31), 'YYYY-MM-DD'))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateTime.xml
new file mode 100644
index 00000000..ab78e6d8
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateTime.xml
@@ -0,0 +1,15 @@
+
+
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c))])?null:($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c)).getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c))])?null:($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c)).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c))])?null:($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c)).getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c))])?null:($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c)).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c))])?null:($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c)).getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c))])?null:($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c)).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c))])?null:($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c)).getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c))])?null:($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c)).getTime()))>=0)
+
+ $!s0s!$.customdate__c IN ($!s0s!$.customin1__c)
+ null
+
+
+ $!s0s!$.customdate__c IN ($!s0s!$.customin1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateTimeConst.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateTimeConst.xml
new file mode 100644
index 00000000..5da70232
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateTimeConst.xml
@@ -0,0 +1,15 @@
+
+
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c))])?null:($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c)).getTime()),($F.parseDateTime("2004-02-28 11:00:00").getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c))])?null:($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c)).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c))])?null:($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c)).getTime()),($F.parseDateTime("2004-02-28 11:00:00").getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c))])?null:($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c)).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c))])?null:($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c)).getTime()),($F.parseDateTime("2004-02-28 11:00:00").getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c))])?null:($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c)).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c))])?null:($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c)).getTime()),($F.parseDateTime("2004-02-28 11:00:00").getTime())].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c))])?null:($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c)).getTime()))>=0)
+
+ $!s0s!$.customdate__c IN ($!s0s!$.customin1__c,TO_TIMESTAMP('2004-02-28 11:00:00', 'YYYY-MM-DD HH24:MI:SS'))
+ null
+
+
+ $!s0s!$.customdate__c IN ($!s0s!$.customin1__c,TO_TIMESTAMP('2004-02-28 11:00:00', 'YYYY-MM-DD HH24:MI:SS'))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateTimeNull.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateTimeNull.xml
new file mode 100644
index 00000000..11c98fd3
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2DateTimeNull.xml
@@ -0,0 +1,15 @@
+
+
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c))])?null:($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c)).getTime()),(null)].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c))])?null:($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c)).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c))])?null:($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c)).getTime()),(null)].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c))])?null:($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c)).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c))])?null:($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c)).getTime()),(null)].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c))])?null:($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c)).getTime()))>=0)
+ ([($F.anl([($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c))])?null:($F.anl([context.record.customin1__c])?null:$F.parseDateTime(context.record.customin1__c)).getTime()),(null)].filter(e=>e!=null).indexOf(($F.anl([($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c))])?null:($F.anl([context.record.customdate__c])?null:$F.parseDateTime(context.record.customdate__c)).getTime()))>=0)
+
+ $!s0s!$.customdate__c IN ($!s0s!$.customin1__c,NULL)
+ null
+
+
+ $!s0s!$.customdate__c IN ($!s0s!$.customin1__c,NULL)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2Num.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2Num.xml
new file mode 100644
index 00000000..6d1a10b3
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2Num.xml
@@ -0,0 +1,15 @@
+
+
+ ([($F.nvl(context.record.customin1__c,new $F.Decimal('0')).toNumber())].filter(e=>e!=null).indexOf(($F.nvl(context.record.customnum__c,new $F.Decimal('0')).toNumber()))>=0)
+ ([$F.nvl(context.record.customin1__c,0)].filter(e=>e!=null).indexOf($F.nvl(context.record.customnum__c,0))>=0)
+ ([context.record.customin1__c].filter(e=>e!=null).indexOf(context.record.customnum__c)>=0)
+ ([($F.anl([context.record.customin1__c])?null:context.record.customin1__c.toNumber())].filter(e=>e!=null).indexOf(($F.anl([context.record.customnum__c])?null:context.record.customnum__c.toNumber()))>=0)
+
+ COALESCE($!s0s!$.customnum__c, 0) IN (COALESCE($!s0s!$.customin1__c, 0))
+ null
+
+
+ $!s0s!$.customnum__c IN ($!s0s!$.customin1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2NumNull.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2NumNull.xml
new file mode 100644
index 00000000..679bef50
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2NumNull.xml
@@ -0,0 +1,15 @@
+
+
+ ([($F.nvl(context.record.customin1__c,new $F.Decimal('0')).toNumber()),(null)].filter(e=>e!=null).indexOf(($F.nvl(context.record.customnum__c,new $F.Decimal('0')).toNumber()))>=0)
+ ([$F.nvl(context.record.customin1__c,0),null].filter(e=>e!=null).indexOf($F.nvl(context.record.customnum__c,0))>=0)
+ ([context.record.customin1__c,null].filter(e=>e!=null).indexOf(context.record.customnum__c)>=0)
+ ([($F.anl([context.record.customin1__c])?null:context.record.customin1__c.toNumber()),(null)].filter(e=>e!=null).indexOf(($F.anl([context.record.customnum__c])?null:context.record.customnum__c.toNumber()))>=0)
+
+ COALESCE($!s0s!$.customnum__c, 0) IN (COALESCE($!s0s!$.customin1__c, 0),NULL)
+ null
+
+
+ $!s0s!$.customnum__c IN ($!s0s!$.customin1__c,NULL)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2Text.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2Text.xml
new file mode 100644
index 00000000..e501bfdc
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2Text.xml
@@ -0,0 +1,15 @@
+
+
+ ([context.record.customin1__c].filter(e=>e!=null).indexOf(context.record.customtext__c)>=0)
+ ([context.record.customin1__c].filter(e=>e!=null).indexOf(context.record.customtext__c)>=0)
+ ([context.record.customin1__c].filter(e=>e!=null).indexOf(context.record.customtext__c)>=0)
+ ([context.record.customin1__c].filter(e=>e!=null).indexOf(context.record.customtext__c)>=0)
+
+ $!s0s!$.customtext__c IN ($!s0s!$.customin1__c)
+ null
+
+
+ $!s0s!$.customtext__c IN ($!s0s!$.customin1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2TextFoo.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2TextFoo.xml
new file mode 100644
index 00000000..b3c0bc49
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2TextFoo.xml
@@ -0,0 +1,15 @@
+
+
+ ([context.record.customin1__c,"Foo"].filter(e=>e!=null).indexOf(context.record.customtext__c)>=0)
+ ([context.record.customin1__c,"Foo"].filter(e=>e!=null).indexOf(context.record.customtext__c)>=0)
+ ([context.record.customin1__c,"Foo"].filter(e=>e!=null).indexOf(context.record.customtext__c)>=0)
+ ([context.record.customin1__c,"Foo"].filter(e=>e!=null).indexOf(context.record.customtext__c)>=0)
+
+ $!s0s!$.customtext__c IN ($!s0s!$.customin1__c,'Foo')
+ null
+
+
+ $!s0s!$.customtext__c IN ($!s0s!$.customin1__c,'Foo')
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2TextNull.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2TextNull.xml
new file mode 100644
index 00000000..d8e10caa
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIn2TextNull.xml
@@ -0,0 +1,15 @@
+
+
+ ([context.record.customin1__c,null].filter(e=>e!=null).indexOf(context.record.customtext__c)>=0)
+ ([context.record.customin1__c,null].filter(e=>e!=null).indexOf(context.record.customtext__c)>=0)
+ ([context.record.customin1__c,null].filter(e=>e!=null).indexOf(context.record.customtext__c)>=0)
+ ([context.record.customin1__c,null].filter(e=>e!=null).indexOf(context.record.customtext__c)>=0)
+
+ $!s0s!$.customtext__c IN ($!s0s!$.customin1__c,NULL)
+ null
+
+
+ $!s0s!$.customtext__c IN ($!s0s!$.customin1__c,NULL)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testInitCap.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testInitCap.xml
new file mode 100644
index 00000000..ed767074
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testInitCap.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null)?($F.initcap(context.record.customtext1__c)):null
+ (context.record.customtext1__c!=null)?($F.initcap(context.record.customtext1__c)):null
+ (context.record.customtext1__c!=null)?($F.initcap(context.record.customtext1__c)):null
+ (context.record.customtext1__c!=null)?($F.initcap(context.record.customtext1__c)):null
+
+ INITCAP($!s0s!$.customtext1__c COLLATE "en_US")
+ null
+
+
+ INITCAP($!s0s!$.customtext1__c COLLATE "en_US")
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIsoWeekWithDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIsoWeekWithDate.xml
new file mode 100644
index 00000000..26197df1
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIsoWeekWithDate.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?((new $F.Decimal($F.isoweek(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?($F.isoweek(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?($F.isoweek(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?((new $F.Decimal($F.isoweek(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))))):null
+
+ CAST(TO_CHAR($!s0s!$.customdate1__c, 'IW') AS NUMERIC)
+ null
+
+
+ CAST(TO_CHAR($!s0s!$.customdate1__c, 'IW') AS NUMERIC)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIsoWeekWithDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIsoWeekWithDateTime.xml
new file mode 100644
index 00000000..a275a1ad
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIsoWeekWithDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?((new $F.Decimal($F.isoweek($F.parseDateTime(context.record.dateString__c))))):null
+ (context.record.dateString__c!=null)?($F.isoweek($F.parseDateTime(context.record.dateString__c))):null
+ (context.record.dateString__c!=null)?($F.isoweek($F.parseDateTime(context.record.dateString__c))):null
+ (context.record.dateString__c!=null)?((new $F.Decimal($F.isoweek($F.parseDateTime(context.record.dateString__c))))):null
+
+ CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS'), 'IW') AS NUMERIC)
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
+ CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS'), 'IW') AS NUMERIC)
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIsoYearWithDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIsoYearWithDate.xml
new file mode 100644
index 00000000..869b3507
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIsoYearWithDate.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?((new $F.Decimal($F.isoyear(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?($F.isoyear(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?($F.isoyear(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?((new $F.Decimal($F.isoyear(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))))))):null
+
+ CAST(TO_CHAR($!s0s!$.customdate1__c, 'IYYY') AS NUMERIC)
+ null
+
+
+ CAST(TO_CHAR($!s0s!$.customdate1__c, 'IYYY') AS NUMERIC)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIsoYearWithDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIsoYearWithDateTime.xml
new file mode 100644
index 00000000..0bef0a91
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testIsoYearWithDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?((new $F.Decimal($F.isoyear($F.parseDateTime(context.record.dateString__c))))):null
+ (context.record.dateString__c!=null)?($F.isoyear($F.parseDateTime(context.record.dateString__c))):null
+ (context.record.dateString__c!=null)?($F.isoyear($F.parseDateTime(context.record.dateString__c))):null
+ (context.record.dateString__c!=null)?((new $F.Decimal($F.isoyear($F.parseDateTime(context.record.dateString__c))))):null
+
+ CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS'), 'IYYY') AS NUMERIC)
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
+ CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS'), 'IYYY') AS NUMERIC)
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testJsonPathValue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testJsonPathValue.xml
new file mode 100644
index 00000000..92e4872a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testJsonPathValue.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customjson__c!=null)?(typeof $F==='undefined'?undefined:(String($F.jsonPath(JSON.parse(context.record.customjson__c),"$.Temperature")||''))):null
+ (context.record.customjson__c!=null)?(typeof $F==='undefined'?undefined:(String($F.jsonPath(JSON.parse(context.record.customjson__c),"$.Temperature")||''))):null
+ (context.record.customjson__c!=null)?(typeof $F==='undefined'?undefined:(String($F.jsonPath(JSON.parse(context.record.customjson__c),"$.Temperature")||''))):null
+ (context.record.customjson__c!=null)?(typeof $F==='undefined'?undefined:(String($F.jsonPath(JSON.parse(context.record.customjson__c),"$.Temperature")||''))):null
+
+ (jsonb_path_query($!s0s!$.customjson__c::jsonb,'$.Temperature') #>> '{}')
+ null
+
+
+ (jsonb_path_query($!s0s!$.customjson__c::jsonb,'$.Temperature') #>> '{}')
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testJsonValue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testJsonValue.xml
new file mode 100644
index 00000000..5d8e96c9
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testJsonValue.xml
@@ -0,0 +1,15 @@
+
+
+ $F.tostr(JSON.parse(context.record.customjson__c||'{}')["Temperature"])
+ $F.tostr(JSON.parse(context.record.customjson__c||'{}')["Temperature"])
+ $F.tostr(JSON.parse(context.record.customjson__c||'{}')["Temperature"])
+ $F.tostr(JSON.parse(context.record.customjson__c||'{}')["Temperature"])
+
+ json_extract_path_text($!s0s!$.customjson__c::json,'Temperature')
+ null
+
+
+ json_extract_path_text($!s0s!$.customjson__c::json,'Temperature')
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNSimple.xml
new file mode 100644
index 00000000..725971c4
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNSimple.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln()
+ Math.log($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.log(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c).ln()):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesAbs.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesAbs.xml
new file mode 100644
index 00000000..c0994c8e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesAbs.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs()).ln()
+ Math.log(Math.abs($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(Math.log(Math.abs(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c.abs()).ln()):null
+
+ LN(ABS(COALESCE($!s0s!$.customnumber1__c, 0)))
+ ABS(COALESCE($!s0s!$.customnumber1__c, 0))<=0
+
+
+ LN(ABS($!s0s!$.customnumber1__c))
+ ABS($!s0s!$.customnumber1__c)<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesCase.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesCase.xml
new file mode 100644
index 00000000..39bf9a58
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesCase.xml
@@ -0,0 +1,15 @@
+
+
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')))).ln()
+ Math.log(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0)))
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null)?(Math.log(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c))):null
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null)?((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)).ln()):null
+
+ LN(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END)
+ CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END<=0
+
+
+ LN(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END)
+ CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesCeil.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesCeil.xml
new file mode 100644
index 00000000..71d73855
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesCeil.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor())).ln()
+ Math.log((($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(Math.log(((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor())).ln()):null
+
+ LN(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END)
+ CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END<=0
+
+
+ LN(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END)
+ CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesFloor.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesFloor.xml
new file mode 100644
index 00000000..2cbe4199
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesFloor.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil())).ln()
+ Math.log((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(Math.log(((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil())).ln()):null
+
+ LN(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END)
+ CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END<=0
+
+
+ LN(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END)
+ CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesIf.xml
new file mode 100644
index 00000000..faf472a3
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesIf.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).ln()
+ Math.log($F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber2__c!=null)?(Math.log(context.record.customnumber2__c)):null
+ (context.record.customnumber2__c!=null)?((context.record.customnumber2__c).ln()):null
+
+ LN(COALESCE($!s0s!$.customnumber2__c, 0))
+ COALESCE($!s0s!$.customnumber2__c, 0)<=0
+
+
+ LN($!s0s!$.customnumber2__c)
+ $!s0s!$.customnumber2__c<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesLen.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesLen.xml
new file mode 100644
index 00000000..47610170
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesLen.xml
@@ -0,0 +1,15 @@
+
+
+ ((new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length)))).ln()
+ Math.log(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length))
+ Math.log(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length))
+ ((new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length)))).ln()
+
+ LN(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric)
+ COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric<=0
+
+
+ LN(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric)
+ COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesLn.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesLn.xml
new file mode 100644
index 00000000..7fc74445
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesLn.xml
@@ -0,0 +1,7 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln()).ln()
+ Math.log(Math.log($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(Math.log(Math.log(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c).ln()).ln()):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesLog.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesLog.xml
new file mode 100644
index 00000000..a4dbb7f9
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesLog.xml
@@ -0,0 +1,7 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10)).ln()
+ Math.log(Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10)
+ (context.record.customnumber1__c!=null)?(Math.log(Math.log(context.record.customnumber1__c)/Math.LN10)):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c).log(10)).ln()):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesMOD.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesMOD.xml
new file mode 100644
index 00000000..f04af9e3
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesMOD.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))).ln()
+ Math.log((($F.nvl(context.record.customnumber1__c,0))%($F.nvl(context.record.customnumber2__c,0))))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.log(((context.record.customnumber1__c)%(context.record.customnumber2__c)))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c.mod(context.record.customnumber2__c)).ln()):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesPlus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesPlus.xml
new file mode 100644
index 00000000..d428ed0b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesPlus.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).add($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))))).ln()
+ Math.log(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)+$F.nvl(context.record.customcurrency1__c,0)))
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customcurrency1__c!=null)?(Math.log((context.record.custompercent1__c/100.0+context.record.customcurrency1__c))):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customcurrency1__c!=null)?(((context.record.custompercent1__c.div(100).add(context.record.customcurrency1__c))).ln()):null
+
+ LN((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)+COALESCE($!s0s!$.customcurrency1__c, 0)))
+ (COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)+COALESCE($!s0s!$.customcurrency1__c, 0))<=0
+
+
+ LN((($!s0s!$.custompercent1__c / 100.0)+$!s0s!$.customcurrency1__c))
+ (($!s0s!$.custompercent1__c / 100.0)+$!s0s!$.customcurrency1__c)<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesRound.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesRound.xml
new file mode 100644
index 00000000..75776b76
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesRound.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))).ln()
+ Math.log(($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.log((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0))).ln()):null
+
+ LN(ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer))
+ ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)<=0
+
+
+ LN(ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer))
+ ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesSqrt.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesSqrt.xml
new file mode 100644
index 00000000..7a6e7a09
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesSqrt.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).ln()
+ Math.log(Math.sqrt($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(Math.log(Math.sqrt(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?(($F.Decimal.sqrt(context.record.customnumber1__c)).ln()):null
+
+ LN(SQRT(COALESCE($!s0s!$.customnumber1__c, 0)))
+ COALESCE($!s0s!$.customnumber1__c, 0)<0 OR SQRT(COALESCE($!s0s!$.customnumber1__c, 0))<=0
+
+
+ LN(SQRT($!s0s!$.customnumber1__c))
+ $!s0s!$.customnumber1__c<0 OR SQRT($!s0s!$.customnumber1__c)<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesValue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesValue.xml
new file mode 100644
index 00000000..c2fb2638
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLNUsesValue.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null)?(($F.Decimal(context.record.customtext1__c)).ln()):null
+ (context.record.customtext1__c!=null)?(Math.log(Number(context.record.customtext1__c))):null
+ (context.record.customtext1__c!=null)?(Math.log(Number(context.record.customtext1__c))):null
+ (context.record.customtext1__c!=null)?(($F.Decimal(context.record.customtext1__c)).ln()):null
+
+ LN(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18)))
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$' OR CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))<=0
+
+
+ LN(CAST($!s0s!$.customtext1__c AS DECIMAL(38,18)))
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$' OR CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLenSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLenSimple.xml
new file mode 100644
index 00000000..61126f0b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLenSimple.xml
@@ -0,0 +1,15 @@
+
+
+ (new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length)))
+ ($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length)
+ ($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length)
+ (new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length)))
+
+ COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric
+ null
+
+
+ COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLike.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLike.xml
new file mode 100644
index 00000000..55410096
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLike.xml
@@ -0,0 +1,15 @@
+
+
+ (new RegExp(($F.anl([context.record.customexpr__c])?'^$':'^'+context.record.customexpr__c.replaceAll(/\\%/g,'\t').replaceAll(/\\_/g,'\f').replaceAll(/([*?+^$(){}\[])/g,'\\$1').replaceAll(/_/g,'.').replaceAll(/%/g,'.*').replaceAll(/\f/g,'_').replaceAll(/\t/g,'%')+'$')).test($F.nvl(context.record.customtext__c,''))?"TRUE":"FALSE")
+ (new RegExp(($F.anl([context.record.customexpr__c])?'^$':'^'+context.record.customexpr__c.replaceAll(/\\%/g,'\t').replaceAll(/\\_/g,'\f').replaceAll(/([*?+^$(){}\[])/g,'\\$1').replaceAll(/_/g,'.').replaceAll(/%/g,'.*').replaceAll(/\f/g,'_').replaceAll(/\t/g,'%')+'$')).test($F.nvl(context.record.customtext__c,''))?"TRUE":"FALSE")
+ (new RegExp(($F.anl([context.record.customexpr__c])?'^$':'^'+context.record.customexpr__c.replaceAll(/\\%/g,'\t').replaceAll(/\\_/g,'\f').replaceAll(/([*?+^$(){}\[])/g,'\\$1').replaceAll(/_/g,'.').replaceAll(/%/g,'.*').replaceAll(/\f/g,'_').replaceAll(/\t/g,'%')+'$')).test($F.nvl(context.record.customtext__c,''))?"TRUE":"FALSE")
+ (new RegExp(($F.anl([context.record.customexpr__c])?'^$':'^'+context.record.customexpr__c.replaceAll(/\\%/g,'\t').replaceAll(/\\_/g,'\f').replaceAll(/([*?+^$(){}\[])/g,'\\$1').replaceAll(/_/g,'.').replaceAll(/%/g,'.*').replaceAll(/\f/g,'_').replaceAll(/\t/g,'%')+'$')).test($F.nvl(context.record.customtext__c,''))?"TRUE":"FALSE")
+
+ CASE WHEN $!s0s!$.customtext__c LIKE $!s0s!$.customexpr__c ESCAPE '\' THEN 'TRUE' ELSE 'FALSE' END
+ null
+
+
+ CASE WHEN $!s0s!$.customtext__c LIKE $!s0s!$.customexpr__c ESCAPE '\' THEN 'TRUE' ELSE 'FALSE' END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogSimple.xml
new file mode 100644
index 00000000..b7a585da
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogSimple.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10)
+ Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10
+ (context.record.customnumber1__c!=null)?(Math.log(context.record.customnumber1__c)/Math.LN10):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c).log(10)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesAbs.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesAbs.xml
new file mode 100644
index 00000000..5d39d66c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesAbs.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).abs()).log(10)
+ Math.log(Math.abs($F.nvl(context.record.customnumber1__c,0)))/Math.LN10
+ (context.record.customnumber1__c!=null)?(Math.log(Math.abs(context.record.customnumber1__c))/Math.LN10):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c.abs()).log(10)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesCase.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesCase.xml
new file mode 100644
index 00000000..c27739ff
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesCase.xml
@@ -0,0 +1,15 @@
+
+
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')))).log(10)
+ Math.log(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0)))/Math.LN10
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null)?(Math.log(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c))/Math.LN10):null
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null)?((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)).log(10)):null
+
+ LOG(10, CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END)
+ CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END<=0
+
+
+ LOG(10, CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END)
+ CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesCeil.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesCeil.xml
new file mode 100644
index 00000000..218ff296
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesCeil.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor())).log(10)
+ Math.log((($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0))))/Math.LN10
+ (context.record.customnumber1__c!=null)?(Math.log(((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c)))/Math.LN10):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor())).log(10)):null
+
+ LOG(10, CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END)
+ CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END<=0
+
+
+ LOG(10, CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END)
+ CASE WHEN $!s0s!$.customnumber1__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesFloor.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesFloor.xml
new file mode 100644
index 00000000..cf9e33bf
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesFloor.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil())).log(10)
+ Math.log((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0))))/Math.LN10
+ (context.record.customnumber1__c!=null)?(Math.log(((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c)))/Math.LN10):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil())).log(10)):null
+
+ LOG(10, CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END)
+ CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END<=0
+
+
+ LOG(10, CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END)
+ CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesIf.xml
new file mode 100644
index 00000000..b909127a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesIf.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).log(10)
+ Math.log($F.nvl(context.record.customnumber2__c,0))/Math.LN10
+ (context.record.customnumber2__c!=null)?(Math.log(context.record.customnumber2__c)/Math.LN10):null
+ (context.record.customnumber2__c!=null)?((context.record.customnumber2__c).log(10)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesLen.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesLen.xml
new file mode 100644
index 00000000..ea48cf32
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesLen.xml
@@ -0,0 +1,15 @@
+
+
+ ((new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length)))).log(10)
+ Math.log(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length))/Math.LN10
+ Math.log(($F.anl([context.record.customtext1__c])?0:(context.record.customtext1__c).length))/Math.LN10
+ ((new $F.Decimal(($F.anl([context.record.customtext1__c])?(new $F.Decimal(0)):(context.record.customtext1__c).length)))).log(10)
+
+ LOG(10, COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric)
+ COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric<=0
+
+
+ LOG(10, COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric)
+ COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesLn.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesLn.xml
new file mode 100644
index 00000000..bd559c0d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesLn.xml
@@ -0,0 +1,7 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln()).log(10)
+ Math.log(Math.log($F.nvl(context.record.customnumber1__c,0)))/Math.LN10
+ (context.record.customnumber1__c!=null)?(Math.log(Math.log(context.record.customnumber1__c))/Math.LN10):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c).ln()).log(10)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesLog.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesLog.xml
new file mode 100644
index 00000000..cf014a30
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesLog.xml
@@ -0,0 +1,7 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10)).log(10)
+ Math.log(Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10)/Math.LN10
+ (context.record.customnumber1__c!=null)?(Math.log(Math.log(context.record.customnumber1__c)/Math.LN10)/Math.LN10):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c).log(10)).log(10)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesMCeil.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesMCeil.xml
new file mode 100644
index 00000000..f5ecb75a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesMCeil.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).toDP(18).ceil()).log(10)
+ Math.log((Math).ceil($F.nvl(context.record.customnumber1__c,0)))/Math.LN10
+ (context.record.customnumber1__c!=null)?(Math.log((Math).ceil(context.record.customnumber1__c))/Math.LN10):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c).toDP(18).ceil()).log(10)):null
+
+ LOG(10, CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)))
+ CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33))<=0
+
+
+ LOG(10, CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)))
+ CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33))<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesMOD.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesMOD.xml
new file mode 100644
index 00000000..3a73fe7a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesMOD.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))).log(10)
+ Math.log((($F.nvl(context.record.customnumber1__c,0))%($F.nvl(context.record.customnumber2__c,0))))/Math.LN10
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.log(((context.record.customnumber1__c)%(context.record.customnumber2__c)))/Math.LN10):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c.mod(context.record.customnumber2__c)).log(10)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesMinus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesMinus.xml
new file mode 100644
index 00000000..85383c1e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesMinus.xml
@@ -0,0 +1,7 @@
+
+
+ (($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).sub($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))))).log(10)
+ Math.log(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)-$F.nvl(context.record.customcurrency1__c,0)))/Math.LN10
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customcurrency1__c!=null)?(Math.log((context.record.custompercent1__c/100.0-context.record.customcurrency1__c))/Math.LN10):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customcurrency1__c!=null)?(((context.record.custompercent1__c.div(100).sub(context.record.customcurrency1__c))).log(10)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesRound.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesRound.xml
new file mode 100644
index 00000000..fb27b020
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesRound.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))).log(10)
+ Math.log(($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0)))/Math.LN10
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.log((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c))/Math.LN10):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0))).log(10)):null
+
+ LOG(10, ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer))
+ ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)<=0
+
+
+ LOG(10, ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer))
+ ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesSqrt.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesSqrt.xml
new file mode 100644
index 00000000..e893b31d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesSqrt.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).log(10)
+ Math.log(Math.sqrt($F.nvl(context.record.customnumber1__c,0)))/Math.LN10
+ (context.record.customnumber1__c!=null)?(Math.log(Math.sqrt(context.record.customnumber1__c))/Math.LN10):null
+ (context.record.customnumber1__c!=null)?(($F.Decimal.sqrt(context.record.customnumber1__c)).log(10)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesValue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesValue.xml
new file mode 100644
index 00000000..d5d00249
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLogUsesValue.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null)?(($F.Decimal(context.record.customtext1__c)).log(10)):null
+ (context.record.customtext1__c!=null)?(Math.log(Number(context.record.customtext1__c))/Math.LN10):null
+ (context.record.customtext1__c!=null)?(Math.log(Number(context.record.customtext1__c))/Math.LN10):null
+ (context.record.customtext1__c!=null)?(($F.Decimal(context.record.customtext1__c)).log(10)):null
+
+ LOG(10, CAST($!s0s!$.customtext1__c AS DECIMAL(38,18)))
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$' OR CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))<=0
+
+
+ LOG(10, CAST($!s0s!$.customtext1__c AS DECIMAL(38,18)))
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$' OR CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLower.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLower.xml
new file mode 100644
index 00000000..c7990104
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLower.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toLowerCase()):null
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toLowerCase()):null
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toLowerCase()):null
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toLowerCase()):null
+
+ LOWER($!s0s!$.customText1__c)
+ null
+
+
+ LOWER($!s0s!$.customText1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLowerLocale.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLowerLocale.xml
new file mode 100644
index 00000000..5dc411ac
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLowerLocale.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toLocaleLowerCase(($F.anl([context.record.customText2__c])?'en':context.record.customText2__c.replace("_","-")))):null
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toLocaleLowerCase(($F.anl([context.record.customText2__c])?'en':context.record.customText2__c.replace("_","-")))):null
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toLocaleLowerCase(($F.anl([context.record.customText2__c])?'en':context.record.customText2__c.replace("_","-")))):null
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toLocaleLowerCase(($F.anl([context.record.customText2__c])?'en':context.record.customText2__c.replace("_","-")))):null
+
+ LOWER($!s0s!$.customText1__c)
+ null
+
+
+ LOWER($!s0s!$.customText1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLpad.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLpad.xml
new file mode 100644
index 00000000..8e856337
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLpad.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customText1__c!=null)?($F.lpad(context.record.customText1__c,$F.nvl(context.record.customNumber1__c,new $F.Decimal('0')).toNumber(),' ')):null
+ (context.record.customText1__c!=null)?($F.lpad(context.record.customText1__c,$F.nvl(context.record.customNumber1__c,0),' ')):null
+ (context.record.customText1__c!=null&&context.record.customNumber1__c!=null)?($F.lpad(context.record.customText1__c,context.record.customNumber1__c,' ')):null
+ (context.record.customText1__c!=null&&context.record.customNumber1__c!=null)?($F.lpad(context.record.customText1__c,context.record.customNumber1__c.toNumber(),' ')):null
+
+ LPAD($!s0s!$.customText1__c, GREATEST(COALESCE($!s0s!$.customNumber1__c, 0)::integer,0))
+ null
+
+
+ LPAD($!s0s!$.customText1__c, GREATEST($!s0s!$.customNumber1__c::integer,0))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLpad2.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLpad2.xml
new file mode 100644
index 00000000..59d83ea3
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testLpad2.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customText1__c!=null)?($F.lpad(context.record.customText1__c,$F.nvl(context.record.customNumber1__c,new $F.Decimal('0')).toNumber(),$F.nvl(context.record.customText2__c,' '))):null
+ (context.record.customText1__c!=null)?($F.lpad(context.record.customText1__c,$F.nvl(context.record.customNumber1__c,0),$F.nvl(context.record.customText2__c,' '))):null
+ (context.record.customText1__c!=null&&context.record.customNumber1__c!=null)?($F.lpad(context.record.customText1__c,context.record.customNumber1__c,$F.nvl(context.record.customText2__c,' '))):null
+ (context.record.customText1__c!=null&&context.record.customNumber1__c!=null)?($F.lpad(context.record.customText1__c,context.record.customNumber1__c.toNumber(),$F.nvl(context.record.customText2__c,' '))):null
+
+ LPAD($!s0s!$.customText1__c, GREATEST(COALESCE($!s0s!$.customNumber1__c, 0)::integer,0), $!s0s!$.customText2__c)
+ null
+
+
+ LPAD($!s0s!$.customText1__c, GREATEST($!s0s!$.customNumber1__c::integer,0), $!s0s!$.customText2__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMCeilRound.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMCeilRound.xml
new file mode 100644
index 00000000..b02d1d15
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMCeilRound.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).mul($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))).toDP(18).ceil()
+ (Math).ceil(($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))*$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber2__c!=null)?((Math).ceil((context.record.customnumber1__c/context.record.customnumber2__c)*context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c.div(context.record.customnumber2__c).mul(context.record.customnumber2__c)).toDP(18).ceil()):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMCeilSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMCeilSimple.xml
new file mode 100644
index 00000000..404ab92e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMCeilSimple.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).toDP(18).ceil()
+ (Math).ceil($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?((Math).ceil(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c).toDP(18).ceil()):null
+
+ CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33))
+ null
+
+
+ CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMCeilUsesMFloor.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMCeilUsesMFloor.xml
new file mode 100644
index 00000000..f428580a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMCeilUsesMFloor.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).toDP(18).floor()).toDP(18).ceil()
+ (Math).ceil((Math).floor($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?((Math).ceil((Math).floor(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c).toDP(18).floor()).toDP(18).ceil()):null
+
+ CEIL(ROUND(FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33))::numeric(38,18),33))
+ null
+
+
+ CEIL(ROUND(FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33))::numeric(38,18),33))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMCeilUsesRound.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMCeilUsesRound.xml
new file mode 100644
index 00000000..93785cbc
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMCeilUsesRound.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))).toDP(18).ceil()
+ (Math).ceil(($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((Math).ceil((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0))).toDP(18).ceil()):null
+
+ CEIL(ROUND(ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)::numeric(38,18),33))
+ null
+
+
+ CEIL(ROUND(ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)::numeric(38,18),33))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMFloorRound.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMFloorRound.xml
new file mode 100644
index 00000000..1bd163db
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMFloorRound.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).mul($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))).toDP(18).floor()
+ (Math).floor(($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))*$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber2__c!=null)?((Math).floor((context.record.customnumber1__c/context.record.customnumber2__c)*context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c.div(context.record.customnumber2__c).mul(context.record.customnumber2__c)).toDP(18).floor()):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMFloorSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMFloorSimple.xml
new file mode 100644
index 00000000..f532373a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMFloorSimple.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).toDP(18).floor()
+ (Math).floor($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?((Math).floor(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?((context.record.customnumber1__c).toDP(18).floor()):null
+
+ FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33))
+ null
+
+
+ FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMax.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMax.xml
new file mode 100644
index 00000000..3c51c53e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMax.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.max($F.nvl(context.record.customNumber1__c,new $F.Decimal('0')),$F.nvl(context.record.customNumber2__c,new $F.Decimal('0')))
+ Math.max($F.nvl(context.record.customNumber1__c,0),$F.nvl(context.record.customNumber2__c,0))
+ (context.record.customNumber1__c!=null&&context.record.customNumber2__c!=null)?(Math.max(context.record.customNumber1__c,context.record.customNumber2__c)):null
+ (context.record.customNumber1__c!=null&&context.record.customNumber2__c!=null)?($F.Decimal.max(context.record.customNumber1__c,context.record.customNumber2__c)):null
+
+ GREATEST(COALESCE($!s0s!$.customNumber1__c, 0), COALESCE($!s0s!$.customNumber2__c, 0))
+ null
+
+
+ GREATEST($!s0s!$.customNumber1__c, $!s0s!$.customNumber2__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMax3.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMax3.xml
new file mode 100644
index 00000000..c7ee1c0c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMax3.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.max($F.nvl(context.record.customNumber1__c,new $F.Decimal('0')),$F.nvl(context.record.customNumber2__c,new $F.Decimal('0')),$F.nvl(context.record.customNumber3__c,new $F.Decimal('0')))
+ Math.max($F.nvl(context.record.customNumber1__c,0),$F.nvl(context.record.customNumber2__c,0),$F.nvl(context.record.customNumber3__c,0))
+ (context.record.customNumber1__c!=null&&context.record.customNumber2__c!=null&&context.record.customNumber3__c!=null)?(Math.max(context.record.customNumber1__c,context.record.customNumber2__c,context.record.customNumber3__c)):null
+ (context.record.customNumber1__c!=null&&context.record.customNumber2__c!=null&&context.record.customNumber3__c!=null)?($F.Decimal.max(context.record.customNumber1__c,context.record.customNumber2__c,context.record.customNumber3__c)):null
+
+ GREATEST(COALESCE($!s0s!$.customNumber1__c, 0), COALESCE($!s0s!$.customNumber2__c, 0), COALESCE($!s0s!$.customNumber3__c, 0))
+ null
+
+
+ GREATEST($!s0s!$.customNumber1__c, $!s0s!$.customNumber2__c, $!s0s!$.customNumber3__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMid.xml
new file mode 100644
index 00000000..1214c907
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMid.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext__c!=null)?(context.record.customtext__c.substr(Math.max($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))-1,0),Math.max($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')),0))):null
+ (context.record.customtext__c!=null)?(context.record.customtext__c.substr(Math.max($F.nvl(context.record.customnumber1__c,0)-1,0),Math.max($F.nvl(context.record.customnumber2__c,0),0))):null
+ (context.record.customtext__c!=null&&context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(context.record.customtext__c.substr(Math.max(context.record.customnumber1__c-1,0),Math.max(context.record.customnumber2__c,0))):null
+ (context.record.customtext__c!=null&&context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(context.record.customtext__c.substr(Math.max(context.record.customnumber1__c-1,0),Math.max(context.record.customnumber2__c,0))):null
+
+ SUBSTR($!s0s!$.customtext__c, GREATEST(COALESCE($!s0s!$.customnumber1__c, 0)::integer,1), GREATEST(COALESCE($!s0s!$.customnumber2__c, 0)::integer,0))
+ null
+
+
+ SUBSTR($!s0s!$.customtext__c, GREATEST($!s0s!$.customnumber1__c::integer,1), GREATEST($!s0s!$.customnumber2__c::integer,0))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMillisecWithValidDateTimeString.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMillisecWithValidDateTimeString.xml
new file mode 100644
index 00000000..835a5f59
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMillisecWithValidDateTimeString.xml
@@ -0,0 +1,7 @@
+
+
+ new Date(new Date("2015-03-17 17:00:00").setUTCFullYear(1970,0,1)).getMilliseconds()
+ new Date(new Date("2015-03-17 17:00:00").setUTCFullYear(1970,0,1)).getMilliseconds()
+ new Date(new Date("2015-03-17 17:00:00").setUTCFullYear(1970,0,1)).getMilliseconds()
+ new Date(new Date("2015-03-17 17:00:00").setUTCFullYear(1970,0,1)).getMilliseconds()
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMillisecWithValidString.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMillisecWithValidString.xml
new file mode 100644
index 00000000..d619a62f
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMillisecWithValidString.xml
@@ -0,0 +1,15 @@
+
+
+ new $F.Decimal('666')
+ 666
+ 666
+ new $F.Decimal('666')
+
+ 666
+ null
+
+
+ 666
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMillisecondValueWithValidInValid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMillisecondValueWithValidInValid.xml
new file mode 100644
index 00000000..a46f21e5
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMillisecondValueWithValidInValid.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getMilliseconds()):null
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getMilliseconds()):null
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getMilliseconds()):null
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getMilliseconds()):null
+
+ TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000 -TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000/1000) * 1000)
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
+ TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000 -TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000/1000) * 1000)
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMin.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMin.xml
new file mode 100644
index 00000000..7d9b0a37
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMin.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.min($F.nvl(context.record.customNumber1__c,new $F.Decimal('0')),$F.nvl(context.record.customNumber2__c,new $F.Decimal('0')))
+ Math.min($F.nvl(context.record.customNumber1__c,0),$F.nvl(context.record.customNumber2__c,0))
+ (context.record.customNumber1__c!=null&&context.record.customNumber2__c!=null)?(Math.min(context.record.customNumber1__c,context.record.customNumber2__c)):null
+ (context.record.customNumber1__c!=null&&context.record.customNumber2__c!=null)?($F.Decimal.min(context.record.customNumber1__c,context.record.customNumber2__c)):null
+
+ LEAST(COALESCE($!s0s!$.customNumber1__c, 0), COALESCE($!s0s!$.customNumber2__c, 0))
+ null
+
+
+ LEAST($!s0s!$.customNumber1__c, $!s0s!$.customNumber2__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMin3.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMin3.xml
new file mode 100644
index 00000000..f66eadc3
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMin3.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.min($F.nvl(context.record.customNumber1__c,new $F.Decimal('0')),$F.nvl(context.record.customNumber2__c,new $F.Decimal('0')),$F.nvl(context.record.customNumber3__c,new $F.Decimal('0')))
+ Math.min($F.nvl(context.record.customNumber1__c,0),$F.nvl(context.record.customNumber2__c,0),$F.nvl(context.record.customNumber3__c,0))
+ (context.record.customNumber1__c!=null&&context.record.customNumber2__c!=null&&context.record.customNumber3__c!=null)?(Math.min(context.record.customNumber1__c,context.record.customNumber2__c,context.record.customNumber3__c)):null
+ (context.record.customNumber1__c!=null&&context.record.customNumber2__c!=null&&context.record.customNumber3__c!=null)?($F.Decimal.min(context.record.customNumber1__c,context.record.customNumber2__c,context.record.customNumber3__c)):null
+
+ LEAST(COALESCE($!s0s!$.customNumber1__c, 0), COALESCE($!s0s!$.customNumber2__c, 0), COALESCE($!s0s!$.customNumber3__c, 0))
+ null
+
+
+ LEAST($!s0s!$.customNumber1__c, $!s0s!$.customNumber2__c, $!s0s!$.customNumber3__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMinuteValueWithValidInValid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMinuteValueWithValidInValid.xml
new file mode 100644
index 00000000..cea141a3
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMinuteValueWithValidInValid.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?(new $F.Decimal(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getUTCMinutes())):null
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getUTCMinutes()):null
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getUTCMinutes()):null
+ (context.record.dateString__c!=null)?(new $F.Decimal(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getUTCMinutes())):null
+
+ TRUNC((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000-TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000/3600000) * 3600000)/60000)
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
+ TRUNC((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000-TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000/3600000) * 3600000)/60000)
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMinuteWithValidString.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMinuteWithValidString.xml
new file mode 100644
index 00000000..fce07e54
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMinuteWithValidString.xml
@@ -0,0 +1,15 @@
+
+
+ new $F.Decimal('40')
+ 40
+ 40
+ new $F.Decimal('40')
+
+ 40
+ null
+
+
+ 40
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModRounding.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModRounding.xml
new file mode 100644
index 00000000..a7652df9
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModRounding.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mul(new $F.Decimal('10000')).mod(new $F.Decimal('2'))
+ (($F.nvl(context.record.customnumber1__c,0)*10000)%(2))
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c*10000)%(2))):null
+ (context.record.customnumber1__c!=null)?(context.record.customnumber1__c.mul(new $F.Decimal('10000')).mod(new $F.Decimal('2'))):null
+
+ MOD((COALESCE($!s0s!$.customnumber1__c, 0) * 10000), 2)
+ null
+
+
+ MOD(($!s0s!$.customnumber1__c * 10000), 2)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModRoundingNoScale.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModRoundingNoScale.xml
new file mode 100644
index 00000000..5e6054b5
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModRoundingNoScale.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mul(new $F.Decimal('10000')).mod(new $F.Decimal('2'))
+ (($F.nvl(context.record.customnumber1__c,0)*10000)%(2))
+ (context.record.customnumber1__c!=null)?(((context.record.customnumber1__c*10000)%(2))):null
+ (context.record.customnumber1__c!=null)?(context.record.customnumber1__c.mul(new $F.Decimal('10000')).mod(new $F.Decimal('2'))):null
+
+ MOD((COALESCE($!s0s!$.customnumber1__c, 0) * 10000), 2)
+ null
+
+
+ MOD(($!s0s!$.customnumber1__c * 10000), 2)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModSwapTypes.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModSwapTypes.xml
new file mode 100644
index 00000000..b246fe7b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModSwapTypes.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))
+ (($F.nvl(context.record.customnumber1__c,0))%($F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((context.record.customnumber1__c)%(context.record.customnumber2__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(context.record.customnumber1__c.mod(context.record.customnumber2__c)):null
+
+ MOD(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0))
+ null
+
+
+ MOD($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesCase.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesCase.xml
new file mode 100644
index 00000000..23222f39
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesCase.xml
@@ -0,0 +1,15 @@
+
+
+ ((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber3__c,new $F.Decimal('0'))).mod($F.nvl(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?($F.nvl(context.record.customnumber4__c,new $F.Decimal('0'))):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?($F.nvl(context.record.customnumber5__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber6__c,new $F.Decimal('0'))),new $F.Decimal('0')))
+ ((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0)))%($F.nvl(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?($F.nvl(context.record.customnumber4__c,0)):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?($F.nvl(context.record.customnumber5__c,0)):$F.nvl(context.record.customnumber6__c,0)),0)))
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null&&((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c)!=null)?(((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c))%(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c)))):null
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null&&((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c)!=null)?(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c).mod(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c))):null
+
+ MOD(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END, COALESCE(CASE $!s0s!$.customdatetime1__c WHEN $!s0s!$.customdatetime2__c THEN COALESCE($!s0s!$.customnumber4__c, 0) WHEN $!s0s!$.customdatetime3__c THEN COALESCE($!s0s!$.customnumber5__c, 0) ELSE COALESCE($!s0s!$.customnumber6__c, 0) END, 0))
+ null
+
+
+ MOD(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END, CASE $!s0s!$.customdatetime1__c WHEN $!s0s!$.customdatetime2__c THEN $!s0s!$.customnumber4__c WHEN $!s0s!$.customdatetime3__c THEN $!s0s!$.customnumber5__c ELSE $!s0s!$.customnumber6__c END)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesExpCeil.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesExpCeil.xml
new file mode 100644
index 00000000..7845c086
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesExpCeil.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.exp($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mod(($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toDP(18).floor()))
+ ((Math.exp($F.nvl(context.record.customnumber1__c,0)))%((($F.nvl(context.record.customnumber2__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber2__c,0)):Math.floor($F.nvl(context.record.customnumber2__c,0)))))
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?(((Math.exp(context.record.customnumber1__c))%(((context.record.customnumber2__c)>=0?Math.ceil(context.record.customnumber2__c):Math.floor(context.record.customnumber2__c))))):null
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?($F.Decimal.exp(context.record.customnumber1__c).mod((context.record.customnumber2__c.isPos()?context.record.customnumber2__c.toDP(18).ceil():context.record.customnumber2__c.toDP(18).floor()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesFloorAbs.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesFloorAbs.xml
new file mode 100644
index 00000000..9ab753ac
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesFloorAbs.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil()).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).abs())
+ (((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0))))%(Math.abs($F.nvl(context.record.customnumber2__c,0))))
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?(((((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c)))%(Math.abs(context.record.customnumber2__c)))):null
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil()).mod(context.record.customnumber2__c.abs())):null
+
+ MOD(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END, ABS(COALESCE($!s0s!$.customnumber2__c, 0)))
+ null
+
+
+ MOD(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END, ABS($!s0s!$.customnumber2__c))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesIf.xml
new file mode 100644
index 00000000..5f662c9e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesIf.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customcheckbox1__c?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')):$F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).mod($F.nvl(context.record.customnumber3__c,new $F.Decimal('0')))
+ (((context.record.customcheckbox1__c?$F.nvl(context.record.customnumber1__c,0):$F.nvl(context.record.customnumber2__c,0)))%($F.nvl(context.record.customnumber3__c,0)))
+ ((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c)!=null&&context.record.customnumber3__c!=null)?((((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c))%(context.record.customnumber3__c))):null
+ ((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c)!=null&&context.record.customnumber3__c!=null)?((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c).mod(context.record.customnumber3__c)):null
+
+ MOD(CASE WHEN (COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') THEN COALESCE($!s0s!$.customnumber1__c, 0) ELSE COALESCE($!s0s!$.customnumber2__c, 0) END, COALESCE($!s0s!$.customnumber3__c, 0))
+ null
+
+
+ MOD(CASE WHEN (COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') THEN $!s0s!$.customnumber1__c ELSE $!s0s!$.customnumber2__c END, $!s0s!$.customnumber3__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesLn.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesLn.xml
new file mode 100644
index 00000000..0a0cf4bf
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesLn.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln().mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))
+ ((Math.log($F.nvl(context.record.customnumber1__c,0)))%($F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((Math.log(context.record.customnumber1__c))%(context.record.customnumber2__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c).ln().mod(context.record.customnumber2__c)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesLog.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesLog.xml
new file mode 100644
index 00000000..f9032ddb
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesLog.xml
@@ -0,0 +1,7 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))
+ ((Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10)%($F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((Math.log(context.record.customnumber1__c)/Math.LN10)%(context.record.customnumber2__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c).log(10).mod(context.record.customnumber2__c)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesRoundPlus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesRoundPlus.xml
new file mode 100644
index 00000000..eda64066
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesRoundPlus.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toFixed(0)).mod(($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')).add($F.nvl(context.record.customcurrency2__c,new $F.Decimal('0')))))
+ ((($F.nvl(context.record.customnumber1__c,0)>0)?Number(Number($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)).toFixed($F.nvl(context.record.customnumber1__c,0)<=20?$F.nvl(context.record.customnumber1__c,0):20)):Math.round(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))*('1e'+$F.nvl(context.record.customnumber1__c,0)))/('1e'+$F.nvl(context.record.customnumber1__c,0)))%(($F.nvl(context.record.customcurrency1__c,0)+$F.nvl(context.record.customcurrency2__c,0))))
+ (context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null&&context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customnumber1__c!=null)?((((context.record.customnumber1__c>0)?Number(Number(context.record.custompercent1__c/100.0).toFixed(context.record.customnumber1__c<=20?context.record.customnumber1__c:20)):Math.round((context.record.custompercent1__c/100.0)*('1e'+context.record.customnumber1__c))/('1e'+context.record.customnumber1__c))%((context.record.customcurrency1__c+context.record.customcurrency2__c)))):null
+ (context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null&&context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customnumber1__c!=null)?((context.record.custompercent1__c.div(100)).mul('1e'+context.record.customnumber1__c.toFixed(0)).round().div('1e'+context.record.customnumber1__c.toFixed(0)).mod((context.record.customcurrency1__c.add(context.record.customcurrency2__c)))):null
+
+ MOD(ROUND(COALESCE(($!s0s!$.custompercent1__c / 100.0), 0), COALESCE($!s0s!$.customnumber1__c, 0)::integer), (COALESCE($!s0s!$.customcurrency1__c, 0)+COALESCE($!s0s!$.customcurrency2__c, 0)))
+ null
+
+
+ MOD(ROUND(($!s0s!$.custompercent1__c / 100.0), $!s0s!$.customnumber1__c::integer), ($!s0s!$.customcurrency1__c+$!s0s!$.customcurrency2__c))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesSqrt.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesSqrt.xml
new file mode 100644
index 00000000..8d9f8aee
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testModUsesSqrt.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mod($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))
+ ((Math.sqrt($F.nvl(context.record.customnumber1__c,0)))%($F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((Math.sqrt(context.record.customnumber1__c))%(context.record.customnumber2__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?($F.Decimal.sqrt(context.record.customnumber1__c).mod(context.record.customnumber2__c)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMonths.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMonths.xml
new file mode 100644
index 00000000..1b38d5ed
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMonths.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(new $F.Decimal(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCMonth()+1)):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCMonth()+1 )):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCMonth()+1 )):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(new $F.Decimal(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCMonth()+1)):null
+
+ EXTRACT(MONTH FROM $!s0s!$.customdate1__c)::numeric
+ null
+
+
+ EXTRACT(MONTH FROM $!s0s!$.customdate1__c)::numeric
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMultiplySimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMultiplySimple.xml
new file mode 100644
index 00000000..6b07b4c1
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMultiplySimple.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')).mul($F.nvl(context.record.customcurrency2__c,new $F.Decimal('0')))
+ $F.nvl(context.record.customcurrency1__c,0)*$F.nvl(context.record.customcurrency2__c,0)
+ (context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null)?(context.record.customcurrency1__c*context.record.customcurrency2__c):null
+ (context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null)?(context.record.customcurrency1__c.mul(context.record.customcurrency2__c)):null
+
+ (COALESCE($!s0s!$.customcurrency1__c, 0) * COALESCE($!s0s!$.customcurrency2__c, 0))
+ null
+
+
+ ($!s0s!$.customcurrency1__c * $!s0s!$.customcurrency2__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMultiplyWithDivideExpr.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMultiplyWithDivideExpr.xml
new file mode 100644
index 00000000..e64408a9
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMultiplyWithDivideExpr.xml
@@ -0,0 +1,7 @@
+
+
+ $F.nvl($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).div($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))),new $F.Decimal('0')).mul($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ $F.nvl(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)/$F.nvl(context.record.customcurrency1__c,0)),0)*$F.nvl(context.record.customnumber1__c,0)
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customcurrency1__c!=null&&(context.record.custompercent1__c/100.0/context.record.customcurrency1__c)!=null&&context.record.customnumber1__c!=null)?((context.record.custompercent1__c/100.0/context.record.customcurrency1__c)*context.record.customnumber1__c):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customcurrency1__c!=null&&context.record.custompercent1__c.div(100).div(context.record.customcurrency1__c)!=null&&context.record.customnumber1__c!=null)?(context.record.custompercent1__c.div(100).div(context.record.customcurrency1__c).mul(context.record.customnumber1__c)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMultiplyWithDivideExpr2.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMultiplyWithDivideExpr2.xml
new file mode 100644
index 00000000..73ebc837
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMultiplyWithDivideExpr2.xml
@@ -0,0 +1,7 @@
+
+
+ $F.nvl($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).div($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))),new $F.Decimal('0')).mul($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ $F.nvl(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)/$F.nvl(context.record.customcurrency1__c,0)),0)*$F.nvl(context.record.customnumber1__c,0)
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customcurrency1__c!=null&&(context.record.custompercent1__c/100.0/context.record.customcurrency1__c)!=null&&context.record.customnumber1__c!=null)?((context.record.custompercent1__c/100.0/context.record.customcurrency1__c)*context.record.customnumber1__c):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customcurrency1__c!=null&&context.record.custompercent1__c.div(100).div(context.record.customcurrency1__c)!=null&&context.record.customnumber1__c!=null)?(context.record.custompercent1__c.div(100).div(context.record.customcurrency1__c).mul(context.record.customnumber1__c)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMultiplyWithExpr.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMultiplyWithExpr.xml
new file mode 100644
index 00000000..c0b16f01
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testMultiplyWithExpr.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0')).mul($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))),new $F.Decimal('0')).mul($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ $F.nvl($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)*$F.nvl(context.record.customcurrency1__c,0),0)*$F.nvl(context.record.customnumber1__c,0)
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customcurrency1__c!=null&&context.record.custompercent1__c/100.0*context.record.customcurrency1__c!=null&&context.record.customnumber1__c!=null)?(context.record.custompercent1__c/100.0*context.record.customcurrency1__c*context.record.customnumber1__c):null
+ (context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customcurrency1__c!=null&&context.record.custompercent1__c.div(100).mul(context.record.customcurrency1__c)!=null&&context.record.customnumber1__c!=null)?(context.record.custompercent1__c.div(100).mul(context.record.customcurrency1__c).mul(context.record.customnumber1__c)):null
+
+ (COALESCE((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0) * COALESCE($!s0s!$.customcurrency1__c, 0)), 0) * COALESCE($!s0s!$.customnumber1__c, 0))
+ null
+
+
+ ((($!s0s!$.custompercent1__c / 100.0) * $!s0s!$.customcurrency1__c) * $!s0s!$.customnumber1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithCur.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithCur.xml
new file mode 100644
index 00000000..5bceb16a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithCur.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customcurrency1__c,new $F.Decimal('0'))
+ $F.nvl(context.record.customcurrency1__c,0)
+ $F.nvl(context.record.customcurrency1__c,(context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null)
+ $F.nvl(context.record.customcurrency1__c,(context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null)
+
+ COALESCE($!s0s!$.customcurrency1__c, 0)
+ null
+
+
+ COALESCE($!s0s!$.customcurrency1__c, ($!s0s!$.custompercent1__c / 100.0))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithDate.xml
new file mode 100644
index 00000000..74f146e4
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithDate.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))),($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ $F.nvl(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))),($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ $F.nvl(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))),($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+ $F.nvl(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))),($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))))
+
+ COALESCE($!s0s!$.customdate1__c, $!s0s!$.customdate2__c)
+ null
+
+
+ COALESCE($!s0s!$.customdate1__c, $!s0s!$.customdate2__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithDateTime.xml
new file mode 100644
index 00000000..cc3b7312
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)),($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ $F.nvl(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)),($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ $F.nvl(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)),($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+ $F.nvl(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)),($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)))
+
+ COALESCE($!s0s!$.customdatetime1__c, $!s0s!$.customdatetime2__c)
+ null
+
+
+ COALESCE($!s0s!$.customdatetime1__c, $!s0s!$.customdatetime2__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithEmail.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithEmail.xml
new file mode 100644
index 00000000..77e7b53e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithEmail.xml
@@ -0,0 +1,15 @@
+
+
+ context.record.customemail1__c
+ context.record.customemail1__c
+ context.record.customemail1__c
+ context.record.customemail1__c
+
+ $!s0s!$.customemail1__c
+ null
+
+
+ $!s0s!$.customemail1__c
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithError.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithError.xml
new file mode 100644
index 00000000..7e449e61
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithError.xml
@@ -0,0 +1,7 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))
+ ($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))
+ $F.nvl((context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c/context.record.customnumber2__c)):null,context.record.customcurrency1__c)
+ $F.nvl((context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(context.record.customnumber1__c.div(context.record.customnumber2__c)):null,context.record.customcurrency1__c)
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithNum.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithNum.xml
new file mode 100644
index 00000000..7378af1c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithNum.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))
+ $F.nvl(context.record.customnumber1__c,0)
+ $F.nvl(context.record.customnumber1__c,context.record.customcurrency1__c)
+ $F.nvl(context.record.customnumber1__c,context.record.customcurrency1__c)
+
+ COALESCE($!s0s!$.customnumber1__c, 0)
+ null
+
+
+ COALESCE($!s0s!$.customnumber1__c, $!s0s!$.customcurrency1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithPer.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithPer.xml
new file mode 100644
index 00000000..2a761814
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithPer.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0'))
+ $F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)
+ $F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,context.record.customnumber1__c)
+ $F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,context.record.customnumber1__c)
+
+ COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)
+ null
+
+
+ COALESCE(($!s0s!$.custompercent1__c / 100.0), $!s0s!$.customnumber1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithPhone.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithPhone.xml
new file mode 100644
index 00000000..a1e5a497
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithPhone.xml
@@ -0,0 +1,15 @@
+
+
+ context.record.customphone1__c
+ context.record.customphone1__c
+ context.record.customphone1__c
+ context.record.customphone1__c
+
+ $!s0s!$.customphone1__c
+ null
+
+
+ $!s0s!$.customphone1__c
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithText.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithText.xml
new file mode 100644
index 00000000..dd3fde34
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithText.xml
@@ -0,0 +1,15 @@
+
+
+ context.record.customtext1__c
+ context.record.customtext1__c
+ context.record.customtext1__c
+ context.record.customtext1__c
+
+ $!s0s!$.customtext1__c
+ null
+
+
+ $!s0s!$.customtext1__c
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithTextArea.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithTextArea.xml
new file mode 100644
index 00000000..6fedd1fd
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithTextArea.xml
@@ -0,0 +1,15 @@
+
+
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+ context.record.customtextarea1__c
+
+ $!s0s!$.customtextarea1__c
+ null
+
+
+ $!s0s!$.customtextarea1__c
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithUrl.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithUrl.xml
new file mode 100644
index 00000000..ec3ace84
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNVLWithUrl.xml
@@ -0,0 +1,15 @@
+
+
+ context.record.customurl1__c
+ context.record.customurl1__c
+ context.record.customurl1__c
+ context.record.customurl1__c
+
+ $!s0s!$.customurl1__c
+ null
+
+
+ $!s0s!$.customurl1__c
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNullCompareWithEmptyString.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNullCompareWithEmptyString.xml
new file mode 100644
index 00000000..ae2951fa
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNullCompareWithEmptyString.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.noe(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),("")+'x'))==($F.nvl(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),'')+'x')
+ ($F.noe(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),("")+'x'))==($F.nvl(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),'')+'x')
+ ($F.noe(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),("")+'x'))==($F.nvl(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),'')+'x')
+ ($F.noe(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),("")+'x'))==($F.nvl(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),'')+'x')
+
+ (COALESCE($!s0s!$.customText1__c, CONCAT(NULL, 'x'))=CONCAT($!s0s!$.customText1__c, 'x'))
+ null
+
+
+ (COALESCE($!s0s!$.customText1__c, CONCAT(NULL, 'x'))=CONCAT($!s0s!$.customText1__c, 'x'))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNullNotEqualEmptyString.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNullNotEqualEmptyString.xml
new file mode 100644
index 00000000..90cf2337
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testNullNotEqualEmptyString.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.noe(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),("")+'x'))!=($F.nvl(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),'')+'x')
+ ($F.noe(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),("")+'x'))!=($F.nvl(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),'')+'x')
+ ($F.noe(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),("")+'x'))!=($F.nvl(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),'')+'x')
+ ($F.noe(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),("")+'x'))!=($F.nvl(($F.anl([context.record.customText1__c])?null:context.record.customText1__c),'')+'x')
+
+ (COALESCE($!s0s!$.customText1__c, CONCAT(NULL, 'x'))<>CONCAT($!s0s!$.customText1__c, 'x'))
+ null
+
+
+ (COALESCE($!s0s!$.customText1__c, CONCAT(NULL, 'x'))<>CONCAT($!s0s!$.customText1__c, 'x'))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testOriginDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testOriginDateTime.xml
new file mode 100644
index 00000000..ffb1ee85
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testOriginDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.anl([$System.OriginDateTime])?null:$F.parseDateTime($System.OriginDateTime))
+ ($F.anl([$System.OriginDateTime])?null:$F.parseDateTime($System.OriginDateTime))
+ ($F.anl([$System.OriginDateTime])?null:$F.parseDateTime($System.OriginDateTime))
+ ($F.anl([$System.OriginDateTime])?null:$F.parseDateTime($System.OriginDateTime))
+
+ TO_DATE('01-01-1900', 'DD-MM-YYYY')
+ null
+
+
+ TO_DATE('01-01-1900', 'DD-MM-YYYY')
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testPi.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testPi.xml
new file mode 100644
index 00000000..542148ee
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testPi.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.Decimal.acos(-1)).mul('1e'+new $F.Decimal('12').toFixed(0)).round().div('1e'+new $F.Decimal('12').toFixed(0))
+ Number(Number(Math.PI).toFixed(12<=20?12:20))
+ Number(Number(Math.PI).toFixed(12<=20?12:20))
+ ($F.Decimal.acos(-1)).mul('1e'+new $F.Decimal('12').toFixed(0)).round().div('1e'+new $F.Decimal('12').toFixed(0))
+
+ ROUND(PI()::numeric(38,18), 12::integer)
+ null
+
+
+ ROUND(PI()::numeric(38,18), 12::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRegex.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRegex.xml
new file mode 100644
index 00000000..f3398111
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRegex.xml
@@ -0,0 +1,7 @@
+
+
+ (new RegExp(($F.anl([context.record.customexpr__c])?'^$':'^'+context.record.customexpr__c+'$')).test($F.nvl(context.record.customtext__c,''))?"TRUE":"FALSE")
+ (new RegExp(($F.anl([context.record.customexpr__c])?'^$':'^'+context.record.customexpr__c+'$')).test($F.nvl(context.record.customtext__c,''))?"TRUE":"FALSE")
+ (new RegExp(($F.anl([context.record.customexpr__c])?'^$':'^'+context.record.customexpr__c+'$')).test($F.nvl(context.record.customtext__c,''))?"TRUE":"FALSE")
+ (new RegExp(($F.anl([context.record.customexpr__c])?'^$':'^'+context.record.customexpr__c+'$')).test($F.nvl(context.record.customtext__c,''))?"TRUE":"FALSE")
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testReverse.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testReverse.xml
new file mode 100644
index 00000000..1bfb7e3f
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testReverse.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null)?(context.record.customtext1__c.split("").reverse().join("")):null
+ (context.record.customtext1__c!=null)?(context.record.customtext1__c.split("").reverse().join("")):null
+ (context.record.customtext1__c!=null)?(context.record.customtext1__c.split("").reverse().join("")):null
+ (context.record.customtext1__c!=null)?(context.record.customtext1__c.split("").reverse().join("")):null
+
+ REVERSE($!s0s!$.customtext1__c)
+ null
+
+
+ REVERSE($!s0s!$.customtext1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundSimple.xml
new file mode 100644
index 00000000..354a2663
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundSimple.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))
+ ($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0))):null
+
+ ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)
+ null
+
+
+ ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundSwapTypes.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundSwapTypes.xml
new file mode 100644
index 00000000..09a28eb2
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundSwapTypes.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))
+ ($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number($F.nvl(context.record.customnumber1__c,0)).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber2__c>0)?Number(Number(context.record.customnumber1__c).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0))):null
+
+ ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)
+ null
+
+
+ ROUND($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesCase.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesCase.xml
new file mode 100644
index 00000000..c04e5a50
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesCase.xml
@@ -0,0 +1,15 @@
+
+
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')))).mul('1e'+$F.nvl(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?($F.nvl(context.record.customnumber4__c,new $F.Decimal('0'))):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?($F.nvl(context.record.customnumber5__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber6__c,new $F.Decimal('0'))),new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?($F.nvl(context.record.customnumber4__c,new $F.Decimal('0'))):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?($F.nvl(context.record.customnumber5__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber6__c,new $F.Decimal('0'))),new $F.Decimal('0')).toFixed(0))
+ ($F.nvl(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?($F.nvl(context.record.customnumber4__c,0)):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?($F.nvl(context.record.customnumber5__c,0)):$F.nvl(context.record.customnumber6__c,0)),0)>0)?Number(Number(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0))).toFixed($F.nvl(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?($F.nvl(context.record.customnumber4__c,0)):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?($F.nvl(context.record.customnumber5__c,0)):$F.nvl(context.record.customnumber6__c,0)),0)<=20?$F.nvl(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?($F.nvl(context.record.customnumber4__c,0)):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?($F.nvl(context.record.customnumber5__c,0)):$F.nvl(context.record.customnumber6__c,0)),0):20)):Math.round((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0)))*('1e'+$F.nvl(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?($F.nvl(context.record.customnumber4__c,0)):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?($F.nvl(context.record.customnumber5__c,0)):$F.nvl(context.record.customnumber6__c,0)),0)))/('1e'+$F.nvl(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?($F.nvl(context.record.customnumber4__c,0)):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?($F.nvl(context.record.customnumber5__c,0)):$F.nvl(context.record.customnumber6__c,0)),0))
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null&&((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c)!=null)?((((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c)>0)?Number(Number(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)).toFixed(((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c)<=20?((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c):20)):Math.round((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c))*('1e'+((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c)))/('1e'+((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c))):null
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null&&((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c)!=null)?((((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)).mul('1e'+((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c).toFixed(0)).round().div('1e'+((($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))])?null:($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())))?(context.record.customnumber4__c):(($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))&&(($F.anl([($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))])?null:($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime())==($F.anl([($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c))])?null:($F.anl([context.record.customdatetime3__c])?null:$F.parseDateTime(context.record.customdatetime3__c)).getTime())))?(context.record.customnumber5__c):context.record.customnumber6__c).toFixed(0))):null
+
+ ROUND(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END, COALESCE(CASE $!s0s!$.customdatetime1__c WHEN $!s0s!$.customdatetime2__c THEN COALESCE($!s0s!$.customnumber4__c, 0) WHEN $!s0s!$.customdatetime3__c THEN COALESCE($!s0s!$.customnumber5__c, 0) ELSE COALESCE($!s0s!$.customnumber6__c, 0) END, 0)::integer)
+ null
+
+
+ ROUND(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END, CASE $!s0s!$.customdatetime1__c WHEN $!s0s!$.customdatetime2__c THEN $!s0s!$.customnumber4__c WHEN $!s0s!$.customdatetime3__c THEN $!s0s!$.customnumber5__c ELSE $!s0s!$.customnumber6__c END::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesExp.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesExp.xml
new file mode 100644
index 00000000..a8ae41e3
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesExp.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.Decimal.exp($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).mul('1e'+($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toDP(18).floor()).toFixed(0)).round().div('1e'+($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toDP(18).floor()).toFixed(0))
+ ((($F.nvl(context.record.customnumber2__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber2__c,0)):Math.floor($F.nvl(context.record.customnumber2__c,0)))>0)?Number(Number(Math.exp($F.nvl(context.record.customnumber1__c,0))).toFixed((($F.nvl(context.record.customnumber2__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber2__c,0)):Math.floor($F.nvl(context.record.customnumber2__c,0)))<=20?(($F.nvl(context.record.customnumber2__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber2__c,0)):Math.floor($F.nvl(context.record.customnumber2__c,0))):20)):Math.round((Math.exp($F.nvl(context.record.customnumber1__c,0)))*('1e'+(($F.nvl(context.record.customnumber2__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber2__c,0)):Math.floor($F.nvl(context.record.customnumber2__c,0)))))/('1e'+(($F.nvl(context.record.customnumber2__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber2__c,0)):Math.floor($F.nvl(context.record.customnumber2__c,0))))
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?((((context.record.customnumber2__c)>=0?Math.ceil(context.record.customnumber2__c):Math.floor(context.record.customnumber2__c))>0)?Number(Number(Math.exp(context.record.customnumber1__c)).toFixed(((context.record.customnumber2__c)>=0?Math.ceil(context.record.customnumber2__c):Math.floor(context.record.customnumber2__c))<=20?((context.record.customnumber2__c)>=0?Math.ceil(context.record.customnumber2__c):Math.floor(context.record.customnumber2__c)):20)):Math.round((Math.exp(context.record.customnumber1__c))*('1e'+((context.record.customnumber2__c)>=0?Math.ceil(context.record.customnumber2__c):Math.floor(context.record.customnumber2__c))))/('1e'+((context.record.customnumber2__c)>=0?Math.ceil(context.record.customnumber2__c):Math.floor(context.record.customnumber2__c)))):null
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?(($F.Decimal.exp(context.record.customnumber1__c)).mul('1e'+(context.record.customnumber2__c.isPos()?context.record.customnumber2__c.toDP(18).ceil():context.record.customnumber2__c.toDP(18).floor()).toFixed(0)).round().div('1e'+(context.record.customnumber2__c.isPos()?context.record.customnumber2__c.toDP(18).ceil():context.record.customnumber2__c.toDP(18).floor()).toFixed(0))):null
+
+ ROUND(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber2__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber2__c, 0)::numeric(38,18),33)) END::integer)
+ null
+
+
+ ROUND(EXP($!s0s!$.customnumber1__c::numeric(38,18)), CASE WHEN $!s0s!$.customnumber2__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber2__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber2__c::numeric(38,18),33)) END::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesFloorAbs.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesFloorAbs.xml
new file mode 100644
index 00000000..17f6d00a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesFloorAbs.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil())).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).abs().toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).abs().toFixed(0))
+ (Math.abs($F.nvl(context.record.customnumber2__c,0))>0)?Number(Number((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0)))).toFixed(Math.abs($F.nvl(context.record.customnumber2__c,0))<=20?Math.abs($F.nvl(context.record.customnumber2__c,0)):20)):Math.round(((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0))))*('1e'+Math.abs($F.nvl(context.record.customnumber2__c,0))))/('1e'+Math.abs($F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?((Math.abs(context.record.customnumber2__c)>0)?Number(Number(((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c))).toFixed(Math.abs(context.record.customnumber2__c)<=20?Math.abs(context.record.customnumber2__c):20)):Math.round((((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c)))*('1e'+Math.abs(context.record.customnumber2__c)))/('1e'+Math.abs(context.record.customnumber2__c))):null
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?(((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil())).mul('1e'+context.record.customnumber2__c.abs().toFixed(0)).round().div('1e'+context.record.customnumber2__c.abs().toFixed(0))):null
+
+ ROUND(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END, ABS(COALESCE($!s0s!$.customnumber2__c, 0))::integer)
+ null
+
+
+ ROUND(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END, ABS($!s0s!$.customnumber2__c)::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesIf.xml
new file mode 100644
index 00000000..6b687ed9
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesIf.xml
@@ -0,0 +1,15 @@
+
+
+ ((context.record.customcheckbox1__c?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')):$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))).mul('1e'+$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')).toFixed(0))
+ ($F.nvl(context.record.customnumber3__c,0)>0)?Number(Number((context.record.customcheckbox1__c?$F.nvl(context.record.customnumber1__c,0):$F.nvl(context.record.customnumber2__c,0))).toFixed($F.nvl(context.record.customnumber3__c,0)<=20?$F.nvl(context.record.customnumber3__c,0):20)):Math.round(((context.record.customcheckbox1__c?$F.nvl(context.record.customnumber1__c,0):$F.nvl(context.record.customnumber2__c,0)))*('1e'+$F.nvl(context.record.customnumber3__c,0)))/('1e'+$F.nvl(context.record.customnumber3__c,0))
+ ((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c)!=null&&context.record.customnumber3__c!=null)?((context.record.customnumber3__c>0)?Number(Number((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c)).toFixed(context.record.customnumber3__c<=20?context.record.customnumber3__c:20)):Math.round(((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c))*('1e'+context.record.customnumber3__c))/('1e'+context.record.customnumber3__c)):null
+ ((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c)!=null&&context.record.customnumber3__c!=null)?(((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c)).mul('1e'+context.record.customnumber3__c.toFixed(0)).round().div('1e'+context.record.customnumber3__c.toFixed(0))):null
+
+ ROUND(CASE WHEN (COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') THEN COALESCE($!s0s!$.customnumber1__c, 0) ELSE COALESCE($!s0s!$.customnumber2__c, 0) END, COALESCE($!s0s!$.customnumber3__c, 0)::integer)
+ null
+
+
+ ROUND(CASE WHEN (COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') THEN $!s0s!$.customnumber1__c ELSE $!s0s!$.customnumber2__c END, $!s0s!$.customnumber3__c::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesLn.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesLn.xml
new file mode 100644
index 00000000..478e8f83
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesLn.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln()).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))
+ ($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number(Math.log($F.nvl(context.record.customnumber1__c,0))).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round((Math.log($F.nvl(context.record.customnumber1__c,0)))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber2__c>0)?Number(Number(Math.log(context.record.customnumber1__c)).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((Math.log(context.record.customnumber1__c))*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((context.record.customnumber1__c).ln()).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0))):null
+
+ ROUND(LN(COALESCE($!s0s!$.customnumber1__c, 0)), COALESCE($!s0s!$.customnumber2__c, 0)::integer)
+ COALESCE($!s0s!$.customnumber1__c, 0)<=0
+
+
+ ROUND(LN($!s0s!$.customnumber1__c), $!s0s!$.customnumber2__c::integer)
+ $!s0s!$.customnumber1__c<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesLog.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesLog.xml
new file mode 100644
index 00000000..3180ee86
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesLog.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10)).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))
+ ($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number(Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round((Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10)*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber2__c>0)?Number(Number(Math.log(context.record.customnumber1__c)/Math.LN10).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((Math.log(context.record.customnumber1__c)/Math.LN10)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((context.record.customnumber1__c).log(10)).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0))):null
+
+ ROUND(LOG(10, COALESCE($!s0s!$.customnumber1__c, 0)), COALESCE($!s0s!$.customnumber2__c, 0)::integer)
+ COALESCE($!s0s!$.customnumber1__c, 0)<=0
+
+
+ ROUND(LOG(10, $!s0s!$.customnumber1__c), $!s0s!$.customnumber2__c::integer)
+ $!s0s!$.customnumber1__c<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesRoundMinus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesRoundMinus.xml
new file mode 100644
index 00000000..c09bc292
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesRoundMinus.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toFixed(0))).mul('1e'+$F.nvl(($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')).sub($F.nvl(context.record.customcurrency2__c,new $F.Decimal('0')))),new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')).sub($F.nvl(context.record.customcurrency2__c,new $F.Decimal('0')))),new $F.Decimal('0')).toFixed(0))
+ ($F.nvl(($F.nvl(context.record.customcurrency1__c,0)-$F.nvl(context.record.customcurrency2__c,0)),0)>0)?Number(Number(($F.nvl(context.record.customnumber1__c,0)>0)?Number(Number($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)).toFixed($F.nvl(context.record.customnumber1__c,0)<=20?$F.nvl(context.record.customnumber1__c,0):20)):Math.round(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))*('1e'+$F.nvl(context.record.customnumber1__c,0)))/('1e'+$F.nvl(context.record.customnumber1__c,0))).toFixed($F.nvl(($F.nvl(context.record.customcurrency1__c,0)-$F.nvl(context.record.customcurrency2__c,0)),0)<=20?$F.nvl(($F.nvl(context.record.customcurrency1__c,0)-$F.nvl(context.record.customcurrency2__c,0)),0):20)):Math.round((($F.nvl(context.record.customnumber1__c,0)>0)?Number(Number($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0)).toFixed($F.nvl(context.record.customnumber1__c,0)<=20?$F.nvl(context.record.customnumber1__c,0):20)):Math.round(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))*('1e'+$F.nvl(context.record.customnumber1__c,0)))/('1e'+$F.nvl(context.record.customnumber1__c,0)))*('1e'+$F.nvl(($F.nvl(context.record.customcurrency1__c,0)-$F.nvl(context.record.customcurrency2__c,0)),0)))/('1e'+$F.nvl(($F.nvl(context.record.customcurrency1__c,0)-$F.nvl(context.record.customcurrency2__c,0)),0))
+ (context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null&&context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customnumber1__c!=null&&(context.record.customcurrency1__c-context.record.customcurrency2__c)!=null)?(((context.record.customcurrency1__c-context.record.customcurrency2__c)>0)?Number(Number((context.record.customnumber1__c>0)?Number(Number(context.record.custompercent1__c/100.0).toFixed(context.record.customnumber1__c<=20?context.record.customnumber1__c:20)):Math.round((context.record.custompercent1__c/100.0)*('1e'+context.record.customnumber1__c))/('1e'+context.record.customnumber1__c)).toFixed((context.record.customcurrency1__c-context.record.customcurrency2__c)<=20?(context.record.customcurrency1__c-context.record.customcurrency2__c):20)):Math.round(((context.record.customnumber1__c>0)?Number(Number(context.record.custompercent1__c/100.0).toFixed(context.record.customnumber1__c<=20?context.record.customnumber1__c:20)):Math.round((context.record.custompercent1__c/100.0)*('1e'+context.record.customnumber1__c))/('1e'+context.record.customnumber1__c))*('1e'+(context.record.customcurrency1__c-context.record.customcurrency2__c)))/('1e'+(context.record.customcurrency1__c-context.record.customcurrency2__c))):null
+ (context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null&&context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customnumber1__c!=null&&(context.record.customcurrency1__c.sub(context.record.customcurrency2__c))!=null)?(((context.record.custompercent1__c.div(100)).mul('1e'+context.record.customnumber1__c.toFixed(0)).round().div('1e'+context.record.customnumber1__c.toFixed(0))).mul('1e'+(context.record.customcurrency1__c.sub(context.record.customcurrency2__c)).toFixed(0)).round().div('1e'+(context.record.customcurrency1__c.sub(context.record.customcurrency2__c)).toFixed(0))):null
+
+ ROUND(ROUND(COALESCE(($!s0s!$.custompercent1__c / 100.0), 0), COALESCE($!s0s!$.customnumber1__c, 0)::integer), COALESCE((COALESCE($!s0s!$.customcurrency1__c, 0)-COALESCE($!s0s!$.customcurrency2__c, 0)), 0)::integer)
+ null
+
+
+ ROUND(ROUND(($!s0s!$.custompercent1__c / 100.0), $!s0s!$.customnumber1__c::integer), ($!s0s!$.customcurrency1__c-$!s0s!$.customcurrency2__c)::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesSqrt.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesSqrt.xml
new file mode 100644
index 00000000..99fe430d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRoundUsesSqrt.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).round().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))
+ ($F.nvl(context.record.customnumber2__c,0)>0)?Number(Number(Math.sqrt($F.nvl(context.record.customnumber1__c,0))).toFixed($F.nvl(context.record.customnumber2__c,0)<=20?$F.nvl(context.record.customnumber2__c,0):20)):Math.round((Math.sqrt($F.nvl(context.record.customnumber1__c,0)))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber2__c>0)?Number(Number(Math.sqrt(context.record.customnumber1__c)).toFixed(context.record.customnumber2__c<=20?context.record.customnumber2__c:20)):Math.round((Math.sqrt(context.record.customnumber1__c))*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(($F.Decimal.sqrt(context.record.customnumber1__c)).mul('1e'+context.record.customnumber2__c.toFixed(0)).round().div('1e'+context.record.customnumber2__c.toFixed(0))):null
+
+ ROUND(SQRT(COALESCE($!s0s!$.customnumber1__c, 0)), COALESCE($!s0s!$.customnumber2__c, 0)::integer)
+ COALESCE($!s0s!$.customnumber1__c, 0)<0
+
+
+ ROUND(SQRT($!s0s!$.customnumber1__c), $!s0s!$.customnumber2__c::integer)
+ $!s0s!$.customnumber1__c<0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRpad.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRpad.xml
new file mode 100644
index 00000000..582bce58
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRpad.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customText1__c!=null)?((context.record.customText1__c+Array(256).join(' ')).substring(0,$F.nvl(context.record.customNumber1__c,new $F.Decimal('0')).toNumber())):null
+ (context.record.customText1__c!=null)?((context.record.customText1__c+Array(256).join(' ')).substring(0,$F.nvl(context.record.customNumber1__c,0))):null
+ (context.record.customText1__c!=null&&context.record.customNumber1__c!=null)?((context.record.customText1__c+Array(256).join(' ')).substring(0,context.record.customNumber1__c)):null
+ (context.record.customText1__c!=null&&context.record.customNumber1__c!=null)?((context.record.customText1__c+Array(256).join(' ')).substring(0,context.record.customNumber1__c.toNumber())):null
+
+ RPAD($!s0s!$.customText1__c, GREATEST(COALESCE($!s0s!$.customNumber1__c, 0)::integer,0))
+ null
+
+
+ RPAD($!s0s!$.customText1__c, GREATEST($!s0s!$.customNumber1__c::integer,0))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRpad2.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRpad2.xml
new file mode 100644
index 00000000..b34b4c3b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testRpad2.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customText1__c!=null&&context.record.customText2__c!=null)?((context.record.customText1__c+Array(256).join(context.record.customText2__c)).substring(0,$F.nvl(context.record.customNumber1__c,new $F.Decimal('0')).toNumber())):null
+ (context.record.customText1__c!=null&&context.record.customText2__c!=null)?((context.record.customText1__c+Array(256).join(context.record.customText2__c)).substring(0,$F.nvl(context.record.customNumber1__c,0))):null
+ (context.record.customText1__c!=null&&context.record.customNumber1__c!=null&&context.record.customText2__c!=null)?((context.record.customText1__c+Array(256).join(context.record.customText2__c)).substring(0,context.record.customNumber1__c)):null
+ (context.record.customText1__c!=null&&context.record.customNumber1__c!=null&&context.record.customText2__c!=null)?((context.record.customText1__c+Array(256).join(context.record.customText2__c)).substring(0,context.record.customNumber1__c.toNumber())):null
+
+ RPAD($!s0s!$.customText1__c, GREATEST(COALESCE($!s0s!$.customNumber1__c, 0)::integer,0), $!s0s!$.customText2__c)
+ null
+
+
+ RPAD($!s0s!$.customText1__c, GREATEST($!s0s!$.customNumber1__c::integer,0), $!s0s!$.customText2__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSecondValueWithValidInValid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSecondValueWithValidInValid.xml
new file mode 100644
index 00000000..a6bb0b9d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSecondValueWithValidInValid.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?((new $F.Decimal(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getSeconds()))):null
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getSeconds()):null
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getSeconds()):null
+ (context.record.dateString__c!=null)?((new $F.Decimal(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1)).getSeconds()))):null
+
+ TRUNC((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000-TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000/60000) * 60000)/1000)
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
+ TRUNC((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000-TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000/60000) * 60000)/1000)
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSecondWithValidString.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSecondWithValidString.xml
new file mode 100644
index 00000000..e1f6bfff
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSecondWithValidString.xml
@@ -0,0 +1,15 @@
+
+
+ new $F.Decimal('55')
+ 55
+ 55
+ new $F.Decimal('55')
+
+ 55
+ null
+
+
+ 55
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testShortCircuitingWithNullTerms.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testShortCircuitingWithNullTerms.xml
new file mode 100644
index 00000000..56c428ef
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testShortCircuitingWithNullTerms.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null&&(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>new Date(Date.UTC(new $F.Decimal('2000').toNumber(),new $F.Decimal('1').toNumber()-1,new $F.Decimal('1').toNumber()))):null)!=null && (((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>new Date(Date.UTC(new $F.Decimal('2000').toNumber(),new $F.Decimal('1').toNumber()-1,new $F.Decimal('1').toNumber()))):null))&&(($F.Decimal(context.record.customtext1__c).comparedTo(new $F.Decimal('0')) > 0)))?"True":"False")
+ (context.record.customtext1__c!=null&&(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>new Date(Date.UTC(2000,1-1,1))):null)!=null && (((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>new Date(Date.UTC(2000,1-1,1))):null))&&((Number(context.record.customtext1__c)>0)))?"True":"False")
+ (context.record.customtext1__c!=null&&(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>new Date(Date.UTC(2000,1-1,1))):null)!=null && (((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>new Date(Date.UTC(2000,1-1,1))):null))&&((Number(context.record.customtext1__c)>0)))?"True":"False")
+ (context.record.customtext1__c!=null&&(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>new Date(Date.UTC(new $F.Decimal('2000').toNumber(),new $F.Decimal('1').toNumber()-1,new $F.Decimal('1').toNumber()))):null)!=null && (((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))>new Date(Date.UTC(new $F.Decimal('2000').toNumber(),new $F.Decimal('1').toNumber()-1,new $F.Decimal('1').toNumber()))):null))&&(($F.Decimal(context.record.customtext1__c).comparedTo(new $F.Decimal('0')) > 0)))?"True":"False")
+
+ CASE WHEN (($!s0s!$.customdate1__c>TO_DATE((2000) || '-' || LEAST(GREATEST((1)::int, 1), 12) || '-' || LEAST(GREATEST((1)::int, 1), 31), 'YYYY-MM-DD')) AND (CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))>0)) THEN 'True' ELSE 'False' END
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$'
+
+
+ CASE WHEN (($!s0s!$.customdate1__c>TO_DATE((2000) || '-' || LEAST(GREATEST((1)::int, 1), 12) || '-' || LEAST(GREATEST((1)::int, 1), 31), 'YYYY-MM-DD')) AND (CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))>0)) THEN 'True' ELSE 'False' END
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSimpleRef.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSimpleRef.xml
new file mode 100644
index 00000000..cf85c7a1
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSimpleRef.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customNumber1__c,new $F.Decimal('0'))
+ $F.nvl(context.record.customNumber1__c,0)
+ context.record.customNumber1__c
+ context.record.customNumber1__c
+
+ COALESCE($!s0s!$.customNumber1__c, 0)
+ null
+
+
+ $!s0s!$.customNumber1__c
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSimpleRefText.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSimpleRefText.xml
new file mode 100644
index 00000000..c2a812f1
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSimpleRefText.xml
@@ -0,0 +1,15 @@
+
+
+ context.record.customText1__c
+ context.record.customText1__c
+ context.record.customText1__c
+ context.record.customText1__c
+
+ $!s0s!$.customText1__c
+ null
+
+
+ $!s0s!$.customText1__c
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSimpleSubstitute.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSimpleSubstitute.xml
new file mode 100644
index 00000000..91ca5bbc
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSimpleSubstitute.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null)?((context.record.customtext2__c === null ? null : (context.record.customtext3__c === null ? context.record.customtext1__c.replaceAll(context.record.customtext2__c,"") :context.record.customtext1__c.replaceAll(context.record.customtext2__c,context.record.customtext3__c)))):null
+ (context.record.customtext1__c!=null)?((context.record.customtext2__c === null ? null : (context.record.customtext3__c === null ? context.record.customtext1__c.replaceAll(context.record.customtext2__c,"") :context.record.customtext1__c.replaceAll(context.record.customtext2__c,context.record.customtext3__c)))):null
+ (context.record.customtext1__c!=null)?((context.record.customtext2__c === null ? null : (context.record.customtext3__c === null ? context.record.customtext1__c.replaceAll(context.record.customtext2__c,"") :context.record.customtext1__c.replaceAll(context.record.customtext2__c,context.record.customtext3__c)))):null
+ (context.record.customtext1__c!=null)?((context.record.customtext2__c === null ? null : (context.record.customtext3__c === null ? context.record.customtext1__c.replaceAll(context.record.customtext2__c,"") :context.record.customtext1__c.replaceAll(context.record.customtext2__c,context.record.customtext3__c)))):null
+
+ REPLACE($!s0s!$.customtext1__c, $!s0s!$.customtext2__c, $!s0s!$.customtext3__c)
+ null
+
+
+ REPLACE($!s0s!$.customtext1__c, $!s0s!$.customtext2__c, $!s0s!$.customtext3__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSine.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSine.xml
new file mode 100644
index 00000000..a6edacd8
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSine.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.sin($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ Math.sin($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.sin(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.sin(context.record.customnumber1__c)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtSwap.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtSwap.xml
new file mode 100644
index 00000000..82347153
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtSwap.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ Math.sqrt($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.sqrt(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.sqrt(context.record.customnumber1__c)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesCase.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesCase.xml
new file mode 100644
index 00000000..b9d0d29d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesCase.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.sqrt(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))):$F.nvl(context.record.customnumber3__c,new $F.Decimal('0'))))
+ Math.sqrt(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber1__c,0)):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?($F.nvl(context.record.customnumber2__c,0)):$F.nvl(context.record.customnumber3__c,0)))
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null)?(Math.sqrt(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c))):null
+ (((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c)!=null)?($F.Decimal.sqrt(((($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber1__c):(($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))&&(($F.anl([($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime())==($F.anl([($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0)))])?null:($F.anl([context.record.customdate3__c])?null:new Date(new Date(context.record.customdate3__c).setUTCHours(0,0,0,0))).getTime())))?(context.record.customnumber2__c):context.record.customnumber3__c))):null
+
+ SQRT(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END)
+ CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN COALESCE($!s0s!$.customnumber1__c, 0) WHEN $!s0s!$.customdate3__c THEN COALESCE($!s0s!$.customnumber2__c, 0) ELSE COALESCE($!s0s!$.customnumber3__c, 0) END<0
+
+
+ SQRT(CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END)
+ CASE $!s0s!$.customdate1__c WHEN $!s0s!$.customdate2__c THEN $!s0s!$.customnumber1__c WHEN $!s0s!$.customdate3__c THEN $!s0s!$.customnumber2__c ELSE $!s0s!$.customnumber3__c END<0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesCeil.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesCeil.xml
new file mode 100644
index 00000000..a85a34e8
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesCeil.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.sqrt(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor()))
+ Math.sqrt((($F.nvl(context.record.customnumber1__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber1__c,0)):Math.floor($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(Math.sqrt(((context.record.customnumber1__c)>=0?Math.ceil(context.record.customnumber1__c):Math.floor(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.sqrt((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).ceil():context.record.customnumber1__c.toDP(18).floor()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesExp.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesExp.xml
new file mode 100644
index 00000000..d3ccb14f
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesExp.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.sqrt($F.Decimal.exp($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))))
+ Math.sqrt(Math.exp($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(Math.sqrt(Math.exp(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.sqrt($F.Decimal.exp(context.record.customnumber1__c))):null
+
+ SQRT(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)))
+ EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18))<0
+
+
+ SQRT(EXP($!s0s!$.customnumber1__c::numeric(38,18)))
+ EXP($!s0s!$.customnumber1__c::numeric(38,18))<0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesFloor.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesFloor.xml
new file mode 100644
index 00000000..281f9674
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesFloor.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.sqrt(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil()))
+ Math.sqrt((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0))))
+ (context.record.customnumber1__c!=null)?(Math.sqrt(((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c)))):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.sqrt((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil()))):null
+
+ SQRT(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END)
+ CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END<0
+
+
+ SQRT(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END)
+ CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END<0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesLog.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesLog.xml
new file mode 100644
index 00000000..60d15b09
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesLog.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.Decimal.sqrt(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10))).mul('1e'+new $F.Decimal('15').toFixed(0)).round().div('1e'+new $F.Decimal('15').toFixed(0))
+ Number(Number(Math.sqrt(Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10)).toFixed(15<=20?15:20))
+ (context.record.customnumber1__c!=null)?(Number(Number(Math.sqrt(Math.log(context.record.customnumber1__c)/Math.LN10)).toFixed(15<=20?15:20))):null
+ (context.record.customnumber1__c!=null)?(($F.Decimal.sqrt((context.record.customnumber1__c).log(10))).mul('1e'+new $F.Decimal('15').toFixed(0)).round().div('1e'+new $F.Decimal('15').toFixed(0))):null
+
+ ROUND(SQRT(LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))), 15::integer)
+ COALESCE($!s0s!$.customnumber1__c, 0)<=0 OR LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))<0
+
+
+ ROUND(SQRT(LOG(10, $!s0s!$.customnumber1__c)), 15::integer)
+ $!s0s!$.customnumber1__c<=0 OR LOG(10, $!s0s!$.customnumber1__c)<0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesMinus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesMinus.xml
new file mode 100644
index 00000000..82f5a1af
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesMinus.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.sqrt(($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')).sub($F.nvl(context.record.customcurrency2__c,new $F.Decimal('0')))))
+ Math.sqrt(($F.nvl(context.record.customcurrency1__c,0)-$F.nvl(context.record.customcurrency2__c,0)))
+ (context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null)?(Math.sqrt((context.record.customcurrency1__c-context.record.customcurrency2__c))):null
+ (context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null)?($F.Decimal.sqrt((context.record.customcurrency1__c.sub(context.record.customcurrency2__c)))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesPlus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesPlus.xml
new file mode 100644
index 00000000..8389eb16
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesPlus.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.sqrt($F.nvl(($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).add($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))),new $F.Decimal('0')))
+ Math.sqrt($F.nvl(($F.nvl(context.record.customnumber1__c,0)+$F.nvl(context.record.customnumber2__c,0)),0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&(context.record.customnumber1__c+context.record.customnumber2__c)!=null)?(Math.sqrt((context.record.customnumber1__c+context.record.customnumber2__c))):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null&&(context.record.customnumber1__c.add(context.record.customnumber2__c))!=null)?($F.Decimal.sqrt((context.record.customnumber1__c.add(context.record.customnumber2__c)))):null
+
+ SQRT(COALESCE((COALESCE($!s0s!$.customnumber1__c, 0)+COALESCE($!s0s!$.customnumber2__c, 0)), 0))
+ COALESCE((COALESCE($!s0s!$.customnumber1__c, 0)+COALESCE($!s0s!$.customnumber2__c, 0)), 0)<0
+
+
+ SQRT(($!s0s!$.customnumber1__c+$!s0s!$.customnumber2__c))
+ ($!s0s!$.customnumber1__c+$!s0s!$.customnumber2__c)<0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesSqrt.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesSqrt.xml
new file mode 100644
index 00000000..464164f2
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSqrtUsesSqrt.xml
@@ -0,0 +1,15 @@
+
+
+ $F.Decimal.sqrt($F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))))
+ Math.sqrt(Math.sqrt($F.nvl(context.record.customnumber1__c,0)))
+ (context.record.customnumber1__c!=null)?(Math.sqrt(Math.sqrt(context.record.customnumber1__c))):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.sqrt($F.Decimal.sqrt(context.record.customnumber1__c))):null
+
+ SQRT(SQRT(COALESCE($!s0s!$.customnumber1__c, 0)))
+ COALESCE($!s0s!$.customnumber1__c, 0)<0 OR SQRT(COALESCE($!s0s!$.customnumber1__c, 0))<0
+
+
+ SQRT(SQRT($!s0s!$.customnumber1__c))
+ $!s0s!$.customnumber1__c<0 OR SQRT($!s0s!$.customnumber1__c)<0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDate.xml
new file mode 100644
index 00000000..8308843c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDate.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null)?((new $F.Decimal((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()-($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())/86400000))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null)?(((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()-($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())/86400000)):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null)?(((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()-($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())/86400000)):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null&&($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0)))!=null)?((new $F.Decimal((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getTime()-($F.anl([context.record.customdate2__c])?null:new Date(new Date(context.record.customdate2__c).setUTCHours(0,0,0,0))).getTime())/86400000))):null
+
+ ((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdate1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdate2__c)))::numeric/86400)
+ null
+
+
+ ((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdate1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdate2__c)))::numeric/86400)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTime.xml
new file mode 100644
index 00000000..d1aeb864
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null)?((new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null)?(((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null)?(((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null)?((new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000))):null
+
+ ((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400)
+ null
+
+
+ ((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeCorners1.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeCorners1.xml
new file mode 100644
index 00000000..8eb6072e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeCorners1.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null)?(((new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)).mul(new $F.Decimal('1440')).mul(new $F.Decimal('60')).isPos()?(new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)).mul(new $F.Decimal('1440')).mul(new $F.Decimal('60')).toDP(18).floor():(new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)).mul(new $F.Decimal('1440')).mul(new $F.Decimal('60')).toDP(18).ceil())):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null)?(((((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)*1440*60)>=0?Math.floor(((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)*1440*60):Math.ceil(((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)*1440*60))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null)?(((((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)*1440*60)>=0?Math.floor(((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)*1440*60):Math.ceil(((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)*1440*60))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null)?(((new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)).mul(new $F.Decimal('1440')).mul(new $F.Decimal('60')).isPos()?(new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)).mul(new $F.Decimal('1440')).mul(new $F.Decimal('60')).toDP(18).floor():(new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)).mul(new $F.Decimal('1440')).mul(new $F.Decimal('60')).toDP(18).ceil())):null
+
+ CASE WHEN ((((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400) * 1440) * 60)>=0 THEN FLOOR(ROUND(((((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400) * 1440) * 60)::numeric(38,18),33)) ELSE CEIL(ROUND(((((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400) * 1440) * 60)::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN ((((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400) * 1440) * 60)>=0 THEN FLOOR(ROUND(((((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400) * 1440) * 60)::numeric(38,18),33)) ELSE CEIL(ROUND(((((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400) * 1440) * 60)::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeCorners2.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeCorners2.xml
new file mode 100644
index 00000000..d19a7e1e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeCorners2.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null)?(((new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)).mul(new $F.Decimal('1440')).mul(new $F.Decimal('60')).isPos()?(new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)).mul(new $F.Decimal('1440')).mul(new $F.Decimal('60')).toDP(18).ceil():(new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)).mul(new $F.Decimal('1440')).mul(new $F.Decimal('60')).toDP(18).floor())):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null)?(((((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)*1440*60)>=0?Math.ceil(((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)*1440*60):Math.floor(((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)*1440*60))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null)?(((((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)*1440*60)>=0?Math.ceil(((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)*1440*60):Math.floor(((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)*1440*60))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c))!=null)?(((new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)).mul(new $F.Decimal('1440')).mul(new $F.Decimal('60')).isPos()?(new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)).mul(new $F.Decimal('1440')).mul(new $F.Decimal('60')).toDP(18).ceil():(new $F.Decimal((($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-($F.anl([context.record.customdatetime2__c])?null:$F.parseDateTime(context.record.customdatetime2__c)).getTime())/86400000)).mul(new $F.Decimal('1440')).mul(new $F.Decimal('60')).toDP(18).floor())):null
+
+ CASE WHEN ((((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400) * 1440) * 60)>=0 THEN CEIL(ROUND(((((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400) * 1440) * 60)::numeric(38,18),33)) ELSE FLOOR(ROUND(((((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400) * 1440) * 60)::numeric(38,18),33)) END
+ null
+
+
+ CASE WHEN ((((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400) * 1440) * 60)>=0 THEN CEIL(ROUND(((((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400) * 1440) * 60)::numeric(38,18),33)) ELSE FLOOR(ROUND(((((EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime1__c))-EXTRACT(EPOCH FROM DATE_TRUNC('second', $!s0s!$.customdatetime2__c)))::numeric/86400) * 1440) * 60)::numeric(38,18),33)) END
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeGivingDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeGivingDate.xml
new file mode 100644
index 00000000..8aa8b9dd
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeGivingDate.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*($F.nvl(context.record.customnumber1__c,0)))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*(context.record.customnumber1__c))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*(context.record.customnumber1__c))*1000)))):null
+
+ DATE_TRUNC('second', ($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0)))::timestamp
+ null
+
+
+ DATE_TRUNC('second', ($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*$!s0s!$.customnumber1__c*86400.0)))::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeGivingDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeGivingDateTime.xml
new file mode 100644
index 00000000..ca9221da
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeGivingDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*($F.nvl(context.record.customnumber1__c,0)))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*(context.record.customnumber1__c))*1000)))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*(context.record.customnumber1__c))*1000)))):null
+
+ DATE_TRUNC('second', ($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0)))::timestamp
+ null
+
+
+ DATE_TRUNC('second', ($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*$!s0s!$.customnumber1__c*86400.0)))::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeGivingDateValue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeGivingDateValue.xml
new file mode 100644
index 00000000..2fe5cc0e
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubDateTimeGivingDateValue.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?(new Date((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))))*1000))).setUTCHours(0,0,0,0))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null)?(new Date((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*($F.nvl(context.record.customnumber1__c,0)))*1000))).setUTCHours(0,0,0,0))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?(new Date((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*(context.record.customnumber1__c))*1000))).setUTCHours(0,0,0,0))):null
+ (($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c))!=null&&context.record.customnumber1__c!=null)?(new Date((new Date(($F.anl([context.record.customdatetime1__c])?null:$F.parseDateTime(context.record.customdatetime1__c)).getTime()-(Math.round(86400*(context.record.customnumber1__c))*1000))).setUTCHours(0,0,0,0))):null
+
+ DATE_TRUNC('DAY', (DATE_TRUNC('second', ($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0)))::timestamp AT TIME ZONE 'UTC') AT TIME ZONE '__TZ_ID__')::timestamp
+ null
+
+
+ DATE_TRUNC('DAY', (DATE_TRUNC('second', ($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*$!s0s!$.customnumber1__c*86400.0)))::timestamp AT TIME ZONE 'UTC') AT TIME ZONE '__TZ_ID__')::timestamp
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubSimple.xml
new file mode 100644
index 00000000..5879ec60
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubSimple.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).sub($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))))
+ ($F.nvl(context.record.customnumber1__c,0)-$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c-context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c.sub(context.record.customnumber2__c))):null
+
+ (COALESCE($!s0s!$.customnumber1__c, 0)-COALESCE($!s0s!$.customnumber2__c, 0))
+ null
+
+
+ ($!s0s!$.customnumber1__c-$!s0s!$.customnumber2__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubUnary.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubUnary.xml
new file mode 100644
index 00000000..cee4e530
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubUnary.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).neg()
+ (-$F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?((-context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?(context.record.customnumber1__c.neg()):null
+
+ (-COALESCE($!s0s!$.customnumber1__c, 0))
+ null
+
+
+ (-$!s0s!$.customnumber1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubWithDivision.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubWithDivision.xml
new file mode 100644
index 00000000..60bfe58b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubWithDivision.xml
@@ -0,0 +1,15 @@
+
+
+ $F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div(($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).sub(new $F.Decimal('1'))))
+ ($F.nvl(context.record.customnumber1__c,0)/($F.nvl(context.record.customnumber2__c,0)-1))
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?((context.record.customnumber1__c/(context.record.customnumber2__c-1))):null
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?(context.record.customnumber1__c.div((context.record.customnumber2__c.sub(new $F.Decimal('1'))))):null
+
+ (COALESCE($!s0s!$.customnumber1__c, 0)/(COALESCE($!s0s!$.customnumber2__c, 0)-1))
+ (COALESCE($!s0s!$.customnumber2__c, 0)-1)=0
+
+
+ ($!s0s!$.customnumber1__c/($!s0s!$.customnumber2__c-1))
+ ($!s0s!$.customnumber2__c-1)=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubWithDivisionSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubWithDivisionSimple.xml
new file mode 100644
index 00000000..1d3a838d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubWithDivisionSimple.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).div($F.nvl(context.record.customnumber2__c,new $F.Decimal('0'))).sub(new $F.Decimal('1')))
+ (($F.nvl(context.record.customnumber1__c,0)/$F.nvl(context.record.customnumber2__c,0))-1)
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((context.record.customnumber1__c/context.record.customnumber2__c)-1)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c.div(context.record.customnumber2__c).sub(new $F.Decimal('1')))):null
+
+ ((COALESCE($!s0s!$.customnumber1__c, 0)/COALESCE($!s0s!$.customnumber2__c, 0))-1)
+ COALESCE($!s0s!$.customnumber2__c, 0)=0
+
+
+ (($!s0s!$.customnumber1__c/$!s0s!$.customnumber2__c)-1)
+ $!s0s!$.customnumber2__c=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubstr2.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubstr2.xml
new file mode 100644
index 00000000..888a81c6
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubstr2.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext__c!=null)?(context.record.customtext__c.substr(Math.max($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber()+($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber()>=0 ? -1 : (context.record.customtext__c).length),0))):null
+ (context.record.customtext__c!=null)?(context.record.customtext__c.substr(Math.max($F.nvl(context.record.customnumber1__c,0)+($F.nvl(context.record.customnumber1__c,0)>=0 ? -1 : (context.record.customtext__c).length),0))):null
+ (context.record.customtext__c!=null&&context.record.customnumber1__c!=null)?(context.record.customtext__c.substr(Math.max(context.record.customnumber1__c+(context.record.customnumber1__c>=0 ? -1 : (context.record.customtext__c).length),0))):null
+ (context.record.customtext__c!=null&&context.record.customnumber1__c!=null)?(context.record.customtext__c.substr(Math.max(context.record.customnumber1__c.toNumber()+(context.record.customnumber1__c.toNumber()>=0 ? -1 : (context.record.customtext__c).length),0))):null
+
+ SUBSTR($!s0s!$.customtext__c, CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0) >= 0 THEN GREATEST(COALESCE($!s0s!$.customnumber1__c, 0)::integer,1) ELSE NULLIF(GREATEST(LENGTH($!s0s!$.customtext__c) + 1 + COALESCE($!s0s!$.customnumber1__c, 0)::integer,0),0) END)
+ null
+
+
+ SUBSTR($!s0s!$.customtext__c, CASE WHEN $!s0s!$.customnumber1__c >= 0 THEN GREATEST($!s0s!$.customnumber1__c::integer,1) ELSE NULLIF(GREATEST(LENGTH($!s0s!$.customtext__c) + 1 + $!s0s!$.customnumber1__c::integer,0),0) END)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubstr3.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubstr3.xml
new file mode 100644
index 00000000..63efe8d6
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubstr3.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext__c!=null)?(context.record.customtext__c.substr(Math.max($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber()+($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toNumber()>=0 ? -1 : (context.record.customtext__c).length),0),Math.max($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')),0))):null
+ (context.record.customtext__c!=null)?(context.record.customtext__c.substr(Math.max($F.nvl(context.record.customnumber1__c,0)+($F.nvl(context.record.customnumber1__c,0)>=0 ? -1 : (context.record.customtext__c).length),0),Math.max($F.nvl(context.record.customnumber2__c,0),0))):null
+ (context.record.customtext__c!=null&&context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(context.record.customtext__c.substr(Math.max(context.record.customnumber1__c+(context.record.customnumber1__c>=0 ? -1 : (context.record.customtext__c).length),0),Math.max(context.record.customnumber2__c,0))):null
+ (context.record.customtext__c!=null&&context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(context.record.customtext__c.substr(Math.max(context.record.customnumber1__c.toNumber()+(context.record.customnumber1__c.toNumber()>=0 ? -1 : (context.record.customtext__c).length),0),Math.max(context.record.customnumber2__c,0))):null
+
+ SUBSTR($!s0s!$.customtext__c, CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0) >= 0 THEN GREATEST(COALESCE($!s0s!$.customnumber1__c, 0)::integer,1) ELSE NULLIF(GREATEST(LENGTH($!s0s!$.customtext__c) + 1 + COALESCE($!s0s!$.customnumber1__c, 0)::integer,0),0) END, GREATEST(COALESCE($!s0s!$.customnumber2__c, 0)::integer,0))
+ null
+
+
+ SUBSTR($!s0s!$.customtext__c, CASE WHEN $!s0s!$.customnumber1__c >= 0 THEN GREATEST($!s0s!$.customnumber1__c::integer,1) ELSE NULLIF(GREATEST(LENGTH($!s0s!$.customtext__c) + 1 + $!s0s!$.customnumber1__c::integer,0),0) END, GREATEST($!s0s!$.customnumber2__c::integer,0))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubtractBigTimeValue.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubtractBigTimeValue.xml
new file mode 100644
index 00000000..cc95dee7
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubtractBigTimeValue.xml
@@ -0,0 +1,7 @@
+
+
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()-new $F.Decimal('180000000').toNumber()))):null
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()-180000000))):null
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()-180000000))):null
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()-new $F.Decimal('180000000').toNumber()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubtractTimeValueWithValidInValid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubtractTimeValueWithValidInValid.xml
new file mode 100644
index 00000000..54cd40f6
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubtractTimeValueWithValidInValid.xml
@@ -0,0 +1,7 @@
+
+
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()-new $F.Decimal('7200000').toNumber()))):null
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()-7200000))):null
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()-7200000))):null
+ (context.record.dateString__c!=null)?((new Date(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).getTime()-new $F.Decimal('7200000').toNumber()))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubtractTwoTimeFields.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubtractTwoTimeFields.xml
new file mode 100644
index 00000000..ab38ba6b
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testSubtractTwoTimeFields.xml
@@ -0,0 +1,7 @@
+
+
+ (context.record.timeString1__c!=null&&context.record.timeString2__c!=null)?(((new $F.Decimal(new Date(new Date(context.record.timeString2__c).setUTCFullYear(1970,0,1)).getTime()-new Date(new Date(context.record.timeString1__c).setUTCFullYear(1970,0,1)).getTime()+86400000).mod(86400000)))):null
+ (context.record.timeString1__c!=null&&context.record.timeString2__c!=null)?((((new Date(new Date(context.record.timeString2__c).setUTCFullYear(1970,0,1)).getTime()-new Date(new Date(context.record.timeString1__c).setUTCFullYear(1970,0,1)).getTime()+86400000)%86400000))):null
+ (context.record.timeString1__c!=null&&context.record.timeString2__c!=null)?((((new Date(new Date(context.record.timeString2__c).setUTCFullYear(1970,0,1)).getTime()-new Date(new Date(context.record.timeString1__c).setUTCFullYear(1970,0,1)).getTime()+86400000)%86400000))):null
+ (context.record.timeString1__c!=null&&context.record.timeString2__c!=null)?(((new $F.Decimal(new Date(new Date(context.record.timeString2__c).setUTCFullYear(1970,0,1)).getTime()-new Date(new Date(context.record.timeString1__c).setUTCFullYear(1970,0,1)).getTime()+86400000).mod(86400000)))):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTangent.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTangent.xml
new file mode 100644
index 00000000..2171210a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTangent.xml
@@ -0,0 +1,7 @@
+
+
+ $F.Decimal.tan($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))
+ Math.tan($F.nvl(context.record.customnumber1__c,0))
+ (context.record.customnumber1__c!=null)?(Math.tan(context.record.customnumber1__c)):null
+ (context.record.customnumber1__c!=null)?($F.Decimal.tan(context.record.customnumber1__c)):null
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTextFunctionWithCustomDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTextFunctionWithCustomDate.xml
new file mode 100644
index 00000000..bda93405
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTextFunctionWithCustomDate.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).toISOString().substring(0, 10)):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).toISOString().substring(0, 10)):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).toISOString().substring(0, 10)):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).toISOString().substring(0, 10)):null
+
+ (TO_CHAR($!s0s!$.customdate1__c, 'YYYY-MM-DD'))
+ null
+
+
+ (TO_CHAR($!s0s!$.customdate1__c, 'YYYY-MM-DD'))
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTextFunctionWithDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTextFunctionWithDate.xml
new file mode 100644
index 00000000..19d94173
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTextFunctionWithDate.xml
@@ -0,0 +1,15 @@
+
+
+ "2013-12-31"
+ "2013-12-31"
+ "2013-12-31"
+ "2013-12-31"
+
+ '2013-12-31'
+ null
+
+
+ '2013-12-31'
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTextFunctionWithDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTextFunctionWithDateTime.xml
new file mode 100644
index 00000000..a1bc4300
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTextFunctionWithDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ "2013-12-31 01:02:03Z"
+ "2013-12-31 01:02:03Z"
+ "2013-12-31 01:02:03Z"
+ "2013-12-31 01:02:03Z"
+
+ '2013-12-31 01:02:03Z'
+ null
+
+
+ '2013-12-31 01:02:03Z'
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTextTimeValueWithValidInValid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTextTimeValueWithValidInValid.xml
new file mode 100644
index 00000000..013b89d0
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTextTimeValueWithValidInValid.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).toISOString().substring(11,23)):null
+ (context.record.dateString__c!=null)?(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).toISOString().substring(11,23)):null
+ (context.record.dateString__c!=null)?(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).toISOString().substring(11,23)):null
+ (context.record.dateString__c!=null)?(new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1)).toISOString().substring(11,23)):null
+
+ LPAD(TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/3600000)::int::text,2,'0') || ':' || LPAD((TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/60000)::int % 60)::text,2,'0') || ':' || LPAD((TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/1000)::int % 60)::text,2,'0') || '.' || LPAD((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000::int % 1000)::text,3,'0')
+ NOT $!s0s!$.dateString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$'
+
+
+ LPAD(TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/3600000)::int::text,2,'0') || ':' || LPAD((TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/60000)::int % 60)::text,2,'0') || ':' || LPAD((TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/1000)::int % 60)::text,2,'0') || '.' || LPAD((CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000::int % 1000)::text,3,'0')
+ NOT $!s0s!$.dateString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTimeValueWithValidInValid.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTimeValueWithValidInValid.xml
new file mode 100644
index 00000000..97229a5d
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTimeValueWithValidInValid.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1))):null
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1))):null
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1))):null
+ (context.record.dateString__c!=null)?(new Date($F.parseDateTime(context.record.dateString__c).setUTCFullYear(1970,0,1))):null
+
+ CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
+ CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS')))) AS DECIMAL(38,18)) * 1000
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTimeValueWithValidString.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTimeValueWithValidString.xml
new file mode 100644
index 00000000..58f1561c
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTimeValueWithValidString.xml
@@ -0,0 +1,7 @@
+
+
+ new Date(new Date("10:40:55.666").setUTCFullYear(1970,0,1))
+ new Date(new Date("10:40:55.666").setUTCFullYear(1970,0,1))
+ new Date(new Date("10:40:55.666").setUTCFullYear(1970,0,1))
+ new Date(new Date("10:40:55.666").setUTCFullYear(1970,0,1))
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTrim.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTrim.xml
new file mode 100644
index 00000000..7a2691a2
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTrim.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null)?(context.record.customtext1__c.trim()):null
+ (context.record.customtext1__c!=null)?(context.record.customtext1__c.trim()):null
+ (context.record.customtext1__c!=null)?(context.record.customtext1__c.trim()):null
+ (context.record.customtext1__c!=null)?(context.record.customtext1__c.trim()):null
+
+ TRIM($!s0s!$.customtext1__c)
+ null
+
+
+ TRIM($!s0s!$.customtext1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncSimple.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncSimple.xml
new file mode 100644
index 00000000..24880203
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncSimple.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).trunc().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))
+ Math.trunc(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.trunc((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).trunc().div('1e'+context.record.customnumber2__c.toFixed(0))):null
+
+ TRUNC(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)
+ null
+
+
+ TRUNC($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncSwapTypes.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncSwapTypes.xml
new file mode 100644
index 00000000..7c2e65c6
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncSwapTypes.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).trunc().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))
+ Math.trunc(($F.nvl(context.record.customnumber1__c,0))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.trunc((context.record.customnumber1__c)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?((context.record.customnumber1__c).mul('1e'+context.record.customnumber2__c.toFixed(0)).trunc().div('1e'+context.record.customnumber2__c.toFixed(0))):null
+
+ TRUNC(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)
+ null
+
+
+ TRUNC($!s0s!$.customnumber1__c, $!s0s!$.customnumber2__c::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesExp.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesExp.xml
new file mode 100644
index 00000000..2d223b1a
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesExp.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.Decimal.exp($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).mul('1e'+($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toDP(18).floor()).toFixed(0)).trunc().div('1e'+($F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toDP(18).ceil():$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toDP(18).floor()).toFixed(0))
+ Math.trunc((Math.exp($F.nvl(context.record.customnumber1__c,0)))*('1e'+(($F.nvl(context.record.customnumber2__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber2__c,0)):Math.floor($F.nvl(context.record.customnumber2__c,0)))))/('1e'+(($F.nvl(context.record.customnumber2__c,0))>=0?Math.ceil($F.nvl(context.record.customnumber2__c,0)):Math.floor($F.nvl(context.record.customnumber2__c,0))))
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?(Math.trunc((Math.exp(context.record.customnumber1__c))*('1e'+((context.record.customnumber2__c)>=0?Math.ceil(context.record.customnumber2__c):Math.floor(context.record.customnumber2__c))))/('1e'+((context.record.customnumber2__c)>=0?Math.ceil(context.record.customnumber2__c):Math.floor(context.record.customnumber2__c)))):null
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?(($F.Decimal.exp(context.record.customnumber1__c)).mul('1e'+(context.record.customnumber2__c.isPos()?context.record.customnumber2__c.toDP(18).ceil():context.record.customnumber2__c.toDP(18).floor()).toFixed(0)).trunc().div('1e'+(context.record.customnumber2__c.isPos()?context.record.customnumber2__c.toDP(18).ceil():context.record.customnumber2__c.toDP(18).floor()).toFixed(0))):null
+
+ TRUNC(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber2__c, 0)::numeric(38,18),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber2__c, 0)::numeric(38,18),33)) END::integer)
+ null
+
+
+ TRUNC(EXP($!s0s!$.customnumber1__c::numeric(38,18)), CASE WHEN $!s0s!$.customnumber2__c>=0 THEN CEIL(ROUND($!s0s!$.customnumber2__c::numeric(38,18),33)) ELSE FLOOR(ROUND($!s0s!$.customnumber2__c::numeric(38,18),33)) END::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesFloorAbs.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesFloorAbs.xml
new file mode 100644
index 00000000..452c8363
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesFloorAbs.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).isPos()?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).floor():$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toDP(18).ceil())).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).abs().toFixed(0)).trunc().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).abs().toFixed(0))
+ Math.trunc(((($F.nvl(context.record.customnumber1__c,0))>=0?Math.floor($F.nvl(context.record.customnumber1__c,0)):Math.ceil($F.nvl(context.record.customnumber1__c,0))))*('1e'+Math.abs($F.nvl(context.record.customnumber2__c,0))))/('1e'+Math.abs($F.nvl(context.record.customnumber2__c,0)))
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?(Math.trunc((((context.record.customnumber1__c)>=0?Math.floor(context.record.customnumber1__c):Math.ceil(context.record.customnumber1__c)))*('1e'+Math.abs(context.record.customnumber2__c)))/('1e'+Math.abs(context.record.customnumber2__c))):null
+ (context.record.customnumber2__c!=null&&context.record.customnumber1__c!=null)?(((context.record.customnumber1__c.isPos()?context.record.customnumber1__c.toDP(18).floor():context.record.customnumber1__c.toDP(18).ceil())).mul('1e'+context.record.customnumber2__c.abs().toFixed(0)).trunc().div('1e'+context.record.customnumber2__c.abs().toFixed(0))):null
+
+ TRUNC(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18),33)) END, ABS(COALESCE($!s0s!$.customnumber2__c, 0))::integer)
+ null
+
+
+ TRUNC(CASE WHEN $!s0s!$.customnumber1__c>=0 THEN FLOOR(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) ELSE CEIL(ROUND($!s0s!$.customnumber1__c::numeric(38,18),33)) END, ABS($!s0s!$.customnumber2__c)::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesIf.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesIf.xml
new file mode 100644
index 00000000..adade651
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesIf.xml
@@ -0,0 +1,15 @@
+
+
+ ((context.record.customcheckbox1__c?$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')):$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')))).mul('1e'+$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')).toFixed(0)).trunc().div('1e'+$F.nvl(context.record.customnumber3__c,new $F.Decimal('0')).toFixed(0))
+ Math.trunc(((context.record.customcheckbox1__c?$F.nvl(context.record.customnumber1__c,0):$F.nvl(context.record.customnumber2__c,0)))*('1e'+$F.nvl(context.record.customnumber3__c,0)))/('1e'+$F.nvl(context.record.customnumber3__c,0))
+ ((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c)!=null&&context.record.customnumber3__c!=null)?(Math.trunc(((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c))*('1e'+context.record.customnumber3__c))/('1e'+context.record.customnumber3__c)):null
+ ((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c)!=null&&context.record.customnumber3__c!=null)?(((context.record.customcheckbox1__c?context.record.customnumber1__c:context.record.customnumber2__c)).mul('1e'+context.record.customnumber3__c.toFixed(0)).trunc().div('1e'+context.record.customnumber3__c.toFixed(0))):null
+
+ TRUNC(CASE WHEN (COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') THEN COALESCE($!s0s!$.customnumber1__c, 0) ELSE COALESCE($!s0s!$.customnumber2__c, 0) END, COALESCE($!s0s!$.customnumber3__c, 0)::integer)
+ null
+
+
+ TRUNC(CASE WHEN (COALESCE($!s0s!$.customcheckbox1__c, '0') = '1') THEN $!s0s!$.customnumber1__c ELSE $!s0s!$.customnumber2__c END, $!s0s!$.customnumber3__c::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesLn.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesLn.xml
new file mode 100644
index 00000000..9cc62645
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesLn.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).ln()).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).trunc().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))
+ Math.trunc((Math.log($F.nvl(context.record.customnumber1__c,0)))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.trunc((Math.log(context.record.customnumber1__c))*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((context.record.customnumber1__c).ln()).mul('1e'+context.record.customnumber2__c.toFixed(0)).trunc().div('1e'+context.record.customnumber2__c.toFixed(0))):null
+
+ TRUNC(LN(COALESCE($!s0s!$.customnumber1__c, 0)), COALESCE($!s0s!$.customnumber2__c, 0)::integer)
+ COALESCE($!s0s!$.customnumber1__c, 0)<=0
+
+
+ TRUNC(LN($!s0s!$.customnumber1__c), $!s0s!$.customnumber2__c::integer)
+ $!s0s!$.customnumber1__c<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesLog.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesLog.xml
new file mode 100644
index 00000000..40a32d22
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesLog.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl(context.record.customnumber1__c,new $F.Decimal('0'))).log(10)).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).trunc().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))
+ Math.trunc((Math.log($F.nvl(context.record.customnumber1__c,0))/Math.LN10)*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.trunc((Math.log(context.record.customnumber1__c)/Math.LN10)*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(((context.record.customnumber1__c).log(10)).mul('1e'+context.record.customnumber2__c.toFixed(0)).trunc().div('1e'+context.record.customnumber2__c.toFixed(0))):null
+
+ TRUNC(LOG(10, COALESCE($!s0s!$.customnumber1__c, 0)), COALESCE($!s0s!$.customnumber2__c, 0)::integer)
+ COALESCE($!s0s!$.customnumber1__c, 0)<=0
+
+
+ TRUNC(LOG(10, $!s0s!$.customnumber1__c), $!s0s!$.customnumber2__c::integer)
+ $!s0s!$.customnumber1__c<=0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesSqrt.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesSqrt.xml
new file mode 100644
index 00000000..b397f288
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesSqrt.xml
@@ -0,0 +1,15 @@
+
+
+ ($F.Decimal.sqrt($F.nvl(context.record.customnumber1__c,new $F.Decimal('0')))).mul('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0)).trunc().div('1e'+$F.nvl(context.record.customnumber2__c,new $F.Decimal('0')).toFixed(0))
+ Math.trunc((Math.sqrt($F.nvl(context.record.customnumber1__c,0)))*('1e'+$F.nvl(context.record.customnumber2__c,0)))/('1e'+$F.nvl(context.record.customnumber2__c,0))
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(Math.trunc((Math.sqrt(context.record.customnumber1__c))*('1e'+context.record.customnumber2__c))/('1e'+context.record.customnumber2__c)):null
+ (context.record.customnumber1__c!=null&&context.record.customnumber2__c!=null)?(($F.Decimal.sqrt(context.record.customnumber1__c)).mul('1e'+context.record.customnumber2__c.toFixed(0)).trunc().div('1e'+context.record.customnumber2__c.toFixed(0))):null
+
+ TRUNC(SQRT(COALESCE($!s0s!$.customnumber1__c, 0)), COALESCE($!s0s!$.customnumber2__c, 0)::integer)
+ COALESCE($!s0s!$.customnumber1__c, 0)<0
+
+
+ TRUNC(SQRT($!s0s!$.customnumber1__c), $!s0s!$.customnumber2__c::integer)
+ $!s0s!$.customnumber1__c<0
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesTruncMinus.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesTruncMinus.xml
new file mode 100644
index 00000000..884c40e7
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testTruncUsesTruncMinus.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c.div(100)):null,new $F.Decimal('0'))).mul('1e'+$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toFixed(0)).trunc().div('1e'+$F.nvl(context.record.customnumber1__c,new $F.Decimal('0')).toFixed(0))).mul('1e'+$F.nvl(($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')).sub($F.nvl(context.record.customcurrency2__c,new $F.Decimal('0')))),new $F.Decimal('0')).toFixed(0)).trunc().div('1e'+$F.nvl(($F.nvl(context.record.customcurrency1__c,new $F.Decimal('0')).sub($F.nvl(context.record.customcurrency2__c,new $F.Decimal('0')))),new $F.Decimal('0')).toFixed(0))
+ Math.trunc((Math.trunc(($F.nvl((context.record.custompercent1__c!=null)?(context.record.custompercent1__c/100.0):null,0))*('1e'+$F.nvl(context.record.customnumber1__c,0)))/('1e'+$F.nvl(context.record.customnumber1__c,0)))*('1e'+$F.nvl(($F.nvl(context.record.customcurrency1__c,0)-$F.nvl(context.record.customcurrency2__c,0)),0)))/('1e'+$F.nvl(($F.nvl(context.record.customcurrency1__c,0)-$F.nvl(context.record.customcurrency2__c,0)),0))
+ (context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null&&context.record.custompercent1__c!=null&&context.record.custompercent1__c/100.0!=null&&context.record.customnumber1__c!=null&&(context.record.customcurrency1__c-context.record.customcurrency2__c)!=null)?(Math.trunc((Math.trunc((context.record.custompercent1__c/100.0)*('1e'+context.record.customnumber1__c))/('1e'+context.record.customnumber1__c))*('1e'+(context.record.customcurrency1__c-context.record.customcurrency2__c)))/('1e'+(context.record.customcurrency1__c-context.record.customcurrency2__c))):null
+ (context.record.customcurrency1__c!=null&&context.record.customcurrency2__c!=null&&context.record.custompercent1__c!=null&&context.record.custompercent1__c.div(100)!=null&&context.record.customnumber1__c!=null&&(context.record.customcurrency1__c.sub(context.record.customcurrency2__c))!=null)?(((context.record.custompercent1__c.div(100)).mul('1e'+context.record.customnumber1__c.toFixed(0)).trunc().div('1e'+context.record.customnumber1__c.toFixed(0))).mul('1e'+(context.record.customcurrency1__c.sub(context.record.customcurrency2__c)).toFixed(0)).trunc().div('1e'+(context.record.customcurrency1__c.sub(context.record.customcurrency2__c)).toFixed(0))):null
+
+ TRUNC(TRUNC(COALESCE(($!s0s!$.custompercent1__c / 100.0), 0), COALESCE($!s0s!$.customnumber1__c, 0)::integer), COALESCE((COALESCE($!s0s!$.customcurrency1__c, 0)-COALESCE($!s0s!$.customcurrency2__c, 0)), 0)::integer)
+ null
+
+
+ TRUNC(TRUNC(($!s0s!$.custompercent1__c / 100.0), $!s0s!$.customnumber1__c::integer), ($!s0s!$.customcurrency1__c-$!s0s!$.customcurrency2__c)::integer)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUnixTimestampWithDate.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUnixTimestampWithDate.xml
new file mode 100644
index 00000000..0ed7d775
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUnixTimestampWithDate.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?((new $F.Decimal(Math.trunc((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))).getTime()/1000)))):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(Math.trunc((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))).getTime()/1000)):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(Math.trunc((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))).getTime()/1000)):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?((new $F.Decimal(Math.trunc((($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))).getTime()/1000)))):null
+
+ EXTRACT(EPOCH FROM $!s0s!$.customdate1__c)::numeric
+ null
+
+
+ EXTRACT(EPOCH FROM $!s0s!$.customdate1__c)::numeric
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUnixTimestampWithDateTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUnixTimestampWithDateTime.xml
new file mode 100644
index 00000000..9c48f366
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUnixTimestampWithDateTime.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?((new $F.Decimal(Math.trunc(($F.parseDateTime(context.record.dateString__c)).getTime()/1000)))):null
+ (context.record.dateString__c!=null)?(Math.trunc(($F.parseDateTime(context.record.dateString__c)).getTime()/1000)):null
+ (context.record.dateString__c!=null)?(Math.trunc(($F.parseDateTime(context.record.dateString__c)).getTime()/1000)):null
+ (context.record.dateString__c!=null)?((new $F.Decimal(Math.trunc(($F.parseDateTime(context.record.dateString__c)).getTime()/1000)))):null
+
+ EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS'))::numeric
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
+ EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'YYYY-MM-DD HH24:MI:SS'))::numeric
+ NOT $!s0s!$.dateString__c ~ '^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01]) ([01]?[0-9]|2[0-3]):[0-5]?\d:[0-5]?\d$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUnixTimestampWithTime.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUnixTimestampWithTime.xml
new file mode 100644
index 00000000..44718299
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUnixTimestampWithTime.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.dateString__c!=null)?((new $F.Decimal(Math.trunc((new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1))).getTime()/1000)))):null
+ (context.record.dateString__c!=null)?(Math.trunc((new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1))).getTime()/1000)):null
+ (context.record.dateString__c!=null)?(Math.trunc((new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1))).getTime()/1000)):null
+ (context.record.dateString__c!=null)?((new $F.Decimal(Math.trunc((new Date(new Date(context.record.dateString__c).setUTCFullYear(1970,0,1))).getTime()/1000)))):null
+
+ TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/1000)
+ NOT $!s0s!$.dateString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$'
+
+
+ TRUNC(CAST(EXTRACT(EPOCH FROM (TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS') - DATE_TRUNC('day', TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')))) AS DECIMAL(38,18)) * 1000/1000)
+ NOT $!s0s!$.dateString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUpper.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUpper.xml
new file mode 100644
index 00000000..8e53b267
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUpper.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toUpperCase()):null
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toUpperCase()):null
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toUpperCase()):null
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toUpperCase()):null
+
+ UPPER($!s0s!$.customText1__c)
+ null
+
+
+ UPPER($!s0s!$.customText1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUpperLocale.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUpperLocale.xml
new file mode 100644
index 00000000..3405f0eb
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testUpperLocale.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toLocaleUpperCase(($F.anl([context.record.customText2__c])?'en':context.record.customText2__c.replace("_","-")))):null
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toLocaleUpperCase(($F.anl([context.record.customText2__c])?'en':context.record.customText2__c.replace("_","-")))):null
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toLocaleUpperCase(($F.anl([context.record.customText2__c])?'en':context.record.customText2__c.replace("_","-")))):null
+ (context.record.customText1__c!=null)?(context.record.customText1__c.toLocaleUpperCase(($F.anl([context.record.customText2__c])?'en':context.record.customText2__c.replace("_","-")))):null
+
+ UPPER($!s0s!$.customText1__c)
+ null
+
+
+ UPPER($!s0s!$.customText1__c)
+ null
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testVALUE.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testVALUE.xml
new file mode 100644
index 00000000..43fbe8ec
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testVALUE.xml
@@ -0,0 +1,15 @@
+
+
+ (context.record.customtext1__c!=null)?($F.Decimal(context.record.customtext1__c)):null
+ (context.record.customtext1__c!=null)?(Number(context.record.customtext1__c)):null
+ (context.record.customtext1__c!=null)?(Number(context.record.customtext1__c)):null
+ (context.record.customtext1__c!=null)?($F.Decimal(context.record.customtext1__c)):null
+
+ CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$'
+
+
+ CAST($!s0s!$.customtext1__c AS DECIMAL(38,18))
+ NOT REGEXP_REPLACE($!s0s!$.customtext1__c,'[0-9]+','0','g') ~ '^[+-]?(0|0\.|\.0|0\.0)([Ee][+-]?0)?$'
+
+
diff --git a/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testWeekday.xml b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testWeekday.xml
new file mode 100644
index 00000000..1ce1c7ac
--- /dev/null
+++ b/impl/src/test/goldfiles/FormulaFields/v2/datacloud/testWeekday.xml
@@ -0,0 +1,15 @@
+
+
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCDay()+1):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCDay()+1):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCDay()+1):null
+ (($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0)))!=null)?(($F.anl([context.record.customdate1__c])?null:new Date(new Date(context.record.customdate1__c).setUTCHours(0,0,0,0))).getUTCDay()+1):null
+
+ (1+EXTRACT (DOW FROM $!s0s!$.customdate1__c)::numeric)
+ null
+
+
+ (1+EXTRACT (DOW FROM $!s0s!$.customdate1__c)::numeric)
+ null
+
+
diff --git a/impl/src/test/java/com/force/formula/impl/DataCloudFormulaTestCase.java b/impl/src/test/java/com/force/formula/impl/DataCloudFormulaTestCase.java
new file mode 100644
index 00000000..4760b37b
--- /dev/null
+++ b/impl/src/test/java/com/force/formula/impl/DataCloudFormulaTestCase.java
@@ -0,0 +1,131 @@
+package com.force.formula.impl;
+
+import com.force.formula.util.FormulaTextUtil;
+import com.force.formula.v2.FormulaTestCase;
+import com.force.formula.v2.FormulaXMLTestSuite;
+import com.force.formula.v2.data.FormulaTestData;
+import com.force.formula.v2.data.FormulaTestDefinition;
+import com.force.formula.v2.impl.ExecutionPaths;
+
+import java.math.BigDecimal;
+import java.math.MathContext;
+import java.math.RoundingMode;
+
+/**
+ * A custom FormulaTestCase for DataCloud Hyper DB tests that handles numeric
+ * value comparison with tolerance for sql/sqlNullAsNull execution paths.
+ *
+ * Hyper DB returns slightly different values for:
+ * - Math functions (SQRT, LOG, LN, SIN, etc.) - last 1-2 digit differences
+ * - Decimal scale - fewer trailing zeros than PostgreSQL (scale 15 vs 30-32)
+ *
+ * This test case normalizes both expected and actual numeric values for SQL paths
+ * by rounding to 14 significant digits and stripping trailing zeros.
+ */
+public class DataCloudFormulaTestCase extends FormulaTestCase {
+
+ private static final int SIGNIFICANT_DIGITS = 14;
+
+ public DataCloudFormulaTestCase(FormulaTestDefinition testCase, FormulaXMLTestSuite testSuite) {
+ super(testCase, testSuite);
+ }
+
+ @Override
+ protected void runTestCase() {
+ for (String executionPath : this.testCase.getExecutionPaths()) {
+ if (ExecutionPaths.get(executionPath) != null) {
+ for (FormulaTestData testData : this.testCase.getTestData()) {
+ String output = ExecutionPaths.get(executionPath)
+ .execute(this.testCase.getTestCaseFieldInfo().getFormula(),
+ this.testCase.getTestCaseFieldInfo().getDataType(),
+ testData.getInput(),
+ this.testEntity,
+ this.testSuite.getDbTester());
+
+ String expected = FormulaTextUtil.escapeToXml(testData.getExpectedOutput().get(executionPath));
+ String actual = FormulaTextUtil.escapeToXml(output).trim();
+
+ // For SQL paths, normalize numeric values and error messages before comparison
+ if (isSqlPath(executionPath)) {
+ expected = normalizeNumericValue(expected);
+ actual = normalizeNumericValue(actual);
+ expected = normalizeErrorMessage(expected);
+ actual = normalizeErrorMessage(actual);
+ }
+
+ assertEquals(this.testCase.getTestName() + " failed for execution path: " + executionPath
+ + " and for testData: " + testData,
+ expected, actual);
+ }
+ }
+ }
+ }
+
+ private boolean isSqlPath(String executionPath) {
+ return "sql".equals(executionPath) || "sqlNullAsNull".equals(executionPath);
+ }
+
+ /**
+ * Normalize a numeric string by rounding to a fixed number of significant
+ * digits and stripping trailing zeros. Non-numeric strings (errors, dates,
+ * booleans, nulls) are returned as-is.
+ */
+ static String normalizeNumericValue(String value) {
+ if (value == null || value.startsWith("Error:") || value.equals("null")
+ || value.equals("true") || value.equals("false")) {
+ return value;
+ }
+ // Timestamps contain date patterns like YYYY-MM-DD HH:MM:SS
+ if (value.length() > 10 && value.charAt(4) == '-' && value.contains(":")) {
+ return value;
+ }
+ try {
+ BigDecimal bd = new BigDecimal(value);
+ if (bd.compareTo(BigDecimal.ZERO) == 0) {
+ return "0";
+ }
+ bd = bd.round(new MathContext(SIGNIFICANT_DIGITS, RoundingMode.HALF_UP));
+ return bd.stripTrailingZeros().toPlainString();
+ } catch (NumberFormatException e) {
+ return value;
+ }
+ }
+
+ /**
+ * Normalize error messages to account for differences between PostgreSQL
+ * and Hyper DB error message formatting. Both databases surface errors
+ * as "Error: ..." strings, but the core message text may differ
+ * (e.g., different capitalization, wording, or error codes).
+ *
+ * This normalizes known-equivalent error patterns rather than collapsing
+ * all errors into one bucket, so genuine semantic differences are still caught.
+ */
+ static String normalizeErrorMessage(String value) {
+ if (value == null || !value.startsWith("Error:")) {
+ return value;
+ }
+ String msg = value.substring("Error:".length()).trim().toLowerCase();
+
+ // Normalize known-equivalent error pairs between PostgreSQL and Hyper DB
+ if (msg.contains("division by zero") || msg.contains("divide by zero")) {
+ return "Error: division by zero";
+ }
+ if (msg.contains("numeric field overflow") || msg.contains("numeric overflow")
+ || msg.contains("out of range")) {
+ return "Error: numeric field overflow";
+ }
+ if (msg.contains("invalid regular expression") || msg.contains("regular expression error")
+ || msg.contains("regexp")) {
+ return "Error: invalid regular expression";
+ }
+ if (msg.contains("invalid input syntax") || msg.contains("invalid value")
+ || msg.contains("cannot be cast") || msg.contains("bad cast")) {
+ return "Error: invalid input syntax";
+ }
+ if (msg.contains("date/time field value out of range") || msg.contains("invalid date")
+ || msg.contains("date out of range")) {
+ return "Error: date/time field value out of range";
+ }
+ return value;
+ }
+}
diff --git a/impl/src/test/java/com/force/formula/impl/DataCloudTestCaseFilter.java b/impl/src/test/java/com/force/formula/impl/DataCloudTestCaseFilter.java
new file mode 100644
index 00000000..4e856833
--- /dev/null
+++ b/impl/src/test/java/com/force/formula/impl/DataCloudTestCaseFilter.java
@@ -0,0 +1,156 @@
+package com.force.formula.impl;
+
+import com.force.formula.v2.IFormulaTestCaseFilter;
+import com.force.formula.v2.data.FormulaTestDefinition;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * Test case filter for DataCloud Hyper DB tests.
+ *
+ * Hyper DB is PostgreSQL-compatible but has behavioral differences in:
+ * - Unsupported functions (JSON, certain to_char overloads)
+ * - Strict date validation (TO_DATE rejects invalid dates)
+ * - EPOCH calculation differences for time functions
+ * - INTERVAL rounding for timestamp arithmetic
+ *
+ * Note: Floating-point precision and decimal scale differences are handled by
+ * DataCloudFormulaTestCase which normalizes numeric comparisons to 14 significant digits.
+ *
+ * This filter:
+ * 1. Excludes tests that use unsupported Hyper DB features entirely
+ * 2. Removes sql/sqlNullAsNull execution paths from tests with non-numeric value differences
+ */
+public class DataCloudTestCaseFilter implements IFormulaTestCaseFilter {
+
+ /** Tests to exclude entirely — use unsupported Hyper DB features or have ARM floating-point issues */
+ private static final Set EXCLUDED_TESTS = new HashSet<>(Arrays.asList(
+ // JSON functions not supported in Hyper DB
+ "testJsonValue",
+ "testJsonPathValue",
+ // ARM (Apple Silicon) floating-point precision differences in Java Math.log/exp/etc.
+ // These fail on the 'formula' execution path regardless of DB engine.
+ "testAbsUsesExp",
+ "testAbsUsesLn",
+ "testAbsUsesLog",
+ "testExpSimple",
+ "testExpUsesAbs",
+ "testExpUsesCeil",
+ "testExpUsesFloor",
+ "testExpUsesIf",
+ "testExpUsesLen",
+ "testExpUsesMOD",
+ "testExpUsesMinus",
+ "testExpUsesPlus",
+ "testExpUsesRound",
+ "testExpUsesSqrt",
+ "testExpUsesValue",
+ "testLNSimple",
+ "testLNUsesLn",
+ "testLNUsesLog",
+ "testLNUsesMOD",
+ "testLogSimple",
+ "testLogUsesLn",
+ "testLogUsesLog",
+ "testLogUsesMOD",
+ "testLogUsesMinus",
+ "testModUsesExpCeil"
+ ));
+
+ /** Tests where SQL execution path has non-numeric behavioral differences that
+ * cannot be resolved through hooks or normalization.
+ *
+ * Many previous entries have been resolved via:
+ * - Time/EPOCH: sqlParseTime/sqlExtractTimeFromDateTime now compute seconds-since-midnight
+ * - Timestamp precision: DATE_TRUNC('second', ...) matches PostgreSQL's ::timestamp(0)
+ * - TO_DATE validation: LEAST/GREATEST clamping prevents errors on invalid dates
+ * - Time formatting: sqlToCharTime/sqlIntervalToDurationString use LPAD/EXTRACT arithmetic
+ * - Division/math precision: Numeric normalization to 14 significant digits
+ * - Error messages: Error message normalization in DataCloudFormulaTestCase
+ */
+ private static final Set SKIP_SQL_PATHS = new HashSet<>(Arrays.asList(
+ // DATE function - Hyper's TO_DATE still errors on some edge cases involving
+ // month=0 in guard expression evaluation despite LEAST/GREATEST clamping
+ "testDate",
+ "testDateLeapConstantDay",
+ "testDateLeapConstantMonth",
+ "testDateVarConstConst",
+ "testDateVarConstVar",
+ "testDateVarVarConst",
+ "testDateVariableYear",
+ // Ceil/Floor at exact boundaries - Hyper's division precision causes
+ // CEIL/FLOOR to produce different results at 1/N*N boundaries
+ "testCeilRound",
+ "testFloorRound",
+ "testMCeilRound",
+ "testMFloorRound",
+ // Division precision - Hyper returns different precision for large number division
+ "testBigDivide",
+ "testBigDivideWithFunc",
+ "testNVLWithError",
+ "testBVLWithError",
+ "testMultiplyWithDivideExpr",
+ "testMultiplyWithDivideExpr2",
+ // Exponentiation with zero base - Hyper errors on LOG(0) in POWER guard
+ "testExponentiationOperator",
+ // Math precision - Hyper's math functions differ beyond 14 significant digits
+ "testSine",
+ "testTangent",
+ "testSqrtSwap",
+ "testSqrtUsesCeil",
+ "testSqrtUsesMinus",
+ "testAbsUsesSqrt",
+ "testModUsesLn",
+ "testModUsesLog",
+ "testModUsesSqrt",
+ "testLogUsesAbs",
+ "testLogUsesIf",
+ "testLogUsesSqrt",
+ // Time value millisecond rounding differences
+ "testSubtractBigTimeValue",
+ "testSubtractTimeValueWithValidInValid",
+ "testSubtractTwoTimeFields",
+ "testTimeValueWithValidString",
+ "testMillisecWithValidDateTimeString",
+ // Error message / behavioral differences
+ "testRegex",
+ "testIfNullNullIf",
+ "testIfErrorBigDivide",
+ "testIfANDFunc",
+ "testIfORFunc",
+ "testIfReturningNullForDateType",
+ // Other Hyper behavioral differences
+ "testDistance",
+ "testFormatCurrency"
+ ));
+
+ @Override
+ public List filter(List formulaTestCaseInfo) {
+ return formulaTestCaseInfo.stream()
+ .filter(test -> !EXCLUDED_TESTS.contains(test.getTestName()))
+ .map(test -> {
+ if (SKIP_SQL_PATHS.contains(test.getTestName())) {
+ return removeSqlPaths(test);
+ }
+ return test;
+ })
+ .collect(Collectors.toList());
+ }
+
+ private FormulaTestDefinition removeSqlPaths(FormulaTestDefinition test) {
+ List filteredPaths = test.getExecutionPaths().stream()
+ .filter(path -> !"sql".equals(path) && !"sqlNullAsNull".equals(path))
+ .collect(Collectors.toList());
+ if (filteredPaths.isEmpty()) {
+ filteredPaths = test.getExecutionPaths();
+ }
+ return new FormulaTestDefinition(
+ test.getTestName(),
+ test.getTestCaseFieldInfo(),
+ test.getReferenceFields(),
+ filteredPaths,
+ test.getTestData()
+ );
+ }
+}
diff --git a/impl/src/test/java/com/force/formula/impl/FormulaDataCloudXMLTests.java b/impl/src/test/java/com/force/formula/impl/FormulaDataCloudXMLTests.java
new file mode 100644
index 00000000..4f303a9b
--- /dev/null
+++ b/impl/src/test/java/com/force/formula/impl/FormulaDataCloudXMLTests.java
@@ -0,0 +1,79 @@
+package com.force.formula.impl;
+
+import com.force.formula.DbTester;
+import com.force.formula.FormulaEngine;
+import com.force.formula.impl.sql.FormulaDefaultSqlStyle;
+import com.force.formula.sql.DataCloudTester;
+import com.force.formula.v2.FormulaTestCase;
+import com.force.formula.v2.FormulaXMLTestSuite;
+import com.force.formula.v2.IFormulaTestCaseFilter;
+import com.force.formula.v2.IFormulaTestDefinitionParser;
+import com.force.formula.v2.data.FormulaTestDefinition;
+import com.force.formula.v2.impl.FormulaTestDefinitionFileParser;
+import com.force.formula.impl.FormulaSqlHooks;
+import junit.framework.TestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.TimeZone;
+
+/**
+ * A test suite that uses test xml file - formulaTestV2.xml to generate and run those tests
+ * against Salesforce DataCloud Hyper DB using the DataCloud JDBC driver.
+ */
+@RunWith(AllTests.class)
+public class FormulaDataCloudXMLTests extends FormulaXMLTestSuite {
+
+ public FormulaDataCloudXMLTests(List testDefinitionAbsoluteFilePaths, IFormulaTestDefinitionParser fileParser, IFormulaTestCaseFilter testCaseFilter, String goldFileDirectory) {
+ super("FormulaDataCloudXMLTests", testDefinitionAbsoluteFilePaths, fileParser, testCaseFilter, goldFileDirectory);
+ }
+
+ /**
+ * Creates a test suite by providing
+ * test xml file paths,
+ * setting database specific hooks for postgres (DataCloud uses postgres-compatible SQL),
+ * setting timezone for testing purposes,
+ * supplying a parser to parse test xml file,
+ * supplying a filter to filter out some test scenarios,
+ * and a directory path for datacloud specific gold files.
+ *
+ * @return a test suite created from the given test xml file
+ */
+ public static TestSuite suite() {
+ List xmlFiles = new ArrayList<>();
+ xmlFiles.add("com/force/formula/impl/formulaTestV2.xml");
+ FormulaEngine.setHooks(new BaseCustomizableParserTest.FieldTestFormulaValidationHooks() {
+ @Override
+ public FormulaSqlHooks getSqlStyle() {
+ return FormulaDefaultSqlStyle.DATACLOUD;
+ }
+ });
+ FormulaEngine.setFactory(BaseFieldReferenceTest.TEST_FACTORY);
+ TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
+ IFormulaTestDefinitionParser parser = new FormulaTestDefinitionFileParser();
+ String goldFileDirectory = "src/test/goldfiles/FormulaFields/v2/datacloud";
+ IFormulaTestCaseFilter filter = new DataCloudTestCaseFilter();
+ return new FormulaDataCloudXMLTests(xmlFiles, parser, filter, goldFileDirectory);
+ }
+
+ /**
+ * Use DataCloudFormulaTestCase which normalizes numeric values for SQL path comparison.
+ */
+ @Override
+ protected FormulaTestCase createTestCase(FormulaTestDefinition testDefinition) {
+ return new DataCloudFormulaTestCase(testDefinition, this);
+ }
+
+ /**
+ * Creates a DataCloud database tester
+ * @return a DataCloud database tester
+ * @throws IOException if there is an IO issue while creating database tester
+ */
+ @Override
+ protected DbTester constructDbTester() throws IOException {
+ return new DataCloudTester();
+ }
+}
\ No newline at end of file
diff --git a/postgres-vs-hyperdb-sql-diffs.csv b/postgres-vs-hyperdb-sql-diffs.csv
new file mode 100644
index 00000000..db5d85b7
--- /dev/null
+++ b/postgres-vs-hyperdb-sql-diffs.csv
@@ -0,0 +1,55 @@
+Test Name,Pattern,Postgres SQL,Hyper DB SQL
+testAbsUsesExp,D,"ABS(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20)))","ABS(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)))"
+testAddBigTimeValueWithValidInValid,C,"MOD(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000+ROUND(MOD(CAST(93600000 AS NUMERIC), 86400000))+86400000,86400000)","MOD(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000+ROUND(MOD(CAST(93600000 AS NUMERIC), 86400000))+86400000,86400000)"
+testAddDate,A+B,"($!s0s!$.customdate1__c+pg_catalog.make_interval(0,0,0,0,0,0,TRUNC(COALESCE($!s0s!$.customnumber1__c, 0))*86400.0))::timestamp(0)","($!s0s!$.customdate1__c+(INTERVAL '1 second'*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0))*86400.0))::timestamp"
+testAddDateTime,A+B,"($!s0s!$.customdatetime1__c+pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp(0)","($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp"
+testAddDateTimeGivingDate,A+B,"($!s0s!$.customdatetime1__c+pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp(0)","($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp"
+testAddDateTimeGivingDateValue,A+B,"DATE_TRUNC('DAY', (($!s0s!$.customdatetime1__c+pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp(0) AT TIME ZONE 'UTC') AT TIME ZONE '__TZ_ID__')::timestamp","DATE_TRUNC('DAY', (($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp AT TIME ZONE 'UTC') AT TIME ZONE '__TZ_ID__')::timestamp"
+testAddDateTimeMinutes,A+B,"($!s0s!$.customdatetime1__c+pg_catalog.make_interval(0,0,0,0,0,0,(COALESCE($!s0s!$.customnumber1__c, 0)/1440)*86400.0))::timestamp(0)","($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*(COALESCE($!s0s!$.customnumber1__c, 0)/1440)*86400.0))::timestamp"
+testAddDateTimeWithExpr,A+B,"(((($!s0s!$.customdatetime1__c+pg_catalog.make_interval(0,0,0,0,0,0,COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)*86400.0))::timestamp(0)+pg_catalog.make_interval(0,0,0,0,0,0,COALESCE(($!s0s!$.custompercent2__c / 100.0), 0)*86400.0))::timestamp(0)+pg_catalog.make_interval(0,0,0,0,0,0,COALESCE(((EXTRACT(EPOCH FROM $!s0s!$.customdatetime2__c)-EXTRACT(EPOCH FROM $!s0s!$.customdatetime3__c))::numeric/86400), 0)*86400.0))::timestamp(0)+pg_catalog.make_interval(0,0,0,0,0,0,COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric*86400.0))::timestamp(0)","(((($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)*86400.0))::timestamp+(INTERVAL '1 second'*COALESCE(($!s0s!$.custompercent2__c / 100.0), 0)*86400.0))::timestamp+(INTERVAL '1 second'*COALESCE(((EXTRACT(EPOCH FROM $!s0s!$.customdatetime2__c)-EXTRACT(EPOCH FROM $!s0s!$.customdatetime3__c))::numeric/86400), 0)*86400.0))::timestamp+(INTERVAL '1 second'*COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric*86400.0))::timestamp"
+testAddDateWithExpr,A+B,"(((($!s0s!$.customdate1__c+pg_catalog.make_interval(0,0,0,0,0,0,TRUNC(COALESCE(($!s0s!$.custompercent1__c / 100.0), 0))*86400.0))::timestamp(0)+pg_catalog.make_interval(0,0,0,0,0,0,TRUNC(COALESCE($!s0s!$.customnumber1__c, 0))*86400.0))::timestamp(0)+pg_catalog.make_interval(0,0,0,0,0,0,TRUNC(COALESCE(((EXTRACT(EPOCH FROM $!s0s!$.customdate2__c)-EXTRACT(EPOCH FROM $!s0s!$.customdate3__c))::numeric/86400), 0))*86400.0))::timestamp(0)+pg_catalog.make_interval(0,0,0,0,0,0,TRUNC(COALESCE($!s0s!$.customcurrency1__c, 0))*86400.0))::timestamp(0)","(((($!s0s!$.customdate1__c+(INTERVAL '1 second'*TRUNC(COALESCE(($!s0s!$.custompercent1__c / 100.0), 0))*86400.0))::timestamp+(INTERVAL '1 second'*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0))*86400.0))::timestamp+(INTERVAL '1 second'*TRUNC(COALESCE(((EXTRACT(EPOCH FROM $!s0s!$.customdate2__c)-EXTRACT(EPOCH FROM $!s0s!$.customdate3__c))::numeric/86400), 0))*86400.0))::timestamp+(INTERVAL '1 second'*TRUNC(COALESCE($!s0s!$.customcurrency1__c, 0))*86400.0))::timestamp"
+testAddHoursWithTwoCustFields,C,"MOD(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.timeString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000+ROUND(MOD(CAST(COALESCE($!s0s!$.customnumber1__c, 0) AS NUMERIC), 86400000))+86400000,86400000)","MOD(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.timeString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000+ROUND(MOD(CAST(COALESCE($!s0s!$.customnumber1__c, 0) AS NUMERIC), 86400000))+86400000,86400000)"
+testAddMonths,B,"($!s0s!$.customdate1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp(0))::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval + ('1 month'::interval*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0)))) - (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp(0))::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval ","($!s0s!$.customdate1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval + ('1 month'::interval*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0)))) - (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval "
+testAddMonthsDate,B,"($!s0s!$.customdate1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp(0))::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval + ('1 month'::interval*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0)))) - (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp(0))::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval ","($!s0s!$.customdate1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval + ('1 month'::interval*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0)))) - (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdate1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval "
+testAddMonthsDateTime,B,"($!s0s!$.customdatetime1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdatetime1__c) + interval '1 month -1 day')::timestamp(0))::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdatetime1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval + ('1 month'::interval*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0)))) - (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdatetime1__c) + interval '1 month -1 day')::timestamp(0))::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdatetime1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval ","($!s0s!$.customdatetime1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdatetime1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdatetime1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval + ('1 month'::interval*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0)))) - (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdatetime1__c) + interval '1 month -1 day')::timestamp)::numeric = extract(day FROM (date_trunc('day', $!s0s!$.customdatetime1__c)))::numeric THEN '1 day' ELSE '0 day' END )::interval "
+testAddTimeValueWithValidInValid,C,"MOD(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000+ROUND(MOD(CAST(7200000 AS NUMERIC), 86400000))+86400000,86400000)","MOD(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000+ROUND(MOD(CAST(7200000 AS NUMERIC), 86400000))+86400000,86400000)"
+testArcCosine,D,"ACOS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)","ACOS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)"
+testArcSine,D,"ASIN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)","ASIN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)"
+testArcTan2,D,"ATAN2(COALESCE($!s0s!$.customnumber1__c, 0),COALESCE($!s0s!$.customnumber2__c, 0))::numeric(40,20)","ATAN2(COALESCE($!s0s!$.customnumber1__c, 0),COALESCE($!s0s!$.customnumber2__c, 0))::numeric(38,18)"
+testArcTangent,D,"ATAN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)","ATAN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)"
+testCosine,D,"COS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)","COS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)"
+testDateTimeText,B,"(CONCAT(TO_CHAR(($!s0s!$.customdatetime1__c)::timestamp(0), 'YYYY-MM-DD HH24:MI:SS'), 'Z' ))","(CONCAT(TO_CHAR(($!s0s!$.customdatetime1__c)::timestamp, 'YYYY-MM-DD HH24:MI:SS'), 'Z' ))"
+testExpSimple,D,"EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20))","EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18))"
+testExpUsesAbs,D,"EXP(ABS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20))","EXP(ABS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18))"
+testExpUsesCeil,D,"EXP(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0),33)) END::numeric(40,20))","EXP(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0),33)) END::numeric(38,18))"
+testExpUsesFloor,D,"EXP(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0),33)) END::numeric(40,20))","EXP(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0),33)) ELSE CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0),33)) END::numeric(38,18))"
+testExpUsesIf,D,"EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20))","EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18))"
+testExpUsesLen,D,"EXP(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric::numeric(40,20))","EXP(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric::numeric(38,18))"
+testExpUsesLn,D,"ROUND(EXP(LN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)), 0::integer)","ROUND(EXP(LN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)), 0::integer)"
+testExpUsesLog,D,"EXP(LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20))","EXP(LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18))"
+testExpUsesMOD,D,"EXP(MOD(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0))::numeric(40,20))","EXP(MOD(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0))::numeric(38,18))"
+testExpUsesMinus,D,"EXP((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)-COALESCE($!s0s!$.customcurrency1__c, 0))::numeric(40,20))","EXP((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)-COALESCE($!s0s!$.customcurrency1__c, 0))::numeric(38,18))"
+testExpUsesPlus,D,"EXP(COALESCE((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)+COALESCE($!s0s!$.customnumber1__c, 0)), 0)::numeric(40,20))","EXP(COALESCE((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)+COALESCE($!s0s!$.customnumber1__c, 0)), 0)::numeric(38,18))"
+testExpUsesRound,D,"EXP(ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)::numeric(40,20))","EXP(ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)::numeric(38,18))"
+testExpUsesSqrt,D,"EXP(SQRT(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20))","EXP(SQRT(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18))"
+testExpUsesValue,D,"EXP(CAST($!s0s!$.customtext1__c AS NUMERIC)::numeric(40,20))","EXP(CAST($!s0s!$.customtext1__c AS NUMERIC)::numeric(38,18))"
+testFormatDurationTime,C,"TO_CHAR((INTERVAL '1 second' * ABS(((CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000)-(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000))/1000)), 'HH24:MI:SS')","TO_CHAR((INTERVAL '1 second' * ABS(((CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000)-(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000))/1000)), 'HH24:MI:SS')"
+testIfErrorTextTimeValueWithValidInValid,C,"CASE WHEN NOT $!s0s!$.dateString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$' THEN NULL ELSE TO_CHAR(TO_TIMESTAMP(TO_CHAR(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000/1000, 'FM99990D999'), 'SSSS.MS'), 'HH24:mi:ss.MS') END","CASE WHEN NOT $!s0s!$.dateString__c ~ '^([01]\d|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$' THEN NULL ELSE TO_CHAR(TO_TIMESTAMP(TO_CHAR(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000/1000, 'FM99990D999'), 'SSSS.MS'), 'HH24:mi:ss.MS') END"
+testIfTextCompareEqualReturnDate,A+B,"CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customemail1__c, 'x'))=COALESCE($!s0s!$.customemail1__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE(($!s0s!$.customdate2__c+pg_catalog.make_interval(0,0,0,0,0,0,TRUNC(COALESCE($!s0s!$.customnumber1__c, 0))*86400.0))::timestamp(0),CAST(NULL AS DATE)) END","CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customemail1__c, 'x'))=COALESCE($!s0s!$.customemail1__c, CONCAT($!s0s!$.customtext1__c, 'x'))) THEN COALESCE($!s0s!$.customdate1__c,CAST(NULL AS DATE)) ELSE COALESCE(($!s0s!$.customdate2__c+(INTERVAL '1 second'*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0))*86400.0))::timestamp,CAST(NULL AS DATE)) END"
+testIfTextCompareEqualReturnDateTime,A+B,"CASE WHEN (COALESCE($!s0s!$.customphone1__c, CONCAT($!s0s!$.customphone2__c, 'x'))=COALESCE($!s0s!$.customphone2__c, CONCAT($!s0s!$.customphone1__c, 'x'))) THEN COALESCE(($!s0s!$.customdatetime1__c-pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customcurrency1__c, 0)*86400.0))::timestamp(0),CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END","CASE WHEN (COALESCE($!s0s!$.customphone1__c, CONCAT($!s0s!$.customphone2__c, 'x'))=COALESCE($!s0s!$.customphone2__c, CONCAT($!s0s!$.customphone1__c, 'x'))) THEN COALESCE(($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*COALESCE($!s0s!$.customcurrency1__c, 0)*86400.0))::timestamp,CAST(NULL AS DATE)) ELSE COALESCE($!s0s!$.customdatetime2__c,CAST(NULL AS DATE)) END"
+testModUsesExpCeil,D,"MOD(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber2__c, 0),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber2__c, 0),33)) END)","MOD(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber2__c, 0),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber2__c, 0),33)) END)"
+testPi,D,"ROUND(PI()::numeric(40,20), 12::integer)","ROUND(PI()::numeric(38,18), 12::integer)"
+testRoundUsesExp,D,"ROUND(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber2__c, 0),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber2__c, 0),33)) END::integer)","ROUND(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber2__c, 0),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber2__c, 0),33)) END::integer)"
+testSine,D,"SIN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)","SIN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)"
+testSqrtUsesExp,D,"SQRT(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20)))","SQRT(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)))"
+testSubDateTimeGivingDate,A+B,"($!s0s!$.customdatetime1__c-pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp(0)","($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp"
+testSubDateTimeGivingDateTime,A+B,"($!s0s!$.customdatetime1__c-pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp(0)","($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp"
+testSubDateTimeGivingDateValue,A+B,"DATE_TRUNC('DAY', (($!s0s!$.customdatetime1__c-pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp(0) AT TIME ZONE 'UTC') AT TIME ZONE '__TZ_ID__')::timestamp","DATE_TRUNC('DAY', (($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp AT TIME ZONE 'UTC') AT TIME ZONE '__TZ_ID__')::timestamp"
+testSubtractBigTimeValue,C,"MOD(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000-ROUND(MOD(CAST(180000000 AS NUMERIC), 86400000))+86400000,86400000)","MOD(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000-ROUND(MOD(CAST(180000000 AS NUMERIC), 86400000))+86400000,86400000)"
+testSubtractTimeValueWithValidInValid,C,"MOD(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000-ROUND(MOD(CAST(7200000 AS NUMERIC), 86400000))+86400000,86400000)","MOD(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000-ROUND(MOD(CAST(7200000 AS NUMERIC), 86400000))+86400000,86400000)"
+testSubtractTwoTimeFields,C,"MOD(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000-CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000+86400000,86400000)","MOD(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000-CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000+86400000,86400000)"
+testTangent,D,"TAN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)","TAN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)"
+testTextTimeValueWithValidInValid,C,"TO_CHAR(TO_TIMESTAMP(TO_CHAR(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000/1000, 'FM99990D999'), 'SSSS.MS'), 'HH24:mi:ss.MS')","TO_CHAR(TO_TIMESTAMP(TO_CHAR(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000/1000, 'FM99990D999'), 'SSSS.MS'), 'HH24:mi:ss.MS')"
+testTimeValueWithValidString,C,"CAST(TO_CHAR(TO_TIMESTAMP('10:40:55.666', 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000","CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP('10:40:55.666', 'HH24:mi:ss.MS')) AS NUMERIC) * 1000"
+testTruncUsesExp,D,"TRUNC(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber2__c, 0),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber2__c, 0),33)) END::integer)","TRUNC(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber2__c, 0),33)) ELSE FLOOR(ROUND(COALESCE($!s0s!$.customnumber2__c, 0),33)) END::integer)"
+testUnixTimestampWithTime,C,"TRUNC(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000/1000)","TRUNC(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000/1000)"
diff --git a/postgres-vs-hyperdb-sql-diffs.md b/postgres-vs-hyperdb-sql-diffs.md
new file mode 100644
index 00000000..993c454c
--- /dev/null
+++ b/postgres-vs-hyperdb-sql-diffs.md
@@ -0,0 +1,87 @@
+# Postgres vs Hyper DB SQL Expression Differences
+
+## Translation Patterns
+
+| Pattern | Postgres | Hyper DB |
+|---------|----------|----------|
+| A | `pg_catalog.make_interval()` | `INTERVAL arithmetic` |
+| B | `::timestamp(0)` | `::timestamp` |
+| C | `TO_CHAR(TO_TIMESTAMP(),'SSSS.MS')` | `EXTRACT(EPOCH FROM TO_TIMESTAMP())` |
+| D | `::numeric(40,20)` | `::numeric(38,18)` |
+
+## Gold File Changelog (54 files differ)
+
+### Pattern A+B: pg_catalog.make_interval() -> INTERVAL arithmetic, ::timestamp(0) -> ::timestamp
+
+| Test Name | Postgres SQL | Hyper DB SQL |
+|-----------|-------------|-------------|
+| testAddDate | `($!s0s!$.customdate1__c+pg_catalog.make_interval(0,0,0,0,0,0,TRUNC(COALESCE($!s0s!$.customnumber1__c, 0))*86400.0))::...` | `($!s0s!$.customdate1__c+(INTERVAL '1 second'*TRUNC(COALESCE($!s0s!$.customnumber1__c, 0))*86400.0))::timestamp` |
+| testAddDateTime | `($!s0s!$.customdatetime1__c+pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::tim...` | `($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp` |
+| testAddDateTimeGivingDate | `($!s0s!$.customdatetime1__c+pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::tim...` | `($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp` |
+| testAddDateTimeGivingDateValue | `DATE_TRUNC('DAY', (($!s0s!$.customdatetime1__c+pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customnumber1__c...` | `DATE_TRUNC('DAY', (($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::...` |
+| testAddDateTimeMinutes | `($!s0s!$.customdatetime1__c+pg_catalog.make_interval(0,0,0,0,0,0,(COALESCE($!s0s!$.customnumber1__c, 0)/1440)*86400.0...` | `($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*(COALESCE($!s0s!$.customnumber1__c, 0)/1440)*86400.0))::timestamp` |
+| testAddDateTimeWithExpr | `(((($!s0s!$.customdatetime1__c+pg_catalog.make_interval(0,0,0,0,0,0,COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)*...` | `(((($!s0s!$.customdatetime1__c+(INTERVAL '1 second'*COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)*86400.0))::times...` |
+| testAddDateWithExpr | `(((($!s0s!$.customdate1__c+pg_catalog.make_interval(0,0,0,0,0,0,TRUNC(COALESCE(($!s0s!$.custompercent1__c / 100.0), 0...` | `(((($!s0s!$.customdate1__c+(INTERVAL '1 second'*TRUNC(COALESCE(($!s0s!$.custompercent1__c / 100.0), 0))*86400.0))::ti...` |
+| testIfTextCompareEqualReturnDate | `CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customemail1__c, 'x'))=COALESCE($!s0s!$.customemail1__c, C...` | `CASE WHEN (COALESCE($!s0s!$.customtext1__c, CONCAT($!s0s!$.customemail1__c, 'x'))=COALESCE($!s0s!$.customemail1__c, C...` |
+| testIfTextCompareEqualReturnDateTime | `CASE WHEN (COALESCE($!s0s!$.customphone1__c, CONCAT($!s0s!$.customphone2__c, 'x'))=COALESCE($!s0s!$.customphone2__c, ...` | `CASE WHEN (COALESCE($!s0s!$.customphone1__c, CONCAT($!s0s!$.customphone2__c, 'x'))=COALESCE($!s0s!$.customphone2__c, ...` |
+| testSubDateTimeGivingDate | `($!s0s!$.customdatetime1__c-pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::tim...` | `($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp` |
+| testSubDateTimeGivingDateTime | `($!s0s!$.customdatetime1__c-pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::tim...` | `($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::timestamp` |
+| testSubDateTimeGivingDateValue | `DATE_TRUNC('DAY', (($!s0s!$.customdatetime1__c-pg_catalog.make_interval(0,0,0,0,0,0,COALESCE($!s0s!$.customnumber1__c...` | `DATE_TRUNC('DAY', (($!s0s!$.customdatetime1__c-(INTERVAL '1 second'*COALESCE($!s0s!$.customnumber1__c, 0)*86400.0))::...` |
+
+### Pattern B: ::timestamp(0) -> ::timestamp
+
+| Test Name | Postgres SQL | Hyper DB SQL |
+|-----------|-------------|-------------|
+| testAddMonths | `($!s0s!$.customdate1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 mon...` | `($!s0s!$.customdate1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 mon...` |
+| testAddMonthsDate | `($!s0s!$.customdate1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 mon...` | `($!s0s!$.customdate1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdate1__c) + interval '1 mon...` |
+| testAddMonthsDateTime | `($!s0s!$.customdatetime1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdatetime1__c) + interva...` | `($!s0s!$.customdatetime1__c + (CASE WHEN extract(day FROM (date_trunc('month', $!s0s!$.customdatetime1__c) + interva...` |
+| testDateTimeText | `(CONCAT(TO_CHAR(($!s0s!$.customdatetime1__c)::timestamp(0), 'YYYY-MM-DD HH24:MI:SS'), 'Z' ))` | `(CONCAT(TO_CHAR(($!s0s!$.customdatetime1__c)::timestamp, 'YYYY-MM-DD HH24:MI:SS'), 'Z' ))` |
+
+### Pattern C: TO_CHAR(TO_TIMESTAMP(),'SSSS.MS') -> EXTRACT(EPOCH FROM TO_TIMESTAMP())
+
+| Test Name | Postgres SQL | Hyper DB SQL |
+|-----------|-------------|-------------|
+| testAddBigTimeValueWithValidInValid | `MOD(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000+ROUND(MOD(CAST(93...` | `MOD(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000+ROUND(MOD(CAST(9...` |
+| testAddHoursWithTwoCustFields | `MOD(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.timeString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000+ROUND(MOD(CAST(CO...` | `MOD(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.timeString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000+ROUND(MOD(CAST(C...` |
+| testAddTimeValueWithValidInValid | `MOD(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000+ROUND(MOD(CAST(72...` | `MOD(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000+ROUND(MOD(CAST(7...` |
+| testFormatDurationTime | `TO_CHAR((INTERVAL '1 second' * ABS(((CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS...` | `TO_CHAR((INTERVAL '1 second' * ABS(((CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.timeString1__c, 'HH24:mi:ss.MS')) A...` |
+| testIfErrorTextTimeValueWithValidInValid | `CASE WHEN NOT $!s0s!$.dateString__c ~ '^([01]\d\|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$' THEN NULL ELSE TO...` | `CASE WHEN NOT $!s0s!$.dateString__c ~ '^([01]\d\|2[0-3]):[0-5][0-9]:[0-5][0-9]\.[0-9][0-9][0-9]$' THEN NULL ELSE TO...` |
+| testSubtractBigTimeValue | `MOD(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000-ROUND(MOD(CAST(18...` | `MOD(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000-ROUND(MOD(CAST(1...` |
+| testSubtractTimeValueWithValidInValid | `MOD(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000-ROUND(MOD(CAST(72...` | `MOD(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000-ROUND(MOD(CAST(7...` |
+| testSubtractTwoTimeFields | `MOD(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000-CAST(TO_CHAR(TO_...` | `MOD(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.timeString2__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000-CAST(EXTRACT(EP...` |
+| testTextTimeValueWithValidInValid | `TO_CHAR(TO_TIMESTAMP(TO_CHAR(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC)...` | `TO_CHAR(TO_TIMESTAMP(TO_CHAR(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC...` |
+| testTimeValueWithValidString | `CAST(TO_CHAR(TO_TIMESTAMP('10:40:55.666', 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000` | `CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP('10:40:55.666', 'HH24:mi:ss.MS')) AS NUMERIC) * 1000` |
+| testUnixTimestampWithTime | `TRUNC(CAST(TO_CHAR(TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS'),'SSSS.MS') AS NUMERIC) * 1000/1000)` | `TRUNC(CAST(EXTRACT(EPOCH FROM TO_TIMESTAMP($!s0s!$.dateString__c, 'HH24:mi:ss.MS')) AS NUMERIC) * 1000/1000)` |
+
+### Pattern D: ::numeric(40,20) -> ::numeric(38,18)
+
+| Test Name | Postgres SQL | Hyper DB SQL |
+|-----------|-------------|-------------|
+| testAbsUsesExp | `ABS(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20)))` | `ABS(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)))` |
+| testArcCosine | `ACOS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)` | `ACOS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)` |
+| testArcSine | `ASIN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)` | `ASIN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)` |
+| testArcTan2 | `ATAN2(COALESCE($!s0s!$.customnumber1__c, 0),COALESCE($!s0s!$.customnumber2__c, 0))::numeric(40,20)` | `ATAN2(COALESCE($!s0s!$.customnumber1__c, 0),COALESCE($!s0s!$.customnumber2__c, 0))::numeric(38,18)` |
+| testArcTangent | `ATAN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)` | `ATAN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)` |
+| testCosine | `COS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)` | `COS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)` |
+| testExpSimple | `EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20))` | `EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18))` |
+| testExpUsesAbs | `EXP(ABS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20))` | `EXP(ABS(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18))` |
+| testExpUsesCeil | `EXP(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0),33)) ...` | `EXP(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN CEIL(ROUND(COALESCE($!s0s!$.customnumber1__c, 0),33)) ...` |
+| testExpUsesFloor | `EXP(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0),33))...` | `EXP(CASE WHEN COALESCE($!s0s!$.customnumber1__c, 0)>=0 THEN FLOOR(ROUND(COALESCE($!s0s!$.customnumber1__c, 0),33))...` |
+| testExpUsesIf | `EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20))` | `EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18))` |
+| testExpUsesLen | `EXP(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric::numeric(40,20))` | `EXP(COALESCE(LENGTH($!s0s!$.customtext1__c),0)::numeric::numeric(38,18))` |
+| testExpUsesLn | `ROUND(EXP(LN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)), 0::integer)` | `ROUND(EXP(LN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)), 0::integer)` |
+| testExpUsesLog | `EXP(LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20))` | `EXP(LOG(10, COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18))` |
+| testExpUsesMOD | `EXP(MOD(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0))::numeric(40,20))` | `EXP(MOD(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0))::numeric(38,18))` |
+| testExpUsesMinus | `EXP((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)-COALESCE($!s0s!$.customcurrency1__c, 0))::numeric(40,20))` | `EXP((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)-COALESCE($!s0s!$.customcurrency1__c, 0))::numeric(38,18))` |
+| testExpUsesPlus | `EXP(COALESCE((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)+COALESCE($!s0s!$.customnumber1__c, 0)), 0)::numeric(40...` | `EXP(COALESCE((COALESCE(($!s0s!$.custompercent1__c / 100.0), 0)+COALESCE($!s0s!$.customnumber1__c, 0)), 0)::numeric(38...` |
+| testExpUsesRound | `EXP(ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)::numeric(40,20))` | `EXP(ROUND(COALESCE($!s0s!$.customnumber1__c, 0), COALESCE($!s0s!$.customnumber2__c, 0)::integer)::numeric(38,18))` |
+| testExpUsesSqrt | `EXP(SQRT(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20))` | `EXP(SQRT(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18))` |
+| testExpUsesValue | `EXP(CAST($!s0s!$.customtext1__c AS NUMERIC)::numeric(40,20))` | `EXP(CAST($!s0s!$.customtext1__c AS NUMERIC)::numeric(38,18))` |
+| testModUsesExpCeil | `MOD(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>=0...` | `MOD(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>=0...` |
+| testPi | `ROUND(PI()::numeric(40,20), 12::integer)` | `ROUND(PI()::numeric(38,18), 12::integer)` |
+| testRoundUsesExp | `ROUND(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>...` | `ROUND(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>...` |
+| testSine | `SIN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)` | `SIN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)` |
+| testSqrtUsesExp | `SQRT(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20)))` | `SQRT(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)))` |
+| testTangent | `TAN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(40,20)` | `TAN(COALESCE($!s0s!$.customnumber1__c, 0))::numeric(38,18)` |
+| testTruncUsesExp | `TRUNC(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(40,20)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>...` | `TRUNC(EXP(COALESCE($!s0s!$.customnumber1__c, 0)::numeric(38,18)), CASE WHEN COALESCE($!s0s!$.customnumber2__c, 0)>...` |
+
diff --git a/test-utils/pom.xml b/test-utils/pom.xml
index af12382f..dbfe5887 100644
--- a/test-utils/pom.xml
+++ b/test-utils/pom.xml
@@ -96,5 +96,12 @@
${testcontainers.version}
true
+
+ com.salesforce.datacloud
+ jdbc
+ 0.41.0
+ shaded
+ true
+
diff --git a/test-utils/src/main/java/com/force/formula/sql/DataCloudTester.java b/test-utils/src/main/java/com/force/formula/sql/DataCloudTester.java
new file mode 100644
index 00000000..64341525
--- /dev/null
+++ b/test-utils/src/main/java/com/force/formula/sql/DataCloudTester.java
@@ -0,0 +1,182 @@
+package com.force.formula.sql;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.sql.*;
+import java.util.Properties;
+
+import com.force.formula.*;
+import com.force.formula.util.FormulaI18nUtils;
+
+public class DataCloudTester extends AbstractDbTester {
+
+ private Connection conn = null;
+
+ public DataCloudTester() throws IOException {
+ }
+
+ @Override
+ public String getDbTypeName() {
+ return "datacloud";
+ }
+
+ /**
+ * Creates a connection to Salesforce DataCloud using JDBC driver.
+ * Reads connection properties from application.properties file in the classpath.
+ *
+ * @return a Connection to DataCloud
+ * @throws SQLException if there is an issue creating the connection
+ * @throws IOException if there is an issue reading the properties file
+ */
+ @Override
+ protected Connection getConnection() throws SQLException, IOException {
+ if (this.conn == null) {
+ try {
+ Class.forName("com.salesforce.datacloud.jdbc.DataCloudJDBCDriver");
+ } catch (ClassNotFoundException e) {
+ throw new IOException("DataCloud JDBC driver not found", e);
+ }
+ Properties props = new Properties();
+ try (InputStream is = DataCloudTester.class.getClassLoader().getResourceAsStream("application.properties")) {
+ if (is == null) {
+ throw new IOException("application.properties file not found in classpath");
+ }
+ props.load(is);
+ }
+
+ String loginUrl = props.getProperty("loginUrl");
+ if (loginUrl == null) {
+ throw new IOException("loginUrl property not found in application.properties");
+ }
+ String hostname = loginUrl.replaceFirst("^https?://", "");
+
+ String url = "jdbc:salesforce-datacloud://" + hostname;
+
+ Properties connectionProperties = new Properties();
+ connectionProperties.put("userName", props.get("userName"));
+ connectionProperties.put("clientId", props.get("clientId"));
+ connectionProperties.put("clientSecret", props.get("clientSecret"));
+ connectionProperties.put("refreshToken", props.get("refreshToken"));
+
+ this.conn = DriverManager.getConnection(url, connectionProperties);
+ }
+ return this.conn;
+ }
+
+ /**
+ * Don't close the connection per statement, only at the end of the test.
+ */
+ @Override
+ protected void closeConnectionPerStmt(Connection conn) throws SQLException {
+ // Do nothing - reuse the connection
+ }
+
+ @Override
+ protected String getDecimalType() {
+ return "numeric";
+ }
+
+ @Override
+ protected String getTextType() {
+ return "text";
+ }
+
+ @Override
+ protected String getTimestampType() {
+ return "timestamp";
+ }
+
+ @Override
+ protected String stringToDateTime(String arg) {
+ return arg + "::timestamp";
+ }
+
+ @Override
+ protected String convertToDateTime(String arg) {
+ return arg + "::timestamp";
+ }
+
+ /**
+ * Override formatDbResult to handle Hyper DB differences:
+ * 1. Timestamps: Hyper returns sub-second precision since we use ::timestamp instead of ::timestamp(0).
+ * Truncate to whole seconds to match PostgreSQL ::timestamp(0) behavior.
+ * 2. Decimals: Hyper returns fewer trailing zeros than PostgreSQL for division/multiplication.
+ * Pad CURRENCY/PERCENT to 30 decimal places to match PostgreSQL's numeric scale.
+ */
+ @Override
+ protected String formatDbResult(ResultSet rset, FormulaRuntimeContext formulaContext, Formula formula) throws SQLException {
+ MockFormulaDataType returnType = (MockFormulaDataType) formula.getDataType();
+ switch (returnType) {
+ case DATEONLY:
+ case DATETIME:
+ try {
+ Timestamp d = rset.getTimestamp(1);
+ if (d == null)
+ return null;
+ // Truncate to whole seconds to match PostgreSQL ::timestamp(0) behavior
+ d.setNanos(0);
+ return d.toString();
+ } catch (IllegalArgumentException | SQLException ex) {
+ Date d = rset.getDate(1);
+ if (d == null)
+ return null;
+ return new Timestamp(d.getTime()).toString();
+ }
+ case CURRENCY:
+ case PERCENT:
+ BigDecimal bigDecimal = rset.getBigDecimal(1);
+ if (bigDecimal == null)
+ return null;
+ // PostgreSQL NUMERIC preserves high precision for division/multiplication.
+ // Hyper returns fewer decimal places. Pad to at least 30 decimal places
+ // to match PostgreSQL's typical NUMERIC scale for currency operations.
+ if (bigDecimal.scale() < 30) {
+ bigDecimal = bigDecimal.setScale(30);
+ }
+ return String.valueOf(FormulaI18nUtils.formatResult(formulaContext, formulaContext.getFormulaReturnType(), bigDecimal));
+ case INTEGER:
+ case DOUBLE:
+ BigDecimal number = rset.getBigDecimal(1);
+ if (number == null)
+ return null;
+ return number.stripTrailingZeros().toPlainString();
+ default:
+ break;
+ }
+ return super.formatDbResult(rset, formulaContext, formula);
+ }
+
+ /**
+ * Strip Hyper DB error message wrapper to match PostgreSQL error format.
+ * Hyper wraps errors as: "Failed to execute query: [TraceId:...] SQLSTATE:... QUERY:..."
+ * PostgreSQL returns plain: "ERROR: "
+ */
+ @Override
+ public String getSqlExceptionMessage(Throwable e) {
+ String msg = e.getMessage();
+ if (msg != null && msg.startsWith("Failed to execute query: ")) {
+ msg = msg.substring("Failed to execute query: ".length());
+ // Strip trailing metadata: [TraceId:...] SQLSTATE:... QUERY-ID:... DETAIL:... QUERY:...
+ int traceIdx = msg.indexOf(" [TraceId:");
+ if (traceIdx > 0) {
+ msg = msg.substring(0, traceIdx);
+ }
+ int sqlStateIdx = msg.indexOf(" SQLSTATE:");
+ if (sqlStateIdx > 0) {
+ msg = msg.substring(0, sqlStateIdx);
+ }
+ return "ERROR: " + msg;
+ }
+ return msg;
+ }
+
+ @Override
+ public void close() throws Exception {
+ if (this.conn != null) {
+ this.conn.close();
+ this.conn = null;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/test-utils/src/main/java/com/force/formula/v2/FormulaTestCase.java b/test-utils/src/main/java/com/force/formula/v2/FormulaTestCase.java
index 65389ca8..181f007d 100644
--- a/test-utils/src/main/java/com/force/formula/v2/FormulaTestCase.java
+++ b/test-utils/src/main/java/com/force/formula/v2/FormulaTestCase.java
@@ -30,9 +30,9 @@
*/
public class FormulaTestCase extends FormulaTestBase {
- private final FormulaTestDefinition testCase;
- private final MapFormulaContext.MapEntity testEntity;
- private final FormulaXMLTestSuite testSuite;
+ protected final FormulaTestDefinition testCase;
+ protected final MapFormulaContext.MapEntity testEntity;
+ protected final FormulaXMLTestSuite testSuite;
/**
* A constructor to create an instance of formula test case from a formula test definition
@@ -76,9 +76,9 @@ public void runTest(){
/**
* Iterates over all execution paths defined for this test case for each of the test data and compare against
- * expected outputs
+ * expected outputs. Subclasses can override to customize comparison behavior.
*/
- private void runTestCase(){
+ protected void runTestCase(){
for(String executionPath: this.testCase.getExecutionPaths()){
if(ExecutionPaths.get(executionPath)!=null){
for(FormulaTestData testData: this.testCase.getTestData()){
diff --git a/test-utils/src/main/java/com/force/formula/v2/FormulaXMLTestSuite.java b/test-utils/src/main/java/com/force/formula/v2/FormulaXMLTestSuite.java
index fb765d52..1abd6344 100644
--- a/test-utils/src/main/java/com/force/formula/v2/FormulaXMLTestSuite.java
+++ b/test-utils/src/main/java/com/force/formula/v2/FormulaXMLTestSuite.java
@@ -59,7 +59,7 @@ public FormulaXMLTestSuite(String testSuiteName, List testDefinitionAbso
//create test cases and add them to test suite
for(FormulaTestDefinition testDefinition : filteredTestCaseInfos){
- FormulaTestCase formulaTestCase = new FormulaTestCase(testDefinition, this);
+ FormulaTestCase formulaTestCase = createTestCase(testDefinition);
addTest(formulaTestCase);
}
@@ -67,6 +67,17 @@ public FormulaXMLTestSuite(String testSuiteName, List testDefinitionAbso
this.goldFileDirectoryPath = goldFileDirectoryPath;
}
+ /**
+ * Factory method to create a test case from a test definition.
+ * Subclasses can override to create custom test case instances.
+ *
+ * @param testDefinition the test definition to create a test case from
+ * @return a FormulaTestCase instance
+ */
+ protected FormulaTestCase createTestCase(FormulaTestDefinition testDefinition) {
+ return new FormulaTestCase(testDefinition, this);
+ }
+
/**
* Gets the DbTester instance for the test suite.
*
diff --git a/test-utils/src/main/resources/application.properties b/test-utils/src/main/resources/application.properties
new file mode 100644
index 00000000..41de80df
--- /dev/null
+++ b/test-utils/src/main/resources/application.properties
@@ -0,0 +1,2 @@
+loginUrl=https://login.test8.pc-rnd.salesforce.com
+userName=epic.out.e87e69a5454b@orgfarm.salesforce.com