12
12
#include <utils/builtins.h>
13
13
#include <utils/lsyscache.h>
14
14
#include <utils/typcache.h>
15
+ #include <tcop/tcopprot.h>
15
16
16
17
#include "hypertable_restrict_info.h"
17
18
20
21
#include "dimension.h"
21
22
#include "dimension_slice.h"
22
23
#include "dimension_vector.h"
24
+ #include "expression_utils.h"
23
25
#include "guc.h"
24
26
#include "hypercube.h"
25
27
#include "partitioning.h"
26
28
#include "scan_iterator.h"
27
29
#include "utils.h"
28
30
29
- #include <inttypes.h>
30
- #include <tcop/tcopprot.h>
31
-
32
31
typedef struct DimensionRestrictInfo
33
32
{
34
33
const Dimension * dimension ;
@@ -307,13 +306,12 @@ hypertable_restrict_info_get(HypertableRestrictInfo *hri, AttrNumber attno)
307
306
308
307
typedef DimensionValues * (* get_dimension_values )(Const * c , bool use_or );
309
308
310
- static bool
311
- hypertable_restrict_info_add_expr (HypertableRestrictInfo * hri , PlannerInfo * root , List * expr_args ,
312
- Oid op_oid , get_dimension_values func_get_dim_values , bool use_or )
309
+ static void
310
+ hypertable_restrict_info_add_expr (HypertableRestrictInfo * hri , PlannerInfo * root , Var * v ,
311
+ Expr * expr , Oid op_oid , get_dimension_values func_get_dim_values ,
312
+ bool use_or )
313
313
{
314
- Expr * leftop , * rightop , * expr ;
315
314
DimensionRestrictInfo * dri ;
316
- Var * v ;
317
315
Const * c ;
318
316
RangeTblEntry * rte ;
319
317
Oid columntype ;
@@ -322,58 +320,36 @@ hypertable_restrict_info_add_expr(HypertableRestrictInfo *hri, PlannerInfo *root
322
320
Oid lefttype , righttype ;
323
321
DimensionValues * dimvalues ;
324
322
325
- if (list_length (expr_args ) != 2 )
326
- return false;
327
-
328
- leftop = linitial (expr_args );
329
- rightop = lsecond (expr_args );
330
-
331
- if (IsA (leftop , RelabelType ))
332
- leftop = ((RelabelType * ) leftop )-> arg ;
333
- if (IsA (rightop , RelabelType ))
334
- rightop = ((RelabelType * ) rightop )-> arg ;
335
-
336
- if (IsA (leftop , Var ))
337
- {
338
- v = (Var * ) leftop ;
339
- expr = rightop ;
340
- }
341
- else if (IsA (rightop , Var ))
342
- {
343
- v = (Var * ) rightop ;
344
- expr = leftop ;
345
- op_oid = get_commutator (op_oid );
346
- }
347
- else
348
- return false;
349
-
350
323
dri = hypertable_restrict_info_get (hri , v -> varattno );
351
324
/* the attribute is not a dimension */
352
325
if (dri == NULL )
353
- return false ;
326
+ return ;
354
327
355
328
expr = (Expr * ) eval_const_expressions (root , (Node * ) expr );
356
329
357
330
if (!IsA (expr , Const ) || !OidIsValid (op_oid ) || !op_strict (op_oid ))
358
- return false ;
331
+ return ;
359
332
360
333
c = (Const * ) expr ;
361
334
362
335
/* quick check for a NULL constant */
363
336
if (c -> constisnull )
364
- return false ;
337
+ return ;
365
338
366
339
rte = rt_fetch (v -> varno , root -> parse -> rtable );
367
340
368
341
columntype = get_atttype (rte -> relid , dri -> dimension -> column_attno );
369
342
tce = lookup_type_cache (columntype , TYPECACHE_BTREE_OPFAMILY );
370
343
371
344
if (!op_in_opfamily (op_oid , tce -> btree_opf ))
372
- return false ;
345
+ return ;
373
346
374
347
get_op_opfamily_properties (op_oid , tce -> btree_opf , false, & strategy , & lefttype , & righttype );
375
348
dimvalues = func_get_dim_values (c , use_or );
376
- return dimension_restrict_info_add (dri , strategy , c -> constcollid , dimvalues );
349
+ if (dimension_restrict_info_add (dri , strategy , c -> constcollid , dimvalues ))
350
+ {
351
+ hri -> num_base_restrictions ++ ;
352
+ }
377
353
}
378
354
379
355
static DimensionValues *
@@ -426,48 +402,41 @@ static void
426
402
hypertable_restrict_info_add_restrict_info (HypertableRestrictInfo * hri , PlannerInfo * root ,
427
403
RestrictInfo * ri )
428
404
{
429
- bool added = false;
405
+ Oid opno ;
406
+ Var * var ;
407
+ Expr * arg_value ;
430
408
431
409
Expr * e = ri -> clause ;
432
410
433
411
/* Same as constraint_exclusion */
434
412
if (contain_mutable_functions ((Node * ) e ))
435
413
return ;
436
414
437
- switch ( nodeTag ( e ))
415
+ if ( ts_extract_expr_args ( e , & var , & arg_value , & opno , NULL ))
438
416
{
439
- case T_OpExpr :
440
- {
441
- OpExpr * op_expr = (OpExpr * ) e ;
442
-
443
- added = hypertable_restrict_info_add_expr (hri ,
444
- root ,
445
- op_expr -> args ,
446
- op_expr -> opno ,
447
- dimension_values_create_from_single_element ,
448
- false);
449
- break ;
450
- }
417
+ get_dimension_values value_func ;
418
+ bool use_or ;
451
419
452
- case T_ScalarArrayOpExpr :
420
+ switch ( nodeTag ( e ))
453
421
{
454
- ScalarArrayOpExpr * scalar_expr = (ScalarArrayOpExpr * ) e ;
455
-
456
- added = hypertable_restrict_info_add_expr (hri ,
457
- root ,
458
- scalar_expr -> args ,
459
- scalar_expr -> opno ,
460
- dimension_values_create_from_array ,
461
- scalar_expr -> useOr );
462
- break ;
422
+ case T_OpExpr :
423
+ {
424
+ value_func = dimension_values_create_from_single_element ;
425
+ use_or = false;
426
+ break ;
427
+ }
428
+ case T_ScalarArrayOpExpr :
429
+ {
430
+ value_func = dimension_values_create_from_array ;
431
+ use_or = castNode (ScalarArrayOpExpr , e )-> useOr ;
432
+ break ;
433
+ }
434
+ default :
435
+ /* we don't support other node types */
436
+ return ;
463
437
}
464
- default :
465
- /* we don't support other node types */
466
- break ;
438
+ hypertable_restrict_info_add_expr (hri , root , var , arg_value , opno , value_func , use_or );
467
439
}
468
-
469
- if (added )
470
- hri -> num_base_restrictions ++ ;
471
440
}
472
441
473
442
void
0 commit comments