blob: c7e8aa87732dcbddaa9a64740a1f42a0f3441d99 [file] [log] [blame]
/*
* pxffilters.h
*
* Header for handling push down of supported scan level filters to PXF.
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
#ifndef _PXF_FILTERS_H_
#define _PXF_FILTERS_H_
#include "postgres.h"
#include "access/attnum.h"
#include "executor/executor.h"
#include "nodes/pg_list.h"
/*
* each supported operator has a code that will describe the operator
* type in the final serialized string that gets pushed down.
*
* NOTE: the codes could be forced into a single byte, but list will
* grow larger in the future, so why bother.
*/
typedef enum PxfOperatorCode
{
PXFOP_LT = 1,
PXFOP_GT,
PXFOP_LE,
PXFOP_GE,
PXFOP_EQ,
PXFOP_NE,
PXFOP_LIKE,
PXFOP_IS_NULL,
PXFOP_IS_NOTNULL,
PXFOP_IN
} PxfOperatorCode;
/*
* each supported operand from both sides of the operator is represented
* by a code that will describe the operator type in the final serialized
* string that gets pushed down.
*/
#define PXF_ATTR_CODE 'a'
#define PXF_SCALAR_CONST_CODE 'c'
#define PXF_LIST_CONST_CODE 'm'
#define PXF_SIZE_BYTES 's'
#define PXF_CONST_DATA 'd'
#define PXF_OPERATOR_CODE 'o'
#define PXF_LOGICAL_OPERATOR_CODE 'l'
#define NullConstValue "NULL"
#define TrueConstValue "true"
#define FalseConstValue "false"
/*
* An Operand has any of the above codes, and the information specific to
* its type. This could be compacted but filter structures are expected to
* be very few and very small so it's ok as is.
*/
typedef struct PxfOperand
{
char opcode; /* PXF_ATTR_CODE, PXF_SCALAR_CONST_CODE, PXF_LIST_CONST_CODE*/
AttrNumber attnum; /* used when opcode is PXF_ATTR_CODE */
StringInfo conststr; /* used when opcode is PXF_SCALAR_CONST_CODE or PXF_LIST_CONST_CODE*/
Oid consttype; /* used when opcode is PXF_SCALAR_CONST_CODE or PXF_LIST_CONST_CODE*/
} PxfOperand;
/*
* A PXF filter has a left and right operands, and an operator.
*/
typedef struct PxfFilterDesc
{
PxfOperand l; /* left operand */
PxfOperand r; /* right operand or InvalidAttrNumber if none */
PxfOperatorCode op; /* operator code */
} PxfFilterDesc;
/*
* HAWQ operator OID to PXF operator code mapping used for OpExpr
*/
typedef struct dbop_pxfop_map
{
Oid dbop;
PxfOperatorCode pxfop;
} dbop_pxfop_map;
/*
* HAWQ operator OID to PXF operator code mapping used for ScalarArrayOpExpr
*/
typedef struct dbop_pxfop_array_map
{
Oid dbop;
PxfOperatorCode pxfop;
bool useOr;
} dbop_pxfop_array_map;
typedef struct ExpressionItem
{
Node *node;
Node *parent;
bool processed;
} ExpressionItem;
static inline bool pxfoperand_is_attr(PxfOperand x)
{
return (x.opcode == PXF_ATTR_CODE);
}
static inline bool pxfoperand_is_scalar_const(PxfOperand x)
{
return (x.opcode == PXF_SCALAR_CONST_CODE);
}
static inline bool pxfoperand_is_list_const(PxfOperand x)
{
return (x.opcode == PXF_LIST_CONST_CODE);
}
char *serializePxfFilterQuals(List *quals);
List* extractPxfAttributes(List* quals);
#endif // _PXF_FILTERS_H_