New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Engine crashs in case of re-creation of an erratic package body [CORE4271] #4595
Comments
Commented by: @sim1984 script package attached |
Modified by: @sim1984Attachment: pack.sql [ 12386 ] |
Modified by: @dyemanovsummary: Crash engine in case of re-creation of an erratic body of a packet => Crash engine in case of re-creation of an erratic package body |
Modified by: @dyemanovassignee: Adriano dos Santos Fernandes [ asfernandes ] |
Commented by: @asfernandes Simple test case for first half of the problem (problem with functions and the metadata cache): CREATE OR ALTER PACKAGE PKG_SEQUENCE RECREATE PACKAGE BODY PKG_SEQUENCE PROCEDURE NEXT_VALUE EXECUTE BLOCK
============ |
Commented by: @sim1984 After changing the creation of 58934 attached package is successful. |
Commented by: @asfernandes > However, after re-create the package body. Execution unit attached to the ticket causes the server to crash It's the reason the ticket is not marked as resolved yet. |
Modified by: @asfernandessummary: Crash engine in case of re-creation of an erratic package body => Engine crashs in case of re-creation of an erratic package body |
Modified by: @asfernandesstatus: Open [ 1 ] => Resolved [ 5 ] resolution: Fixed [ 1 ] Fix Version: 3.0 Alpha 2 [ 10560 ] |
Modified by: @pcisarstatus: Resolved [ 5 ] => Closed [ 6 ] |
Submitted by: @sim1984
Attachments:
pack.sql
Use CONNECT or CREATE DATABASE to specify a database
SQL> set names win1251;
SQL> create database 'localhost/3051:d:/interbasedata/3.0/test.fdb' user 'sysdba' password 'masterkey' page_size 8192 DE
FAULT CHARACTER SET WIN1251;
SQL> SET TERM ^;
SQL>
SQL> CREATE OR ALTER PACKAGE PKG_SEQUENCE
CON> AS
CON> BEGIN
CON> PROCEDURE INITIALIZE(MIN_VALUE INTEGER, MAX_VALUE INTEGER, STEP INTEGER);
CON>
CON> FUNCTION GET_CURRENT_VALUE RETURNS INTEGER;
CON>
CON> FUNCTION NEXT_VALUE RETURNS INTEGER;
CON>
CON> FUNCTION IS_END RETURNS BOOLEAN;
CON> END^
SQL>
SQL> RECREATE PACKAGE BODY PKG_SEQUENCE
CON> AS
CON> BEGIN
CON>
CON> FUNCTION GET_MAX RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RETURN CAST(RDB$GET_CONTEXT('USER_SESSION', 'MAX_VALUE') AS INTEGER);
CON> END
CON>
CON> FUNCTION SET_MAX(AVALUE INTEGER) RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RDB$SET_CONTEXT('USER_SESSION', 'MAX_VALUE', AVALUE);
CON> RETURN AVALUE;
CON> END
CON>
CON> FUNCTION GET_MIN RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RETURN CAST(RDB$GET_CONTEXT('USER_SESSION', 'MIN_VALUE') AS INTEGER);
CON> END
CON>
CON> FUNCTION SET_MIN(AVALUE INTEGER) RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RDB$SET_CONTEXT('USER_SESSION', 'MIN_VALUE', AVALUE);
CON> RETURN AVALUE;
CON> END
CON>
CON> FUNCTION GET_STEP RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RETURN CAST(RDB$GET_CONTEXT('USER_SESSION', 'STEP_VALUE') AS INTEGER);
CON> END
CON>
CON> FUNCTION SET_STEP(AVALUE INTEGER) RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RDB$SET_CONTEXT('USER_SESSION', 'STEP_VALUE', AVALUE);
CON> RETURN AVALUE;
CON> END
CON>
CON> FUNCTION GET_CURRENT_VALUE RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RETURN CAST(RDB$GET_CONTEXT('USER_SESSION', 'CURRENT_VALUE') AS INTEGER);
CON> END
CON>
CON> FUNCTION SET_CURRENT_VALUE(AVALUE INTEGER) RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RDB$SET_CONTEXT('USER_SESSION', 'CURRENT_VALUE', AVALUE);
CON> RETURN AVALUE;
CON> END
CON>
CON> FUNCTION NEXT_VALUE RETURNS INTEGER
CON> AS
CON> BEGIN
CON> IF (NOT IS_END()) THEN
CON> SET_CURRENT_VALUE(GET_CURRENT_VALUE() + GET_STEP());
CON> RETURN GET_CURRENT_VALUE();
CON> END
CON>
CON> FUNCTION IS_END RETURNS BOOLEAN
CON> AS
CON> BEGIN
CON> RETURN GET_CURRENT_VALUE() > GET_MAX();
CON> END
CON>
CON> PROCEDURE INITIALIZE(MIN_VALUE INTEGER, MAX_VALUE INTEGER, STEP INTEGER)
CON> AS
CON> BEGIN
CON> SET_MIN(MIN_VALUE);
CON> SET_MAX(MAX_VALUE);
CON> SET_STEP(STEP);
CON> SET_CURRENT_VALUE(MIN_VALUE);
CON> END
CON>
CON> END^
SQL>
SQL> EXECUTE BLOCK
CON> RETURNS (
CON> OUT INTEGER)
CON> AS
CON> BEGIN
CON> EXECUTE PROCEDURE PKG_SEQUENCE.INITIALIZE(10, 140, 5);
CON> OUT = PKG_SEQUENCE.GET_CURRENT_VALUE();
CON> SUSPEND;
CON> WHILE (NOT PKG_SEQUENCE.IS_END()) DO
CON> BEGIN
CON> OUT = PKG_SEQUENCE.NEXT_VALUE();
CON> SUSPEND;
CON> END
CON> END^
============
10
Statement failed, SQLSTATE = 2F000
Cannot execute function IS_END of the unimplemented package PKG_SEQUENCE
-At function 'PKG_SEQUENCE.NEXT_VALUE' line: 60, col: 5
SQL> RECREATE PACKAGE BODY PKG_SEQUENCE
CON> AS
CON> BEGIN
CON>
CON> FUNCTION GET_MAX RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RETURN CAST(RDB$GET_CONTEXT('USER_SESSION', 'MAX_VALUE') AS INTEGER);
CON> END
CON>
CON> FUNCTION SET_MAX(AVALUE INTEGER) RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RDB$SET_CONTEXT('USER_SESSION', 'MAX_VALUE', AVALUE);
CON> RETURN AVALUE;
CON> END
CON>
CON> FUNCTION GET_MIN RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RETURN CAST(RDB$GET_CONTEXT('USER_SESSION', 'MIN_VALUE') AS INTEGER);
CON> END
CON>
CON> FUNCTION SET_MIN(AVALUE INTEGER) RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RDB$SET_CONTEXT('USER_SESSION', 'MIN_VALUE', AVALUE);
CON> RETURN AVALUE;
CON> END
CON>
CON> FUNCTION GET_STEP RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RETURN CAST(RDB$GET_CONTEXT('USER_SESSION', 'STEP_VALUE') AS INTEGER);
CON> END
CON>
CON> FUNCTION SET_STEP(AVALUE INTEGER) RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RDB$SET_CONTEXT('USER_SESSION', 'STEP_VALUE', AVALUE);
CON> RETURN AVALUE;
CON> END
CON>
CON> FUNCTION GET_CURRENT_VALUE RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RETURN CAST(RDB$GET_CONTEXT('USER_SESSION', 'CURRENT_VALUE') AS INTEGER);
CON> END
CON>
CON> FUNCTION SET_CURRENT_VALUE(AVALUE INTEGER) RETURNS INTEGER
CON> AS
CON> BEGIN
CON> RDB$SET_CONTEXT('USER_SESSION', 'CURRENT_VALUE', AVALUE);
CON> RETURN AVALUE;
CON> END
CON>
CON> FUNCTION NEXT_VALUE RETURNS INTEGER
CON> AS
CON> BEGIN
CON> IF (NOT IS_END()) THEN
CON> SET_CURRENT_VALUE(GET_CURRENT_VALUE() + GET_STEP());
CON> RETURN GET_CURRENT_VALUE();
CON> END
CON>
CON> FUNCTION IS_END RETURNS BOOLEAN
CON> AS
CON> BEGIN
CON> RETURN GET_CURRENT_VALUE() > GET_MAX();
CON> END
CON>
CON> PROCEDURE INITIALIZE(MIN_VALUE INTEGER, MAX_VALUE INTEGER, STEP INTEGER)
CON> AS
CON> BEGIN
CON> SET_MIN(MIN_VALUE);
CON> SET_MAX(MAX_VALUE);
CON> SET_STEP(STEP);
CON> SET_CURRENT_VALUE(MIN_VALUE);
CON> END
CON>
CON> END^
SQL> EXECUTE BLOCK
CON> RETURNS (
CON> OUT INTEGER)
CON> AS
CON> BEGIN
CON> EXECUTE PROCEDURE PKG_SEQUENCE.INITIALIZE(10, 140, 5);
CON> OUT = PKG_SEQUENCE.GET_CURRENT_VALUE();
CON> SUSPEND;
CON> WHILE (NOT PKG_SEQUENCE.IS_END()) DO
CON> BEGIN
CON> OUT = PKG_SEQUENCE.NEXT_VALUE();
CON> SUSPEND;
CON> END
CON> END^
Statement failed, SQLSTATE = 08006
Error reading data from the connection.
SQL>
Commits: 5b790ef 2aa3e8d FirebirdSQL/fbt-repository@6f9890f FirebirdSQL/fbt-repository@0edd5b9
The text was updated successfully, but these errors were encountered: