@@ -67,6 +67,41 @@ typedef obj_p (*ray_cmp_f)(obj_p, obj_p, i64_t, i64_t, obj_p);
6767 NULL_OBJ; \
6868 })
6969
70+ // Indirection wrappers: force macro expansion before token-pasting in __CMP_*
71+ #define __CMP_A_V_X (x , y , lt , rt , mt , op , ln , of , ov ) __CMP_A_V(x, y, lt, rt, mt, op, ln, of, ov)
72+ #define __CMP_V_A_X (x , y , lt , rt , mt , op , ln , of , ov ) __CMP_V_A(x, y, lt, rt, mt, op, ln, of, ov)
73+ #define __CMP_V_V_X (x , y , lt , rt , mt , op , ln , of , ov ) __CMP_V_V(x, y, lt, rt, mt, op, ln, of, ov)
74+
75+ // Date↔Timestamp: EQ/NE truncate timestamp to date; LT/GT/LE/GE promote date to timestamp
76+ #define __DT_CMP_EQ (dt , ts ) EQI32(dt, timestamp_to_date(ts))
77+ #define __DT_CMP_NE (dt , ts ) NEI32(dt, timestamp_to_date(ts))
78+ #define __DT_CMP_LT (dt , ts ) LTI64(date_to_timestamp(dt), ts)
79+ #define __DT_CMP_GT (dt , ts ) GTI64(date_to_timestamp(dt), ts)
80+ #define __DT_CMP_LE (dt , ts ) LEI64(date_to_timestamp(dt), ts)
81+ #define __DT_CMP_GE (dt , ts ) GEI64(date_to_timestamp(dt), ts)
82+
83+ #define __TD_CMP_EQ (ts , dt ) EQI32(timestamp_to_date(ts), dt)
84+ #define __TD_CMP_NE (ts , dt ) NEI32(timestamp_to_date(ts), dt)
85+ #define __TD_CMP_LT (ts , dt ) LTI64(ts, date_to_timestamp(dt))
86+ #define __TD_CMP_GT (ts , dt ) GTI64(ts, date_to_timestamp(dt))
87+ #define __TD_CMP_LE (ts , dt ) LEI64(ts, date_to_timestamp(dt))
88+ #define __TD_CMP_GE (ts , dt ) GEI64(ts, date_to_timestamp(dt))
89+
90+ // Vector comparison target type and op, per operator
91+ #define __DT_MT_EQ date
92+ #define __DT_MT_NE date
93+ #define __DT_MT_LT timestamp
94+ #define __DT_MT_GT timestamp
95+ #define __DT_MT_LE timestamp
96+ #define __DT_MT_GE timestamp
97+
98+ #define __DT_OP_EQ EQI32
99+ #define __DT_OP_NE NEI32
100+ #define __DT_OP_LT LTI64
101+ #define __DT_OP_GT GTI64
102+ #define __DT_OP_LE LEI64
103+ #define __DT_OP_GE GEI64
104+
70105#define __DECLARE_CMP_FN (op ) \
71106 obj_p ray_##op##_partial(obj_p x, obj_p y, i64_t len, i64_t offset, obj_p res) { \
72107 i64_t i; \
@@ -394,22 +429,22 @@ typedef obj_p (*ray_cmp_f)(obj_p, obj_p, i64_t, i64_t, obj_p);
394429 case MTYPE2(TYPE_F64, TYPE_F64): \
395430 return __CMP_V_V(x, y, f64, f64, f64, op##F64, len, offset, res); \
396431 \
397- case MTYPE2(-TYPE_DATE, -TYPE_TIMESTAMP): \
398- return b8(op##F64(date_to_timestamp( x->i32) , y->i64)); \
399- case MTYPE2(-TYPE_DATE, TYPE_TIMESTAMP): \
400- return __CMP_A_V (x, y, date, timestamp, timestamp, op##I64 , len, offset, res); \
401- case MTYPE2(TYPE_DATE, -TYPE_TIMESTAMP): \
402- return __CMP_V_A (x, y, date, timestamp, timestamp, op##I64 , len, offset, res); \
403- case MTYPE2(TYPE_DATE, TYPE_TIMESTAMP): \
404- return __CMP_V_V (x, y, date, timestamp, timestamp, op##I64 , len, offset, res); \
405- case MTYPE2(-TYPE_TIMESTAMP, -TYPE_DATE): \
406- return b8(op##F64 (x->i64, date_to_timestamp( y->i32))); \
407- case MTYPE2(-TYPE_TIMESTAMP, TYPE_DATE): \
408- return __CMP_A_V (x, y, timestamp, date, timestamp, op##I64 , len, offset, res); \
409- case MTYPE2(TYPE_TIMESTAMP, -TYPE_DATE): \
410- return __CMP_V_A (x, y, timestamp, date, timestamp, op##I64 , len, offset, res); \
411- case MTYPE2(TYPE_TIMESTAMP, TYPE_DATE): \
412- return __CMP_V_V (x, y, timestamp, date, timestamp, op##I64 , len, offset, res); \
432+ case MTYPE2(-TYPE_DATE, -TYPE_TIMESTAMP): \
433+ return b8(__DT_CMP_##op( x->i32, y->i64)); \
434+ case MTYPE2(-TYPE_DATE, TYPE_TIMESTAMP): \
435+ return __CMP_A_V_X (x, y, date, timestamp, __DT_MT_##op, __DT_OP_##op , len, offset, res); \
436+ case MTYPE2(TYPE_DATE, -TYPE_TIMESTAMP): \
437+ return __CMP_V_A_X (x, y, date, timestamp, __DT_MT_##op, __DT_OP_##op , len, offset, res); \
438+ case MTYPE2(TYPE_DATE, TYPE_TIMESTAMP): \
439+ return __CMP_V_V_X (x, y, date, timestamp, __DT_MT_##op, __DT_OP_##op , len, offset, res); \
440+ case MTYPE2(-TYPE_TIMESTAMP, -TYPE_DATE): \
441+ return b8(__TD_CMP_##op (x->i64, y->i32)); \
442+ case MTYPE2(-TYPE_TIMESTAMP, TYPE_DATE): \
443+ return __CMP_A_V_X (x, y, timestamp, date, __DT_MT_##op, __DT_OP_##op , len, offset, res); \
444+ case MTYPE2(TYPE_TIMESTAMP, -TYPE_DATE): \
445+ return __CMP_V_A_X (x, y, timestamp, date, __DT_MT_##op, __DT_OP_##op , len, offset, res); \
446+ case MTYPE2(TYPE_TIMESTAMP, TYPE_DATE): \
447+ return __CMP_V_V_X (x, y, timestamp, date, __DT_MT_##op, __DT_OP_##op , len, offset, res); \
413448 \
414449 case MTYPE2(TYPE_ENUM, -TYPE_SYMBOL): \
415450 k = ray_key(x); \
0 commit comments