PBXT Release Notes
==================
------- 0.9.86 Beta - 2007-04-07
RN74: ++++ NOTE: This version is incompatible to older versions of PBXT ++++.
In order to upgrade, isntall the older version of PBXT. Convert all tables to MyISAM using ALTER TABLE t1 ENGINE=MyISAM. Then install the new version of PBXT and convert back using ALTER TABLE t1 ENGINE=PBXT.
RN73: Each table will now use a maximum of 4 data log files. This means a maximum of 7 files per table. The minimum is 3 for tables that do not have a variable field that exceeds about 40 bytes in size. This means that under Linux PBXT requires a maximum of 7 file handles per table used. Windows lock of pread/pwrite (atomic seek and read/write) functions means it requires a file handler per file per open table handler. [TODO: 0044]
RN72: All threads now write to the same data log file. Recovery and compaction take this fact into account. Each thread still writes its own transaction log.
RN71: Removed all directory scans when creating and dropping table. Increased the table limit to 10000.
RN70: Changed locking to avoid a deadlock when TRUNCATE TABLE is used together with other DML.
RN69: procedures and functions are now considered atomic, and execute in a single transaction.
RN68: Bug fixed: all files are now correctly flushed before commit.
------- 0.9.85 Beta - 2007-03-15
RN67: Changed the implementation of the pushsr_ and allocr_ macros because "*((void **) &(v) = " caused a crash due to a compiler error on some platforms (thanks Luciano for your help on this one and RN66).
RN66: Fixed a bug that caused PBXT to corrupt the index file when the size exceeded 4GB. [TODO: 0031]
RN65: PBXT now runs under Windows. This source tree must be placed in the MySQL source storage directory in order to compile. Further details of how to build are in the windows-readme.txt file. [TODO: 0027]
RN64: Improved speed of table lookup by ID after a table has been deleted. The sweeper needs to ignore these records. Scanning the directory each time was too slow.
RN63: Added checking for repeat update of a record in a statement.
RN62: Committed read no longer blocks due to a change made by another transaction (the XT_REPEATABLE_READ_BLOCKS define, turns blocking on).
RN61: Avoid checking for duplicates if an index is not modified by an update.
RN60: Records updated repeatedly by a transaction are now updated in place. [TODO: 0040]
------- 0.9.8 Beta - 2007-01-30
RN59: Reduced the number of file handles used to a maximum of one per file. This assumes that pread() and pwrite() allows multiple threads to use the same file handle (according to my tests, this is the case).
RN58: Added the configure flag --with-debug=only which compiles a version of the plug-in with debug symbols that will link to an non-debug MySQL server.
RN57: Changed error number returned on lock from 1205 (lock timeout) to 1020 (optimistic lock failure).
RN56: Added UNIX environment variable for PBXT system parameters. These must be set before starting mysqld, for example:
setenv pbxt_index_cache_size 400MB
setenv pbxt_record_cache_size "1 GB"
Values are in bytes unless one of the following units is specified: GB, MB, Kb
RN55: Fixed a bug which prevented VARCHAR values from being compressed correctly when stored in variable length rows.
RN54: Fixed a bug which caused a crash when PBXT was used with MySQL 5.1.14. This bug also caused data to be corrupted on insert.
RN53: Set query caching mode to transactional. [TODO: 0027]
RN52: Added conditions so that the engine compiles with MySQL 5.1.14 and 5.1.13.
------- 0.9.74 Beta - 2006-12-14
RN51: DELETE FROM
; is no longer implemented by re-creating the table. This statement now works by deleting all rows. TRUNCATE is implemented as before, by re-creating the table.
RN50: The test scripts innodb.test and innodb-mysql.test have been modified to run with PBXT.
RN49: [TODO: 0020] Implemented foreign keys. Functionality is identical to InnoDB with 2 exceptions:
* Data types of referenced columns must be an exact match (e.g. you cannot mix VARCHAR and CHAR values).
* Currently an exact matching index is required on referenced columns (i.e. the index may not have more columns that the columns used in the foreign key definition).
Also note the following:
* It is possible to create foreign keys that reference non-existent tables or columns. An error will occur when updating a table with an incorrect foreign key declaration.
* If you alter the data-type of a column referenced by a foreign key set you need to set foreign_key_checks=0; or an error will occur.
RN48: Fixed a bug in the implementation of indexes on ENUM and SET types.
RN47: Fixed a bug that caused a crash when an index was place on a BLOB column, and data was retrieved from the index directly.
------- 0.9.73 Beta - 2006-10-31
RN46: Updated test scripts to run with MySQL 5.1.13.
------- 0.9.72 Beta - 2006-10-19
RN45: Corrected compilation errors that occurred due to a change to struct st_mysql_plugin.
------- 0.9.71 Beta - 2006-10-04
RN44: Corrected compilation errors that occurred due to changes in the storage engine API.
------- 0.9.7 Beta - 2006-09-20
RN43: This is the first Beta release of PrimeBase XT. It has been integrated into MySQL 4.1.21 and is available as a plug-in for MySQL 5.1.12, or later. This version has been extensively tested using mysql-test-run, on various Linux and Mac OS X platforms.
RN42: ++++ NOTE: This version is incompatible to older versions of PBXT ++++. Files created by older versions cannot be opened by version 0.9.7.
RN41: Renaming or deleting a table while using a name with different case to the original created name did not work.
RN40: Fixed a bug when grouping and searching on indexed columns that contain a null.
RN39: Fixed bugs related to trailing spaces on VARCHAR values. Values that only vary by the number of trailing spaces (for example "aa" and "aa "), are now correctly handled as identical.
RN38: The default AUTO_INCREMENT value was not correctly preserved during ALTER TABLE.
RN37: Created a MySQL 5.1 Plugin version of PBXT. [TODO: 0017]
RN36: Fixed a race condition in the row cache which had the affect that inserted rows dissappeared after cleanup because the cache was out of date. I was only able to reproduce this error on multi-processor machines.
------- 0.9.6 - 2006-08-05
RN35: ++++ NOTE: This version is incompatible to older versions of PBXT ++++.
The disk format of tables and log files has changed slightly in this version. As a result, files created by older versions cannot be opened by version 0.9.6. An error will be generated. If you have data wish to preserve, first start the older version of XT and convert all tables to MyISAM. The stop the server and removed all transaction log file (files of the form xtlog-*.xt). Then start the new version and convert tables back to XT.
RN34: Implemented READ COMMITTED transaction mode. XT now supports READ COMMITTED and SERIALIZABLE transaction modes. NOTE: if the mode is set to REPEATABLE READ, SERIALIZABLE is used. If the mode is set to READ UNCOMMITTED READ COMMITTED is used.
RN33: The implementation of AUTO_INCREMENT on a paritial index is non-standard. A unique value is generated without regard to the value of the index prefix. For example, assume we have the following table: CREATE TABLE t1 (c1 CHAR(10) not null, c2 INT not null AUTO_INCREMENT, PRIMARY KEY(c1, c2));
With the following contents: c1 c2
A 8
B 1
After executing the following statement: insert into t1 (c1) values ('B');
This is the result using PBXT: c1 c2
A 8
B 1
B 9
The standard result would be: c1 c2
A 8
B 1
B 2
RN32: PBXT does not permit access to multiple databases within a single transaction. For example:
begin;
update database_1.t1 set a=10;
update database_2.t2 set d=10;
commit;
In this case the following error is returned: 1015: Can't lock file (errno: -1)
RN31: The implementation of COUNT(*) has changed. For effectiency, rows are not counted. The information is taken from the header of the record (.xtr) files. This information is only 100% accurate after transaction cleanup has completed. Which basically means, only when PBXT is idle. ANALYZE TABLE waits for all background activity to stop, so the statement may be executed before a COUNT(*) to ensure an accurate result. NOTE: Other then waiting for background processes, ANALYSE TABLE is not implemented.
RN30: Two concurrency bugs have been fixed: a shared lock was used instead of an exclusive lock when deleting from a transaction list, the transaction segment semaphore was not initialized. XT now runs correctly in a multi-processor environment. The test used was sysbench on a dual-process, dual-core, AMD 64-bit machine running SUSE Linux 10.0.
RN29: PBXT compiles and runs on under 64-bit Lunix. [TODO: 0009]
RN28: ./mysql-test-run --force --mysqld=--default-storage-engine=pbxt will now execute most tests successfully. Changes to the tests and the result have been documented in http://www.primebase.com/xt/download/pbxt-test-run-changes.txt. [TODO: 0004, 0019]
RN27: Fixed a bug that caused the server to crash if when using tables locks and transactions. For example: LOCK TABLES, BEGIN, COMMIT, SELECT. This sequence now returns an error. The correct sequence is:
LOCK TABLES, BEGIN, COMMIT, UNLOCK TABLES, SELECT
or
LOCK TABLES, BEGIN, COMMIT, BEGIN, SELECT COMMIT, UNLOCK TABLES
RN26: Fixed a concurrency problem which caused a number of threads to hang during the sysbench test - see RN30 above (bug reported by Vadim).
RN25: Fixed a bug that caused the server to hang when ha_pbxt::create() and ha_pbxt::ha_open() where given different, but equivalent paths for a particular table.
RN24: Fixed bug in the indexing of blob columns, for example: create table t1(name_id int, name blob, INDEX name_idx (name(5)));
RN23: When a duplicate key error occurs in auto-commit mode, the transaction is now rolled back.
RN22: Fixed incorrect duplicate key error. In the case of a unique key which allows NULLs, duplicates are allowed if the inserted key contains a NULL. For example:
create table t1 (id int not null, str char(10), unique(str));
insert into t1 values (1, null),(2, null),(3, "foo"),(4, "bar");
RN21: PBXT now returns the correct error code on duplicate key: 1062 instead of 1022.
RN19: Implemented AUTO_INCREMENT on partial keys. However, the XT implementation is non-standard. Increment of partial index works, but the ID generated is incremented like a non-partial index. For example:
create table t1 (c1 char(10) not null, c2 int not null auto_increment, primary key(c1, c2));
select * from t1;
c1 c2
A 8
B 1
insert into t1 (c1) values ('B');
select * from t1;
c1 c2
A 8
B 1
B 9
The standard result would be:
c1 c2
A 8
B 1
B 2
RN18: Implemented TRUNCATE TABLE and DELETE FROM ; (i.e. a DELETE without WHERE clause). Previously DELETE FROM ; did not cause an error, but no rows where deleted (TRUNCATE TABLE returned an error). [TODO: 0012, 0022]
RN17: Implemented CREATE TABLE (...) auto_increment=;
------- 0.9.51 - 2006-07-06
RN16: Fixed crash which could occur when creating the first table in a database (bug reported by Hakan).
------- 0.9.5 - 2006-07-03
RN15: This version concludes the re-structuring of the PBXT implementation. I have made a number of major changes, including:
- All files except the transaction logs are now associated with a particular table. All table related files begin with the name of the table. The extension indicates the function.
- I have merged the handle and the fixed length row data for performance reasons.
- Only the variable size component of a row is stored in the data log files. As a result the data logs can now be considered as a type of "overflow" area.
- Memory mapped files are no longer used because it is not possible to flush changes to the disk.
RN14: File names have the following forms:
[table-name]-[table-id].xtr - These files contains the table row pointers. Each row pointer occupies 8 bytes and refers to a list of records. The file name also contains the table ID. This is a unique number which is used internally by XT to identify the table.
[table-name].xtd - This file contains the fixed length data of a table. Each data item includes a handle and a record. The handle references a record in the data log file if the table contains variable length records.
[table-name].xti - This file contains the index data of the table.
[table-name]-[log-id].xtl - This is a data log file. It contains the variable length data of the table. A table may have any number of data log files, each with a unique ID.
xtlog-[log-id].xt - These files are the transaction logs. Log entries that specify updates reference a data file record. Each active thread has its own transaction log in order to avoid contension.
RN13: Fixed the bug "Hang on DROP DATABASE". [TODO: 0016]
RN12: PBXT currently only supports the "Serializable" transaction isolation level. This is the highest isolation level possible and includes the "repeatable-read" functionality [TODO: 0015]. This is implemented by giving every transaction a snapshot of the database at the point when the transaction is started.
If the transaction tries to update a record that was updated by some other transaction after the snapshot was taken, a locked error is returned. A deadlock can occur if 2 transactions update the same record in a different order. PBXT can detect all deadlocks.
RN11: I have implemented write buffering on the table data files. [TODO: 0013]
RN10: The unique constraint (UNIQUE INDEX/PRIMARY KEY) is now checked correctly. [TODO: 0008]
RN9: I have implemented a conventional B-tree algorithm for the indices (instead of the Lehman and Yoa B*-link tree). Although this reduces concurrency it improves the performance of queries significantly because of the simplicity of the algorithm. Deletion is also implemented in a very simple manner. [TODO: 0007]
RN8: PBXT now has only 2 caches [TODO: 0006]:
The Index Cache (pbxt_index_cache_size): This is the amount of memory the PBXT storage engine uses to cache index data and row pointers. This is all the data in the files with the extensions '.xti' and '.xtr'. This cache is managed in blocks of 2K.
The Record Cache (pbxt_record_cache_size): This is the amount of memory the PBXT storage engine uses to cache table row data (handles and records). This is all the data in the files with the extension '.xtd'.
The size of the caches are determined by the values of the system variables pbxt_index_cache_size and pbxt_row_cache_size. By default these values are set to 32MB.
RN7: Auto-increment is now implemented in memory. This is done by doing a MAX() select when a table is first opened to get the high value. After that, then high value is incremented in memory on INSERT. On UPDATE (or INSERT) the value in memory is adjusted if necessary. This method also makes it possible for rows to be inserted simultaneously on the same table. [TODO: 0005, 0014]
RN6: ./run-all-tests --create-options=TYPE=PBXT succeeds. [TODO: 0004]
RN5: Using sql-bench and my own Java based test I have confirmed that PBXT behaves correctly during multi-threaded access. [PARTIALY TODO: 0002]
RN4: Load/Stability test. Using sql-bench I have tested PBXT under load over a long period of time. [PARTIALY TODO: 0001]
------- 0.9.2 - 2006-04-01
RN3: Fixed a bug that cause the error "-6: Handle is out of range: [0:0]".
RN2: Implemented SET, ENUM and YEAR data types.
RN1: Fixed a bug in the error reporting when a table is created with a datatype that is not supported. [TODO: 0011]