************** * v1.5 Alpha 1 ************** * Fixed unregistered bug. A well-known "decompression overran buffer" error appears during the schema creation. Contributor(s): Evgeny Kilin * New ROWS_AFFECTED system variable (SF #451927). Return number of rows affected by the last INSERT/UPDATE/DELETE statement. Notes: 1. Available in PSQL only. 2. For any other statement than INSERT/UPDATE/DELETE, result is always zero. Contributor(s): Dmitry Yemanov * Dynamic exception messages (SF #446240). Allow to throw an exception with another message than this exception has been created with. Syntax: EXCEPTION name [value]; Contributor(s): Dmitry Yemanov * New SQLCODE and GDSCODE system variables (SF #547383). Provide an access to a code of the catched error within the WHEN-block. Notes: 1. Available in PSQL only. 2. Makes sense in WHEN-block only, in other places returns 0 (success). Contributor(s): Dmitry Yemanov * Exception re-initiate semantics. Allow an already catched exception to be re-thrown from the WHEN-block. Syntax: EXCEPTION; Note: Makes sense in WHEN-block only, in other places evaluates to no-op. Contributor(s): Digitman * Fixed unregistered bug. The server crashes during the garbage collection under heavy load. Contributor(s): Nickolay Samofatov * Deferred metadata compilation. Solve a lot of reasons of the well-known "object in use" error. Contributor(s): Nickolay Samofatov * New NULL order handling. Allow user-defined ordering of NULLs. Syntax: [ORDER BY ] = {col | int} [COLLATE collation] [ASC[ENDING] | DESC[ENDING]] [NULLS {FIRST | LAST}] [, ...] Note: Default behaviour is NULLS LAST. Contributor(s): Nickolay Samofatov * Fixed unregistered bug. gstat shows wrong value for maxdup element. Contributor(s): Dmitry Kuzmenko * New registry key is used on win32. Currently it's SOFTWARE\FirebirdSQL\Firebird. Contributor(s): - * User-defined constraint index names (SF #451925). Allow an index name to be either constraint name or user-defined name. Syntax: = [CONSTRAINT constraint] {UNIQUE [] | PRIMARY KEY [] | REFERENCES other_table [( other_col [, other_col ...])] [ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}] [ON UPDATE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}] [] | CHECK ( )} = [CONSTRAINT constraint] {{PRIMARY KEY | UNIQUE} ( col [, col ...]) [] | FOREIGN KEY ( col [, col ...]) REFERENCES other_table [ON DELETE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}] [ON UPDATE {NO ACTION|CASCADE|SET DEFAULT|SET NULL}] [] | CHECK ( )} = USING [ASC[ENDING] | DESC[ENDING]] INDEX name Note: Index is named the same way as a constraint by default. Contributor(s): Dmitry Yemanov * New RECREATE VIEW statement. A shorthand for DROP VIEW / CREATE VIEW couple of statements. Syntax: RECREATE VIEW name ; Contributor(s): Dmitry Yemanov * Fixed unregistered bug. Trigger which name starts with 'RDB$' cannot be altered or dropped at all. Contributor(s): Dmitry Yemanov * Changed file names. Renamed distribution files to make sure we're Firebird. Now they're fbserver, fbclient, firebird.msg etc. Note: The client library is fbclient now and it should be used in all new FB-based projects. gds32 contains nothing but redirected exports and is provided for compatibility only. Contributor(s): - * Minor ODS upgrade. Added new system indices (RDB$INDEX_41, RDB$INDEX_42, RDB$INDEX_43), now ODS version is 10.1. Contributor(s): Dmitry Yemanov , Nickolay Samofatov * New CREATE OR ALTER statement (SF #451935). Allow either creating or altering a database object depending on its existance. Syntax: CREATE OR ALTER name ; Notes: 1. Applicable to SPs/triggers only. 2. The statement has the same meaning as CREATE OR REPLACE one in Oracle. Contributor(s): Dmitry Yemanov * Fixed unregistered bug. Broken dependencies (like DB$34) appear in the database after metadata changes. Contributor(s): Dmitry Yemanov * Enhanced declaration of local variables. Simplify syntax and allow declaring and defining variable at the same time. Syntax: DECLARE [VARIABLE] name [{'=' | DEFAULT} value]; Example: DECLARE my_var INTEGER = 123; Contributor(s): Claudio Valderrama * Disabled BREAK statement for triggers (like EXIT) due to known internal limitations. Contributor(s): Dmitry Yemanov * Enhanced grouping (SF #555839, #546274). Allow to GROUP BY internal functions and subqueries. Also allow to GROUP BY ordinal (i.e. column position). Contributor(s): Arno Brinkman * New COALESCE internal function (SF #451917). Allow a column value to be calculated by a number of expressions, the first expression returning a non NULL value is returned as the column value. Syntax: COALESCE (value {, value} ... ) Notes: 1. COALESCE (V1, V2) is equivalent to the following case specification: CASE WHEN V1 IS NOT NULL THEN V1 ELSE V2 END 2. COALESCE (V1, V2, ..., Vn), for n >= 3, is equivalent to the following case specification: CASE WHEN V1 IS NOT NULL THEN V1 ELSE COALESCE (V2, ..., Vn) END 3. The function has the same meaning as NVL one in Oracle. Example: SELECT PROJ_NAME AS Projectname, COALESCE(e.FULL_NAME, '[> not assigned <]') AS Employeename FROM PROJECT p LEFT JOIN EMPLOYEE e ON (e.EMP_NO = p.TEAM_LEADER) Contributor(s): Arno Brinkman * New NULLIF internal function (SF #451917). Return a NULL value for a sub-expression if it has a specific value, otherwise return the value of the sub-expression. Syntax: NULLIF (value, value) Note: NULLIF (V1, V2) is equivalent to the following case specification: CASE WHEN V1 = V2 THEN NULL ELSE V1 END Example: UPDATE PRODUCTS SET STOCK = NULLIF(STOCK, 0) Contributor(s): Arno Brinkman * New CASE internal function (SF #451917). Allow the result of a column to be determined by a the results of a case expression. Syntax: = | = CASE value ... [ELSE value] END = WHEN value THEN value = CASE ... [ELSE value] END = WHEN THEN value Note: The function has the same meaning as DECODE one in Oracle. Examples: 1. Simple case: SELECT o.ID, o.Description, CASE o.Status WHEN 1 THEN 'confirmed' WHEN 2 THEN 'in production' WHEN 3 THEN 'ready' WHEN 4 THEN 'shipped' ELSE 'unknown status ''' || o.Status || '''' END FROM Orders o 2. Searched case: SELECT o.ID, o.Description, CASE WHEN (o.Status IS NULL) THEN 'new' WHEN (o.Status = 1) THEN 'confirmed' WHEN (o.Status = 3) THEN 'in production' WHEN (o.Status = 4) THEN 'ready' WHEN (o.Status = 5) THEN 'shipped' ELSE 'unknown status ''' || o.Status || '''' END FROM Orders o Contributor(s): Arno Brinkman * Fixed bug SF #545725. Automatic/background sweep hangs. Contributor(s): Alexander Peshkoff * Fixed unregistered bug. The server crashes when XSQLDA structures are prepared for not all statement parameters. Contributor(s): Dmitry Yemanov * Enabled support for empty BEGIN...END blocks. Contributor(s): Dmitry Yemanov * Partially fixed bug SF #567931. Metadata security hole. Contributor(s): Dmitry Yemanov * Fixed unregistered bug. INT64 arrays don't work. Contributor(s): Artem Petkevych * Fixed bug SF #437859. Execute procedure and string concat. Note: This change allows any expression to be used as a SP parameter. Contributor(s): Dmitry Yemanov * Fixed bug SF #562417. Aggregate concatenated empty char. Contributor(s): Dmitry Yemanov * Readline (cmd history) support added to ISQL. Contributor(s): Mark O'Donohue * New BIGINT datatype (SF #446206). Allow native SQL usage of 64-bit exact numerics. Note: Available in dialect 3 only. Contributor(s): Dmitry Yemanov * Universal triggers (SF #451922). Allow one trigger to be fired for a number of action types. Syntax: CREATE TRIGGER name FOR table [ACTIVE | INACTIVE] [OR ] [OR ] [POSITION number] AS = {BEFORE | AFTER} = {DELETE | INSERT | UPDATE} Example: CREATE TRIGGER my_trigger FOR my_table BEFORE INSERT OR UPDATE AS BEGIN IF (NEW.DOC_ID IS NULL) THEN EXCEPTION my_exception; END Contributor(s): Dmitry Yemanov * New CONNECTION_ID and TRANSACTION_ID system variables (SF #446238, #446243). Return appropriate internal identifier stored on the database header page. Notes: 1. Available in SQL/PSQL. 2. The values are reset after a database is restored. Contributor(s): Dmitry Yemanov * Server-side database aliases (SF #446180). Any database can be attached to using an "alias" name instead of its physical pathname. The list of known database aliases is stored in aliases.conf file under the server installation root. Example: alias entry in the configuration file: my_database = d:\dbs\my\database.gdb connection string: localhost:my_database Contributor(s): Dmitry Yemanov * New plugin manager and INTL interface. Contributor(s): John Bellardo * In-memory sorting. If SORT plan is used for a SQL statement, the sorting is done in memory. If there's not enough memory for this operation, old temporary file based method is used. Contributor(s): Dmitry Yemanov * Fixed bug SF #538201. Crash with extract from null as date. Contributor(s): Claudio Varderrama * New EXECUTE VARCHAR statement (SF #446256). Allow execution of dynamic SQL statements in SPs/triggers. Syntax: EXECUTE VARCHAR value; Notes: 1. Available in PSQL only. 2. Currently cannot return values, so SELECT statements are not allowed. 3. Recursion level is limited to 500 (hardcoded). Example: EXECUTE VARCHAR my_var; Contributor(s): Alexander Peshkoff * Major code cleanup. Contributor(s): Sean Leyne , Erik Kunze * New memory manager. Contributor(s): John Bellardo * New exception handling logic. Contributor(s): Mike Nordell , John Bellardo * New autoconf-based build configuration. Contributor(s): John Bellardo , Mark O'Donohue * The code port from C to C++. Contributor(s): Mike Nordell , John Bellardo , Mark O'Donohue