Changes for 9
Error messages for table design operations in MAP files are extended to include the names of fields / constraints / indexes relevant to the error. (For example: "Cannot rename field 'length', referenced by computed field 'length-km'.")
Error messages for table record operations in MAP files are extended to include the names of fields / constraints / indexes relevant to the error. (For example: "Cannot set values of one or more fields, rejected by index 'name-x'." Or: "Invalid value of key field 'x', null not allowed.")
The file filter for GDB is changed from '*.gdb;gdb' to just 'gdb'.
The file filter for GDBMOBILE is renamed from 'GEODATABASE Files' to 'GDB Mobile Files'.
Computing bounding box for geometry data on SQLITE with SPATIALITE or ESRI ST_GEOMETRY extensions uses ST_MinX/MinY/MaxX/MaxY functions for performance. (We used to call a different aggregate, but apparently we can rely on the simpler - and much faster - ones being there as well, so we switched.)
(Fix) ALTER TABLE no longer can rename the schema item of a wrong type. (Attempting to rename, eg, an index did not check whether the schema contains an index with the specified name, just that the schema contains an item with the specified name. Then the operation could rename an item of a different type, eg, a field. The change fails such a rename early.)
(Fix) Creating a new non-primary index on SQLITE adjusts the name of the index to make it unique.
Creating a new table on DB2 / Jet / MySQL / Oracle / PostgreSQL / SQL Server reduces the name of the table to obey the server limit.
(Fix) Creating an identity field on GPKG no longer forces the identity field to be autoincrementing.
(Fix) Creating an RTREE index on GPKG fails if the index references a field other than the primary key field. (Such an index violates the GPKG spec.)
(Fix) Data sources set to cache data in the parent database (eg, Bing Maps or another web image with the 'Saved cached data between session' option turned on, by default the option is turned off) no longer sometimes fail to work if the parent database is not a MAP file.
Data sources set to cache data in the parent database check the capabilities of the parent database and proceed without cache if the database does not support some of the required features (MAP is accepted, databases like SQL Server are accepted with a couple of minor limitations, eg, DB2 is rejected for vector caches because its default SRID requires X and Y values to be non-negative - we will find a workaround, GDB and similar data sources that look like databases but have many limitations are rejected).
Data sources set to cache data in the parent database use separate cache tables for each database schema. (Previously we were trying to use cache tables in any accessible schema, this was creating situations where different users with limited permissions would create their own cache tables - this is fine - and then users with extensive permissions would end up having to choose between multiple available cache tables and would have to make the choice basically at random - not fine. The change makes things much more predictable. Whichever schema you connect to by default is the one that we are going to use for the cache.)
Data sources set to cache data in the parent database continue working without cache when cache tables cannot be created or are inaccessible.
(Fix) BTREExxx indexes in SQLITE now correctly detect the ASC / DESC order for the key fields.
All databases implement the uniqueness requirements implied by BTREExxx indexes using UNIQUE indexes instead of UNIQUE constraints. (Using UNIQUE constraints was backfiring in some situations, putting UNIQUE onto indexes matches the semantics that we currently have more closely. BTREExxx indexes created by older versions of 9 will continue to work as before.)
Renamed query function: TileMaskExtract -> TileMask.
The TileMask query function now produces a numeric tile with 0/1 values (was producing a tile with boolean values).
The TileMaskReplace query function now accepts mask as a numeric tile (was accepting a tile with boolean values). Pixels whose mask is either missing or 0 are made invisible in the result. Other pixels are made visible. Pixels that were previously invisible but became visible are set to 0.
The NOT / AND / OR / XOR operators for tiles now accept numeric tiles with 0/* values (0 interpreted as FALSE, any other value interpreted as TRUE) and produce a numeric tile with 0/1 values.
The comparison operators for number/tile, tile/number, tile/tile combinations now produce a numeric tile with 0/1 values.
The Compare query function for number/tile, tile/number, tile/tile combinations now produces a numeric tile with -1/0/1 values. The TileCompare query function is removed (Compare now does everything it did and more).
The BETWEEN operator for tiles (at least one of the operands is a tile, operands that are not tiles are numbers) now produces a numeric tile with 0/1 values.
(Fix) Creating a new computed field or constraint no longer sometimes accepts an expression with extra tokens at the end (eg, 'b+100-', this was being accepted as 'b+100', now we complain about the extra '-' at the end).
End of list.