diff --git a/core/src/main/java/org/opensearch/sql/calcite/utils/OpenSearchTypeFactory.java b/core/src/main/java/org/opensearch/sql/calcite/utils/OpenSearchTypeFactory.java
index e796d346449..9c15c1485c1 100644
--- a/core/src/main/java/org/opensearch/sql/calcite/utils/OpenSearchTypeFactory.java
+++ b/core/src/main/java/org/opensearch/sql/calcite/utils/OpenSearchTypeFactory.java
@@ -46,6 +46,8 @@
import org.apache.calcite.sql.type.SqlTypeName;
import org.apache.calcite.sql.type.SqlTypeUtil;
import org.checkerframework.checker.nullness.qual.Nullable;
+import org.opensearch.analytics.schema.BinaryType;
+import org.opensearch.analytics.schema.IpType;
import org.opensearch.sql.calcite.type.AbstractExprRelDataType;
import org.opensearch.sql.calcite.type.ExprBinaryType;
import org.opensearch.sql.calcite.type.ExprDateType;
@@ -275,6 +277,25 @@ public static ExprType convertRelDataTypeToExprType(RelDataType type) {
return exprType;
}
+ /**
+ * Result-schema-only variant of {@link #convertRelDataTypeToExprType} that recognizes the
+ * analytics-engine {@link IpType} / {@link BinaryType} markers as {@link ExprCoreType#IP} /
+ * {@link ExprCoreType#BINARY}.
+ *
+ *
Kept off the general path because Calcite's planner-internal coercion would round-trip
+ * through {@link #convertExprTypeToRelDataType} and synthesize {@code CAST(... AS ExprIPType)}
+ * casts the substrait converter can't handle.
+ */
+ public static ExprType convertAnalyticsEngineRelDataTypeToExprType(RelDataType type) {
+ if (type instanceof IpType) {
+ return IP;
+ }
+ if (type instanceof BinaryType) {
+ return BINARY;
+ }
+ return convertRelDataTypeToExprType(type);
+ }
+
public static ExprValue getExprValueByExprType(ExprType type, Object value) {
switch (type) {
case UNDEFINED:
diff --git a/core/src/main/java/org/opensearch/sql/executor/analytics/AnalyticsExecutionEngine.java b/core/src/main/java/org/opensearch/sql/executor/analytics/AnalyticsExecutionEngine.java
index ddfe5fd3556..1e997b15677 100644
--- a/core/src/main/java/org/opensearch/sql/executor/analytics/AnalyticsExecutionEngine.java
+++ b/core/src/main/java/org/opensearch/sql/executor/analytics/AnalyticsExecutionEngine.java
@@ -5,7 +5,10 @@
package org.opensearch.sql.executor.analytics;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
import java.util.ArrayList;
+import java.util.Base64;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -14,6 +17,9 @@
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeField;
import org.opensearch.analytics.exec.QueryPlanExecutor;
+import org.opensearch.analytics.schema.BinaryType;
+import org.opensearch.analytics.schema.IpType;
+import org.opensearch.common.network.InetAddresses;
import org.opensearch.core.action.ActionListener;
import org.opensearch.sql.ast.statement.ExplainMode;
import org.opensearch.sql.calcite.CalcitePlanContext;
@@ -123,15 +129,46 @@ private List convertRows(Iterable