sql_block_cmd : opt_use2_p KW_SQL opt_conv { sql_mode=1; add_feature("SQL_BLOCK"); } sql_block END_SQL { sql_mode=0; $$=new_sql_block_cmd($1, $5,$3); } ; opt_conv : {$$=-1;} | WITH_CONVERSIONS {$$=1;} | WITHOUT_CONVERSIONS {$$=0;} ; sql_block : sql_block_entry { $$=A4GL_new_ptr_list($1); } | sql_block sql_block_entry { $$=$1; A4GL_new_append_ptr_list($$, $2); } ; sql_block_entry: INTO expanded_obind_var_list { $$=A4GL_new_expr_simple (ET_EXPR_SQLBLOCK_INTO); $$->expr_str_u.expr_list=$2; } | DOLLAR SQL_TEXT { char numbered_value[300]; sprintf(numbered_value,"$%s",$2); $$=A4GL_new_expr_simple_string(numbered_value, ET_EXPR_SQLBLOCK_TEXT); } | DOLLAR ensured_variable_usage_expression { $$=$2; } | COLON ensured_variable_usage_expression { $$=$2; } | sql_block_text { $$=A4GL_new_expr_simple_string($1, ET_EXPR_SQLBLOCK_TEXT); free($1); } ; sql_block_text : sql_block_text_entry { $$=make_sql_string_and_free(acl_strdup($1),0); } | sql_block_text sql_block_text_entry { if (strlen($2)) { char *ptr; ptr=$2; if (ispunct(ptr[0]) && strlen(ptr)==1) { char *p1; char *p2; char plast; p1=$1; p2=$2; plast=p1[strlen(p1)-1]; if (p2[0]=='*' && isalnum(plast)) { $$=make_sql_string_and_free($1,kw_space, acl_strdup($2),0); } else { $$=make_sql_string_and_free($1,acl_strdup($2),0); } } else { char *ptr; int need_space=1; ptr=$1; if (ptr[strlen(ptr)-1]=='.') { need_space=0; } if (!need_space) { $$=make_sql_string_and_free($1,acl_strdup($2),0); } else { $$=make_sql_string_and_free($1,kw_space,acl_strdup($2),0); } } } else { $$=$1; } } ; sql_block_text_entry: SQL_TEXT { strcpy($$,$1); } | INSERT_INTO {strcpy($$,$1);} | sqlblock_kw ; sqlblock_kw : KW_COMMA {strcpy($$,",");} | OPEN_SQUARE {strcpy($$,"[");} | CLOSE_SQUARE {strcpy($$,"]");} | OPEN_BRACKET {strcpy($$,"(");} | CLOSE_BRACKET {strcpy($$,")");} /* | DOLLAR {strcpy($$,"$");} */ | KW_DOT {strcpy($$,".");} | KW_MULTIPLY {strcpy($$,"*");} | NAMED_GEN {strcpy($$,$1);} | CONCAT_PIPES {strcpy($$,"||");} | LESS_THAN_EQ {strcpy($$,"<=");} | GREATER_THAN_EQ {strcpy($$,">=");} | NOT_EQUAL {char buff[255];strcpy(buff,$1); if (buff[0]=='<') {strcpy($$,"<>");} else {strcpy($$,"!=");} } ;