8
8
"github.com/stretchr/testify/require"
9
9
10
10
"github.com/grafana/loki/v3/pkg/dataobj"
11
+ "github.com/grafana/loki/v3/pkg/engine/internal/datatype"
11
12
"github.com/grafana/loki/v3/pkg/engine/internal/types"
12
13
"github.com/grafana/loki/v3/pkg/engine/planner/physical"
13
14
)
@@ -30,6 +31,10 @@ func tsColExpr() *physical.ColumnExpr {
30
31
return newColumnExpr (types .ColumnNameBuiltinTimestamp , types .ColumnTypeBuiltin )
31
32
}
32
33
34
+ func ts (t time.Time ) datatype.Timestamp {
35
+ return datatype .Timestamp (t .UnixNano ())
36
+ }
37
+
33
38
func TestMapTimestampPredicate (t * testing.T ) {
34
39
time100 := time .Unix (0 , 100 ).UTC ()
35
40
time200 := time .Unix (0 , 200 ).UTC ()
@@ -46,7 +51,7 @@ func TestMapTimestampPredicate(t *testing.T) {
46
51
expr : & physical.BinaryExpr {
47
52
Left : tsColExpr (),
48
53
Op : types .BinaryOpEq ,
49
- Right : physical .NewLiteral (time100 ),
54
+ Right : physical .NewLiteral (ts ( time100 ) ),
50
55
},
51
56
want : dataobj.TimeRangePredicate [dataobj.LogsPredicate ]{
52
57
StartTime : time100 ,
@@ -60,7 +65,7 @@ func TestMapTimestampPredicate(t *testing.T) {
60
65
expr : & physical.BinaryExpr {
61
66
Left : tsColExpr (),
62
67
Op : types .BinaryOpGt ,
63
- Right : physical .NewLiteral (time100 ),
68
+ Right : physical .NewLiteral (ts ( time100 ) ),
64
69
},
65
70
want : dataobj.TimeRangePredicate [dataobj.LogsPredicate ]{
66
71
StartTime : time100 ,
@@ -74,7 +79,7 @@ func TestMapTimestampPredicate(t *testing.T) {
74
79
expr : & physical.BinaryExpr {
75
80
Left : tsColExpr (),
76
81
Op : types .BinaryOpGte ,
77
- Right : physical .NewLiteral (time100 ),
82
+ Right : physical .NewLiteral (ts ( time100 ) ),
78
83
},
79
84
want : dataobj.TimeRangePredicate [dataobj.LogsPredicate ]{
80
85
StartTime : time100 ,
@@ -88,7 +93,7 @@ func TestMapTimestampPredicate(t *testing.T) {
88
93
expr : & physical.BinaryExpr {
89
94
Left : tsColExpr (),
90
95
Op : types .BinaryOpLt ,
91
- Right : physical .NewLiteral (time100 ),
96
+ Right : physical .NewLiteral (ts ( time100 ) ),
92
97
},
93
98
want : dataobj.TimeRangePredicate [dataobj.LogsPredicate ]{
94
99
StartTime : testOpenStart ,
@@ -102,7 +107,7 @@ func TestMapTimestampPredicate(t *testing.T) {
102
107
expr : & physical.BinaryExpr {
103
108
Left : tsColExpr (),
104
109
Op : types .BinaryOpLte ,
105
- Right : physical .NewLiteral (time100 ),
110
+ Right : physical .NewLiteral (ts ( time100 ) ),
106
111
},
107
112
want : dataobj.TimeRangePredicate [dataobj.LogsPredicate ]{
108
113
StartTime : testOpenStart ,
@@ -119,7 +124,7 @@ func TestMapTimestampPredicate(t *testing.T) {
119
124
Right : & physical.BinaryExpr {
120
125
Left : tsColExpr (),
121
126
Op : types .BinaryOpLt ,
122
- Right : physical .NewLiteral (time100 ),
127
+ Right : physical .NewLiteral (ts ( time100 ) ),
123
128
},
124
129
},
125
130
errMatch : "invalid RHS for comparison: expected literal timestamp, got *physical.BinaryExpr" ,
@@ -135,23 +140,23 @@ func TestMapTimestampPredicate(t *testing.T) {
135
140
Right : & physical.BinaryExpr {
136
141
Left : tsColExpr (),
137
142
Op : types .BinaryOpLte ,
138
- Right : physical .NewLiteral (time200 ),
143
+ Right : physical .NewLiteral (ts ( time200 ) ),
139
144
},
140
145
},
141
146
},
142
147
errMatch : "invalid RHS for comparison: expected literal timestamp, got *physical.BinaryExpr" ,
143
148
},
144
149
{
145
150
desc : "input is not BinaryExpr" ,
146
- expr : physical .NewLiteral (time100 ),
151
+ expr : physical .NewLiteral (ts ( time100 ) ),
147
152
errMatch : "unsupported expression type for timestamp predicate: *physical.LiteralExpr, expected *physical.BinaryExpr" ,
148
153
},
149
154
{
150
155
desc : "LHS of BinaryExpr is not ColumnExpr" ,
151
156
expr : & physical.BinaryExpr {
152
- Left : physical .NewLiteral (time100 ),
157
+ Left : physical .NewLiteral (ts ( time100 ) ),
153
158
Op : types .BinaryOpEq ,
154
- Right : physical .NewLiteral (time200 ),
159
+ Right : physical .NewLiteral (ts ( time200 ) ),
155
160
},
156
161
errMatch : "invalid LHS for comparison: expected timestamp column, got 1970-01-01T00:00:00.0000001Z" ,
157
162
},
@@ -160,7 +165,7 @@ func TestMapTimestampPredicate(t *testing.T) {
160
165
expr : & physical.BinaryExpr {
161
166
Left : newColumnExpr ("other_col" , types .ColumnTypeBuiltin ),
162
167
Op : types .BinaryOpEq ,
163
- Right : physical .NewLiteral (time100 ),
168
+ Right : physical .NewLiteral (ts ( time100 ) ),
164
169
},
165
170
errMatch : "invalid LHS for comparison: expected timestamp column, got builtin.other_col" ,
166
171
},
@@ -187,7 +192,7 @@ func TestMapTimestampPredicate(t *testing.T) {
187
192
expr : & physical.BinaryExpr {
188
193
Left : tsColExpr (),
189
194
Op : types .BinaryOpAnd ,
190
- Right : physical .NewLiteral (time100 ),
195
+ Right : physical .NewLiteral (ts ( time100 ) ),
191
196
},
192
197
errMatch : "invalid left operand for AND: unsupported expression type for timestamp predicate: *physical.ColumnExpr, expected *physical.BinaryExpr" ,
193
198
},
@@ -199,7 +204,7 @@ func TestMapTimestampPredicate(t *testing.T) {
199
204
Right : & physical.BinaryExpr {
200
205
Left : tsColExpr (),
201
206
Op : types .BinaryOpGt ,
202
- Right : physical .NewLiteral (time100 ),
207
+ Right : physical .NewLiteral (ts ( time100 ) ),
203
208
},
204
209
},
205
210
errMatch : "unsupported operator for timestamp predicate: OR" ,
@@ -210,13 +215,13 @@ func TestMapTimestampPredicate(t *testing.T) {
210
215
Left : & physical.BinaryExpr {
211
216
Left : tsColExpr (),
212
217
Op : types .BinaryOpGt ,
213
- Right : physical .NewLiteral (time100 ),
218
+ Right : physical .NewLiteral (ts ( time100 ) ),
214
219
},
215
220
Op : types .BinaryOpAnd ,
216
221
Right : & physical.BinaryExpr {
217
222
Left : tsColExpr (),
218
223
Op : types .BinaryOpLt ,
219
- Right : physical .NewLiteral (time200 ),
224
+ Right : physical .NewLiteral (ts ( time200 ) ),
220
225
},
221
226
},
222
227
want : dataobj.TimeRangePredicate [dataobj.LogsPredicate ]{
@@ -232,13 +237,13 @@ func TestMapTimestampPredicate(t *testing.T) {
232
237
Left : & physical.BinaryExpr {
233
238
Left : tsColExpr (),
234
239
Op : types .BinaryOpGte ,
235
- Right : physical .NewLiteral (time100 ),
240
+ Right : physical .NewLiteral (ts ( time100 ) ),
236
241
},
237
242
Op : types .BinaryOpAnd ,
238
243
Right : & physical.BinaryExpr {
239
244
Left : tsColExpr (),
240
245
Op : types .BinaryOpLte ,
241
- Right : physical .NewLiteral (time200 ),
246
+ Right : physical .NewLiteral (ts ( time200 ) ),
242
247
},
243
248
},
244
249
want : dataobj.TimeRangePredicate [dataobj.LogsPredicate ]{
@@ -254,13 +259,13 @@ func TestMapTimestampPredicate(t *testing.T) {
254
259
Left : & physical.BinaryExpr {
255
260
Left : tsColExpr (),
256
261
Op : types .BinaryOpGte ,
257
- Right : physical .NewLiteral (time100 ),
262
+ Right : physical .NewLiteral (ts ( time100 ) ),
258
263
},
259
264
Op : types .BinaryOpAnd ,
260
265
Right : & physical.BinaryExpr {
261
266
Left : tsColExpr (),
262
267
Op : types .BinaryOpLt ,
263
- Right : physical .NewLiteral (time100 ),
268
+ Right : physical .NewLiteral (ts ( time100 ) ),
264
269
},
265
270
},
266
271
errMatch : "impossible time range: start_time (1970-01-01 00:00:00.0000001 +0000 UTC) equals end_time (1970-01-01 00:00:00.0000001 +0000 UTC) but the range is exclusive" ,
@@ -271,13 +276,13 @@ func TestMapTimestampPredicate(t *testing.T) {
271
276
Left : & physical.BinaryExpr {
272
277
Left : tsColExpr (),
273
278
Op : types .BinaryOpGt ,
274
- Right : physical .NewLiteral (time100 ),
279
+ Right : physical .NewLiteral (ts ( time100 ) ),
275
280
},
276
281
Op : types .BinaryOpAnd ,
277
282
Right : & physical.BinaryExpr {
278
283
Left : tsColExpr (),
279
284
Op : types .BinaryOpLte ,
280
- Right : physical .NewLiteral (time100 ),
285
+ Right : physical .NewLiteral (ts ( time100 ) ),
281
286
},
282
287
},
283
288
errMatch : "impossible time range: start_time (1970-01-01 00:00:00.0000001 +0000 UTC) equals end_time (1970-01-01 00:00:00.0000001 +0000 UTC) but the range is exclusive" ,
@@ -288,13 +293,13 @@ func TestMapTimestampPredicate(t *testing.T) {
288
293
Left : & physical.BinaryExpr {
289
294
Left : tsColExpr (),
290
295
Op : types .BinaryOpGte ,
291
- Right : physical .NewLiteral (time100 ),
296
+ Right : physical .NewLiteral (ts ( time100 ) ),
292
297
},
293
298
Op : types .BinaryOpAnd ,
294
299
Right : & physical.BinaryExpr {
295
300
Left : tsColExpr (),
296
301
Op : types .BinaryOpLte ,
297
- Right : physical .NewLiteral (time100 ),
302
+ Right : physical .NewLiteral (ts ( time100 ) ),
298
303
},
299
304
},
300
305
want : dataobj.TimeRangePredicate [dataobj.LogsPredicate ]{
@@ -310,13 +315,13 @@ func TestMapTimestampPredicate(t *testing.T) {
310
315
Left : & physical.BinaryExpr {
311
316
Left : tsColExpr (),
312
317
Op : types .BinaryOpEq ,
313
- Right : physical .NewLiteral (time100 ),
318
+ Right : physical .NewLiteral (ts ( time100 ) ),
314
319
},
315
320
Op : types .BinaryOpAnd ,
316
321
Right : & physical.BinaryExpr {
317
322
Left : tsColExpr (),
318
323
Op : types .BinaryOpEq ,
319
- Right : physical .NewLiteral (time200 ),
324
+ Right : physical .NewLiteral (ts ( time200 ) ),
320
325
},
321
326
},
322
327
errMatch : "impossible time range: start_time (1970-01-01 00:00:00.0000002 +0000 UTC) is after end_time (1970-01-01 00:00:00.0000001 +0000 UTC)" ,
@@ -327,13 +332,13 @@ func TestMapTimestampPredicate(t *testing.T) {
327
332
Left : & physical.BinaryExpr {
328
333
Left : tsColExpr (),
329
334
Op : types .BinaryOpLt ,
330
- Right : physical .NewLiteral (time100 ),
335
+ Right : physical .NewLiteral (ts ( time100 ) ),
331
336
},
332
337
Op : types .BinaryOpAnd ,
333
338
Right : & physical.BinaryExpr {
334
339
Left : tsColExpr (),
335
340
Op : types .BinaryOpGt ,
336
- Right : physical .NewLiteral (time200 ),
341
+ Right : physical .NewLiteral (ts ( time200 ) ),
337
342
},
338
343
},
339
344
errMatch : "impossible time range: start_time (1970-01-01 00:00:00.0000002 +0000 UTC) is after end_time (1970-01-01 00:00:00.0000001 +0000 UTC)" ,
@@ -345,20 +350,20 @@ func TestMapTimestampPredicate(t *testing.T) {
345
350
Left : & physical.BinaryExpr {
346
351
Left : tsColExpr (),
347
352
Op : types .BinaryOpGt ,
348
- Right : physical .NewLiteral (time100 ),
353
+ Right : physical .NewLiteral (ts ( time100 ) ),
349
354
},
350
355
Op : types .BinaryOpAnd ,
351
356
Right : & physical.BinaryExpr {
352
357
Left : tsColExpr (),
353
358
Op : types .BinaryOpLt ,
354
- Right : physical .NewLiteral (time300 ),
359
+ Right : physical .NewLiteral (ts ( time300 ) ),
355
360
},
356
361
},
357
362
Op : types .BinaryOpAnd ,
358
363
Right : & physical.BinaryExpr {
359
364
Left : tsColExpr (),
360
365
Op : types .BinaryOpEq ,
361
- Right : physical .NewLiteral (time200 ),
366
+ Right : physical .NewLiteral (ts ( time200 ) ),
362
367
},
363
368
},
364
369
want : dataobj.TimeRangePredicate [dataobj.LogsPredicate ]{
@@ -374,13 +379,13 @@ func TestMapTimestampPredicate(t *testing.T) {
374
379
Left : & physical.BinaryExpr { // Invalid: LHS not timestamp column
375
380
Left : newColumnExpr ("not_ts" , types .ColumnTypeBuiltin ),
376
381
Op : types .BinaryOpGt ,
377
- Right : physical .NewLiteral (time100 ),
382
+ Right : physical .NewLiteral (ts ( time100 ) ),
378
383
},
379
384
Op : types .BinaryOpAnd ,
380
385
Right : & physical.BinaryExpr {
381
386
Left : tsColExpr (),
382
387
Op : types .BinaryOpLt ,
383
- Right : physical .NewLiteral (time200 ),
388
+ Right : physical .NewLiteral (ts ( time200 ) ),
384
389
},
385
390
},
386
391
errMatch : "invalid left operand for AND: invalid LHS for comparison: expected timestamp column, got builtin.not_ts" ,
@@ -391,7 +396,7 @@ func TestMapTimestampPredicate(t *testing.T) {
391
396
Left : & physical.BinaryExpr {
392
397
Left : tsColExpr (),
393
398
Op : types .BinaryOpGt ,
394
- Right : physical .NewLiteral (time100 ),
399
+ Right : physical .NewLiteral (ts ( time100 ) ),
395
400
},
396
401
Op : types .BinaryOpAnd ,
397
402
Right : & physical.BinaryExpr { // Invalid: RHS literal not timestamp
@@ -408,13 +413,13 @@ func TestMapTimestampPredicate(t *testing.T) {
408
413
Left : & physical.BinaryExpr {
409
414
Left : tsColExpr (),
410
415
Op : types .BinaryOpLt ,
411
- Right : physical .NewLiteral (time100 ),
416
+ Right : physical .NewLiteral (ts ( time100 ) ),
412
417
},
413
418
Op : types .BinaryOpAnd ,
414
419
Right : & physical.BinaryExpr {
415
420
Left : tsColExpr (),
416
421
Op : types .BinaryOpLt ,
417
- Right : physical .NewLiteral (time200 ),
422
+ Right : physical .NewLiteral (ts ( time200 ) ),
418
423
},
419
424
},
420
425
want : dataobj.TimeRangePredicate [dataobj.LogsPredicate ]{
@@ -430,13 +435,13 @@ func TestMapTimestampPredicate(t *testing.T) {
430
435
Left : & physical.BinaryExpr {
431
436
Left : tsColExpr (),
432
437
Op : types .BinaryOpLt ,
433
- Right : physical .NewLiteral (time200 ),
438
+ Right : physical .NewLiteral (ts ( time200 ) ),
434
439
},
435
440
Op : types .BinaryOpAnd ,
436
441
Right : & physical.BinaryExpr {
437
442
Left : tsColExpr (),
438
443
Op : types .BinaryOpLt ,
439
- Right : physical .NewLiteral (time100 ),
444
+ Right : physical .NewLiteral (ts ( time100 ) ),
440
445
},
441
446
},
442
447
want : dataobj.TimeRangePredicate [dataobj.LogsPredicate ]{
@@ -619,7 +624,7 @@ func TestMapMetadataPredicate(t *testing.T) {
619
624
name : "error: RHS literal not string for EQ" ,
620
625
expr : & physical.BinaryExpr {
621
626
Left : & physical.ColumnExpr {Ref : types.ColumnRef {Column : "foo" , Type : types .ColumnTypeMetadata }},
622
- Right : physical .NewLiteral (123 ), // Not string
627
+ Right : physical .NewLiteral (int64 ( 123 ) ), // Not string
623
628
Op : types .BinaryOpEq ,
624
629
},
625
630
expectedPred : nil ,
0 commit comments