korlov42 commented on code in PR #6406:
URL: https://github.com/apache/ignite-3/pull/6406#discussion_r2269874402


##########
modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/partitionawareness/PartitionAwarenessMetadataExtractor.java:
##########
@@ -113,11 +124,31 @@ public static PartitionAwarenessMetadata 
getMetadata(IgniteKeyValueModify kv) {
             if (expr instanceof RexDynamicParam) {
                 RexDynamicParam dynamicParam = (RexDynamicParam) expr;
                 indexes[i] = dynamicParam.getIndex();
+                onlyLiterals = false;
+            } else if (expr instanceof RexLiteral) {
+                RexLiteral expr0 = (RexLiteral) expr;
+
+                // depends on supplied zoneId, it can`t be cached
+                if (expr0.getTypeName() == 
SqlTypeName.TIMESTAMP_WITH_LOCAL_TIME_ZONE) {
+                    return null;
+                }
+
+                indexes[i] = hashPos--;
+                NativeType nativeType = 
IgniteTypeFactory.relDataTypeToNative(expr0.getType());
+                Object val = getValueFromLiteral(nativeType, expr0);
+                hashFields.add(ColocationUtils.hash(val, nativeType));
             } else {
                 return null;
             }
         }
 
+        // case for IgniteKeyValueModify with only literals in colocation 
columns.
+        if (fullRow && onlyLiterals) {
+            return null;

Review Comment:
   what is the point of discarding expensive computation here?



##########
modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/prepare/partitionawareness/PartitionAwarenessMetadataTest.java:
##########
@@ -158,33 +184,33 @@ public void shortKey(String query, 
PartitionAwarenessMetadata expected) {
     private static Stream<Arguments> shortKeyMetadata() {
         return Stream.of(
                 // KV GET
-                Arguments.of("SELECT * FROM t WHERE c3=? and c2=?", 
dynamicParams(0)),
-                Arguments.of("SELECT * FROM t WHERE c2=? and c3=?", 
dynamicParams(1)),
-                Arguments.of("SELECT * FROM t WHERE c1=? and c2=? and c3=?", 
dynamicParams(2)),
-                Arguments.of("SELECT * FROM t WHERE c3=? and c1=? and c2=?", 
dynamicParams(0)),
-                Arguments.of("SELECT * FROM t WHERE c3=? and c2=1", 
dynamicParams(0)),
-                Arguments.of("SELECT * FROM t WHERE c1=1 and c2=? and c3=?", 
dynamicParams(1)),
+                Arguments.of("SELECT * FROM t WHERE c3=? and c2=?", meta(0)),
+                Arguments.of("SELECT * FROM t WHERE c2=? and c3=?", meta(1)),
+                Arguments.of("SELECT * FROM t WHERE c1=? and c2=? and c3=?", 
meta(2)),
+                Arguments.of("SELECT * FROM t WHERE c3=? and c1=? and c2=?", 
meta(0)),
+                Arguments.of("SELECT * FROM t WHERE c3=? and c2=1", meta(0)),
+                Arguments.of("SELECT * FROM t WHERE c1=1 and c2=? and c3=?", 
meta(1)),
 
                 Arguments.of("SELECT * FROM t WHERE c3=3", null),
-                Arguments.of("SELECT * FROM t WHERE c2=? and c3=3", null),
-                Arguments.of("SELECT * FROM t WHERE c1=? and c2=? and c3=3", 
null),
+                Arguments.of("SELECT * FROM t WHERE c2=? and c3=3", meta(new 
int[]{-1}, new int[]{3})),
+                Arguments.of("SELECT * FROM t WHERE c1=? and c2=? and c3=3", 
meta(new int[]{-1}, new int[]{3})),
 
                 // KV PUT
-                Arguments.of("INSERT INTO t VALUES (?, ?, ?)",  
dynamicParamsTrackingRequired(2)),
-                Arguments.of("INSERT INTO t (c1, c2, c3) VALUES (?, ?, ?)", 
dynamicParamsTrackingRequired(2)),
-                Arguments.of("INSERT INTO t (c3, c1, c2) VALUES (?, ?, ?)", 
dynamicParamsTrackingRequired(0)),
+                Arguments.of("INSERT INTO t VALUES (?, ?, ?)",  
metaTrackingRequired(2)),
+                Arguments.of("INSERT INTO t (c1, c2, c3) VALUES (?, ?, ?)", 
metaTrackingRequired(2)),
+                Arguments.of("INSERT INTO t (c3, c1, c2) VALUES (?, ?, ?)", 
metaTrackingRequired(0)),
 
                 Arguments.of("INSERT INTO t (c1, c2, c3) VALUES (?, ?, 3)", 
null),
                 Arguments.of("INSERT INTO t (c1, c3, c2) VALUES (?, 3, ?)", 
null),
                 Arguments.of("INSERT INTO t (c3, c1, c2) VALUES (3, ?, ?)", 
null),
 
                 // KV DELETE
-                Arguments.of("SELECT * FROM t WHERE c3=? and c2=?", 
dynamicParams(0)),
-                Arguments.of("SELECT * FROM t WHERE c2=? and c3=?", 
dynamicParams(1)),
-                Arguments.of("SELECT * FROM t WHERE c3=? and c2=1", 
dynamicParams(0)),
+                Arguments.of("SELECT * FROM t WHERE c3=? and c2=?", meta(0)),

Review Comment:
   these 5 test cases are supposed to be `DELETE` statements, but I forgot to 
change this copy-past in my PR I merged recently. May you fix this please?



##########
modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/RexUtils.java:
##########
@@ -1191,6 +1202,34 @@ public Void visitLocalRef(RexLocalRef locRef) {
         return val;
     }
 
+    /** Return literal holding java object according to it`s type. */
+    public static @Nullable Object getValueFromLiteral(NativeType 
physicalType, RexLiteral lit) {

Review Comment:
   I'm wondering if we really need one more way to extract values from literal 
expressions. We already have `literalValue`+`TypeUtils#fromInternal`



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@ignite.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to