/************************************************************************ ** char_const : gather up a character constant ** we're called after finding the openning single quote. ************************************************************************/ token_t char_const(void) { REG WCHAR c; value_t value; token_t tok; tok = (token_t)(Jflag ? L_CUNSIGNED : L_CINTEGER); first_switch: switch(CHARMAP(c = GETCH())) { case LX_BACKSLASH: break; case LX_SQUOTE: strcpy (Msg_Text, GET_MSG (2137)); //"empty character constant" error(2137); value.v_long = 0; UNGETCH(); break; case LX_EOS: /* ??? assumes i/o buffering > 1 char */ if(handle_eos() != BACKSLASH_EOS) { goto first_switch; } value.v_long = escape(get_non_eof()); if( tok == L_CUNSIGNED ) { /* don't sign extend */ value.v_long &= 0xff; } break; case LX_NL: /* newline in character constant */ strcpy (Msg_Text, GET_MSG (2001)); error (2001); UNGETCH(); /* ** FALLTHROUGH */ default: value.v_long = c; break; } if((c = get_non_eof()) != L'\'') { strcpy (Msg_Text, GET_MSG (2015)); error (2015); /* too many chars in constant */ do { if(c == L'\n') { strcpy (Msg_Text, GET_MSG (2016)); error(2016); /* missing closing ' */ break; } } while((c = get_non_eof()) != L'\''); } yylval.yy_tree = build_const(tok, &value); return(tok); }
void test__opexpr_to_pxffilter__unsupportedTypeCircle(void **state) { PxfFilterDesc *filter = (PxfFilterDesc*) palloc0(sizeof(PxfFilterDesc)); Var *arg_var = build_var(CIRCLEOID, 8); Const *arg_const = build_const(CIRCLEOID, NULL); OpExpr *expr = build_op_expr(arg_const, arg_var, 0 /* whatever */); /* run test */ assert_false(opexpr_to_pxffilter(expr, filter)); pxf_free_filter(filter); list_free_deep(expr->args); /* free all args */ pfree(expr); }
void test__opexpr_to_pxffilter__unsupportedOpNot(void **state) { PxfFilterDesc *filter = (PxfFilterDesc*) palloc0(sizeof(PxfFilterDesc)); Var *arg_var = build_var(INT2OID, 3); char* const_value = strdup("not"); /* will be free'd by const_to_str */ Const *arg_const = build_const(INT2OID, const_value); OpExpr *expr = build_op_expr(arg_const, arg_var, 1877 /* int2not */); /* run test */ assert_false(opexpr_to_pxffilter(expr, filter)); pxf_free_filter(filter); list_free_deep(expr->args); /* free all args */ pfree(expr); }
/* * Test for a query with different types. * Types pairing are not checked, it is covered by the * supported operations which are type specific. */ void test__opexpr_to_pxffilter__differentTypes(void **state) { PxfFilterDesc *filter = (PxfFilterDesc*) palloc0(sizeof(PxfFilterDesc)); Var *arg_var = build_var(INT2OID, 3); char* const_value = strdup("13"); /* will be free'd by const_to_str */ Const *arg_const = build_const(INT8OID, const_value); OpExpr *expr = build_op_expr(arg_const, arg_var, 1864 /* int28lt */); /* run test */ assert_true(opexpr_to_pxffilter(expr, filter)); PxfFilterDesc *expected = build_filter( PXF_CONST_CODE, 0, "13", PXF_ATTR_CODE, 3, NULL, PXFOP_LT); compare_filters(filter, expected); pxf_free_filter(filter); list_free_deep(expr->args); /* free all args */ pfree(expr); }
/* NOTE: this test is not a use case - when the query includes * 'is null' or 'is not null' the qualifier code is T_NullTest and not T_OpExpr */ void test__opexpr_to_pxffilter__attributeIsNull(void **state) { PxfFilterDesc *filter = (PxfFilterDesc*) palloc0(sizeof(PxfFilterDesc)); Var *arg_var = build_var(INT2OID, 1); Const* arg_const = build_const(INT2OID, NULL); OpExpr *expr = build_op_expr(arg_var, arg_const, 94 /* int2eq */); PxfFilterDesc* expected = build_filter( PXF_ATTR_CODE, 1, NULL, PXF_CONST_CODE, 0, "\"NULL\"", PXFOP_EQ); /* run test */ assert_true(opexpr_to_pxffilter(expr, filter)); compare_filters(filter, expected); pxf_free_filter(filter); pxf_free_filter(expected); list_free_deep(expr->args); /* free all args */ pfree(expr); }
void run__opexpr_to_pxffilter__positive(Oid dbop, PxfOperatorCode expectedPxfOp) { PxfFilterDesc *filter = (PxfFilterDesc*) palloc0(sizeof(PxfFilterDesc)); Var *arg_var = build_var(INT2OID, 1); char* const_value = strdup("1984"); /* will be free'd by const_to_str */ Const* arg_const = build_const(INT2OID, const_value); OpExpr *expr = build_op_expr(arg_var, arg_const, dbop); PxfFilterDesc* expected = build_filter( PXF_ATTR_CODE, 1, NULL, PXF_CONST_CODE, 0, "1984", expectedPxfOp); /* run test */ assert_true(opexpr_to_pxffilter(expr, filter)); compare_filters(filter, expected); pxf_free_filter(expected); pxf_free_filter(filter); list_free_deep(expr->args); /* free all args */ pfree(expr); }
/************************************************************************ * GETNUM - Get a number from the input stream. * * ARGUMENTS * radix - the radix of the number to be accumulated. Can only be 8, 10, * or 16 * pval - a pointer to a VALUE union to be filled in with the value * * RETURNS - type of the token (L_CINTEGER or L_CFLOAT) * * SIDE EFFECTS - * does push back on the input stream. * writes into pval by reference * uses buffer Reuse_W * * DESCRIPTION - * Accumulate the number according to the rules for each radix. * Set up the format string according to the radix (or distinguish * integer from float if radix is 10) and convert to binary. * * AUTHOR - Ralph Ryan, Sept. 8, 1982 * * MODIFICATIONS - none * ************************************************************************/ token_t getnum(REG WCHAR c) { REG WCHAR *p; WCHAR *start; int radix; token_t tok; value_t value; tok = L_CINTEGER; start = (Tiny_lexer_nesting ? Exp_ptr : Reuse_W); p = start; if( c == L'0' ) { c = get_non_eof(); if( IS_X(c) ) { radix = 16; if( Prep ) { *p++ = L'0'; *p++ = L'x'; } for(c = get_non_eof(); LXC_IS_XDIGIT(c); c = get_non_eof()) { /* no check for overflow? */ *p++ = c; } if((p == Reuse_W) && (Tiny_lexer_nesting == 0)) { strcpy (Msg_Text, GET_MSG (2153)); error(2153); } goto check_suffix; } else { radix = 8; *p++ = L'0'; /* for preprocessing or 0.xxx case */ } } else { radix = 10; } while( LXC_IS_DIGIT((WCHAR)c) ) { *p++ = c; c = get_non_eof(); } if( IS_DOT(c) || IS_E(c) ) { UNGETCH(); return(get_real(p)); } check_suffix: if( IS_EL(c) ) { if( Prep ) { *p++ = c; } c = get_non_eof(); if( IS_U(c) ) { if(Prep) { *p++ = c; } tok = L_LONGUNSIGNED; } else { tok = L_LONGINT; UNGETCH(); } } else if( IS_U(c) ) { if( Prep ) { *p++ = c; } c = get_non_eof(); if( IS_EL(c) ) { if( Prep ) { *p++ = c; } tok = L_LONGUNSIGNED; } else { tok = L_CUNSIGNED; UNGETCH(); } } else { UNGETCH(); } *p = L'\0'; if( start == Exp_ptr ) { Exp_ptr = p; return(L_NOTOKEN); } else if( Prep ) { myfwrite( Reuse_W, (size_t)(p - Reuse_W) * sizeof(WCHAR), 1, OUTPUTFILE); return(L_NOTOKEN); } value.v_long = matol(Reuse_W,radix); switch(tok) { case L_CINTEGER: tok = (radix == 10) ? c_size(value.v_long) : uc_size(value.v_long) ; break; case L_LONGINT: tok = l_size(value.v_long); break; case L_CUNSIGNED: tok = ul_size(value.v_long); break; } yylval.yy_tree = build_const(tok, &value); return(tok); }