Skip to content

Commit 8eadeb5

Browse files
committed
wrong name of procedure language in PL/iSQL procedure
1 parent bef0346 commit 8eadeb5

15 files changed

Lines changed: 94 additions & 34 deletions

File tree

contrib/ivorysql_ora/expected/ora_sysview.out

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,16 @@ END;
4646
/
4747
-- select ... from all_source
4848
SELECT NAME, LINE, TEXT FROM ALL_SOURCE WHERE NAME = 'func_quotes_lower';
49-
name | line | text
50-
-------------------+------+-------------------------------------------------
51-
func_quotes_lower | 1 | FUNCTION public."FUNC_QUOTES_LOWER"(id integer)
49+
name | line | text
50+
-------------------+------+---------------------------------------------------------
51+
func_quotes_lower | 1 | FUNCTION public."FUNC_QUOTES_LOWER"(id pg_catalog.int4)
5252
func_quotes_lower | 2 | RETURN varchar2
5353
func_quotes_lower | 3 | AUTHID DEFINER
5454
func_quotes_lower | | IS
5555
func_quotes_lower | | BEGIN
5656
func_quotes_lower | | RETURN 'func_quotes_lower'::VARCHAR2;
5757
func_quotes_lower | | END;
58-
func_quotes_lower | |
59-
(8 rows)
60-
58+
(7 rows)
6159

6260
-- data_type and pls_type in all_arguments
6361
CREATE OR REPLACE FUNCTION FUNC_22_ARG_TYPES

src/backend/executor/spi.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3007,13 +3007,19 @@ _SPI_error_callback(void *arg)
30073007
switch (carg->mode)
30083008
{
30093009
case RAW_PARSE_PLPGSQL_EXPR:
3010+
case RAW_PARSE_PLISQL_EXPR:
30103011
errcontext("SQL expression \"%s\"", query);
30113012
break;
30123013
case RAW_PARSE_PLPGSQL_ASSIGN1:
30133014
case RAW_PARSE_PLPGSQL_ASSIGN2:
30143015
case RAW_PARSE_PLPGSQL_ASSIGN3:
30153016
errcontext("PL/pgSQL assignment \"%s\"", query);
30163017
break;
3018+
case RAW_PARSE_PLISQL_ASSIGN1:
3019+
case RAW_PARSE_PLISQL_ASSIGN2:
3020+
case RAW_PARSE_PLISQL_ASSIGN3:
3021+
errcontext("PL/iSQL assignment \"%s\"", query);
3022+
break;
30173023
default:
30183024
errcontext("SQL statement \"%s\"", query);
30193025
break;

src/backend/oracle_parser/liboracle_parser.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,10 @@ oracle_raw_parser(const char *str, RawParseMode mode)
182182
[RAW_PARSE_PLPGSQL_ASSIGN1] = MODE_PLPGSQL_ASSIGN1,
183183
[RAW_PARSE_PLPGSQL_ASSIGN2] = MODE_PLPGSQL_ASSIGN2,
184184
[RAW_PARSE_PLPGSQL_ASSIGN3] = MODE_PLPGSQL_ASSIGN3,
185+
[RAW_PARSE_PLISQL_EXPR] = MODE_PLISQL_EXPR,
186+
[RAW_PARSE_PLISQL_ASSIGN1] = MODE_PLISQL_ASSIGN1,
187+
[RAW_PARSE_PLISQL_ASSIGN2] = MODE_PLISQL_ASSIGN2,
188+
[RAW_PARSE_PLISQL_ASSIGN3] = MODE_PLISQL_ASSIGN3,
185189
};
186190

187191
TokenAuxData auxdata;

src/backend/oracle_parser/ora_gram.y

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,11 @@ static void determineLanguage(List *options);
889889
%token MODE_PLPGSQL_ASSIGN2
890890
%token MODE_PLPGSQL_ASSIGN3
891891

892+
%token MODE_PLISQL_EXPR
893+
%token MODE_PLISQL_ASSIGN1
894+
%token MODE_PLISQL_ASSIGN2
895+
%token MODE_PLISQL_ASSIGN3
896+
892897

893898
/* Precedence: lowest to highest */
894899
%left UNION EXCEPT
@@ -1019,6 +1024,32 @@ parse_toplevel:
10191024
pg_yyget_extra(yyscanner)->parsetree =
10201025
list_make1(makeRawStmt((Node *) n, 0));
10211026
}
1027+
| MODE_PLISQL_EXPR PLpgSQL_Expr
1028+
{
1029+
pg_yyget_extra(yyscanner)->parsetree =
1030+
list_make1(makeRawStmt($2, 0));
1031+
}
1032+
| MODE_PLISQL_ASSIGN1 PLAssignStmt
1033+
{
1034+
PLAssignStmt *n = (PLAssignStmt *) $2;
1035+
n->nnames = 1;
1036+
pg_yyget_extra(yyscanner)->parsetree =
1037+
list_make1(makeRawStmt((Node *) n, 0));
1038+
}
1039+
| MODE_PLISQL_ASSIGN2 PLAssignStmt
1040+
{
1041+
PLAssignStmt *n = (PLAssignStmt *) $2;
1042+
n->nnames = 2;
1043+
pg_yyget_extra(yyscanner)->parsetree =
1044+
list_make1(makeRawStmt((Node *) n, 0));
1045+
}
1046+
| MODE_PLISQL_ASSIGN3 PLAssignStmt
1047+
{
1048+
PLAssignStmt *n = (PLAssignStmt *) $2;
1049+
n->nnames = 3;
1050+
pg_yyget_extra(yyscanner)->parsetree =
1051+
list_make1(makeRawStmt((Node *) n, 0));
1052+
}
10221053
;
10231054

10241055
/*

src/backend/parser/gram.y

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,6 +827,10 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
827827
%token MODE_PLPGSQL_ASSIGN1
828828
%token MODE_PLPGSQL_ASSIGN2
829829
%token MODE_PLPGSQL_ASSIGN3
830+
%token MODE_PLISQL_EXPR
831+
%token MODE_PLISQL_ASSIGN1
832+
%token MODE_PLISQL_ASSIGN2
833+
%token MODE_PLISQL_ASSIGN3
830834

831835

832836
/* Precedence: lowest to highest */

src/backend/parser/parse_func.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1877,6 +1877,12 @@ func_get_detail(List *funcname,
18771877
best_candidate->oid);
18781878
pform = (Form_pg_proc) GETSTRUCT(ftup);
18791879

1880+
if (PG_PARSER == compatible_db &&
1881+
pform->prolang == LANG_PLISQL_OID)
1882+
ereport(ERROR,
1883+
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1884+
errmsg("when ivorysql.compatible_mode is pg, can't execute a plisql procedural-language function")));
1885+
18801886
*rettype = pform->prorettype;
18811887
/* return a package.xxx */
18821888
if (ORA_PARSER == compatible_db)

src/backend/parser/parser.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,21 @@ standard_raw_parser(const char *str, RawParseMode mode)
8080
[RAW_PARSE_PLPGSQL_ASSIGN1] = MODE_PLPGSQL_ASSIGN1,
8181
[RAW_PARSE_PLPGSQL_ASSIGN2] = MODE_PLPGSQL_ASSIGN2,
8282
[RAW_PARSE_PLPGSQL_ASSIGN3] = MODE_PLPGSQL_ASSIGN3,
83+
[RAW_PARSE_PLISQL_EXPR] = MODE_PLISQL_EXPR,
84+
[RAW_PARSE_PLISQL_ASSIGN1] = MODE_PLISQL_ASSIGN1,
85+
[RAW_PARSE_PLISQL_ASSIGN2] = MODE_PLISQL_ASSIGN2,
86+
[RAW_PARSE_PLISQL_ASSIGN3] = MODE_PLISQL_ASSIGN3,
8387
};
8488

89+
if (mode > RAW_PARSE_PLPGSQL_ASSIGN3)
90+
{
91+
/* Clean up (release memory) */
92+
scanner_finish(yyscanner);
93+
ereport(ERROR,
94+
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
95+
errmsg("when ivorysql.compatible_mode is pg, not support a plisql procedural-language function statement")));
96+
}
97+
8598
yyextra.have_lookahead = true;
8699
yyextra.lookahead_token = mode_token[mode];
87100
yyextra.lookahead_yylloc = 0;

src/include/parser/parser.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ typedef enum
4343
RAW_PARSE_PLPGSQL_ASSIGN1,
4444
RAW_PARSE_PLPGSQL_ASSIGN2,
4545
RAW_PARSE_PLPGSQL_ASSIGN3,
46+
RAW_PARSE_PLISQL_EXPR,
47+
RAW_PARSE_PLISQL_ASSIGN1,
48+
RAW_PARSE_PLISQL_ASSIGN2,
49+
RAW_PARSE_PLISQL_ASSIGN3,
4650
} RawParseMode;
4751

4852
/* Values for the backslash_quote GUC */

src/oracle_test/regress/expected/ora_package.out

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1088,7 +1088,7 @@ QUERY: begin
10881088
raise info '%','init block';
10891089
end
10901090
CONTEXT: compilation of PL/iSQL package "pkg" near line 1
1091-
PL/pgSQL assignment "pkg.var1 := 23"
1091+
PL/iSQL assignment "pkg.var1 := 23"
10921092
PL/iSQL function inline_code_block line 2 at assignment
10931093
--drop
10941094
drop package pkg;

src/pl/plisql/src/expected/plisql_array.out

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ NOTICE: a = {1,2}
6363
do $$ declare a int[];
6464
begin a := from onecol; raise notice 'a = %', a; end$$;
6565
ERROR: assignment source returned 0 columns
66-
CONTEXT: PL/pgSQL assignment "a := from onecol"
66+
CONTEXT: PL/iSQL assignment "a := from onecol"
6767
PL/iSQL function inline_code_block line 2 at assignment
6868
do $$ declare a int[];
6969
begin a := f1, f1 from onecol; raise notice 'a = %', a; end$$;
7070
ERROR: assignment source returned 2 columns
71-
CONTEXT: PL/pgSQL assignment "a := f1, f1 from onecol"
71+
CONTEXT: PL/iSQL assignment "a := f1, f1 from onecol"
7272
PL/iSQL function inline_code_block line 2 at assignment
7373
insert into onecol values(array[11]);
7474
do $$ declare a int[];

0 commit comments

Comments
 (0)