Releases: skeema/skeema
v1.12.3
- MariaDB 11.7 support (684ffe5)
- All Skeema commands can now fully handle MariaDB
VECTOR
columns and indexes, including the optionalDISTANCE
andM
attributes for indexes - lint-reserved-word now flags new reserved word
VECTOR
- All Skeema commands can now fully handle MariaDB
- MySQL 9.2 support (10560a6)
- lint-reserved-word now flags new reserved word
LIBRARY
- lint-reserved-word now flags new reserved word
- Workspace cleanup now uses chunking, instead of concurrency, to efficiently remove empty workspace tables (0617f91)
- This Skeema change provides an important workaround for a recent MariaDB server bug involving foreign keys. See MDEV-36129, which affects all MariaDB 10.6+ releases from May 2024 onwards: 10.6.18+, 10.11.8+, 11.0.6, 11.1.5+, 11.2.4+, 11.4.2+, and all 11.5-11.7+ GA releases.
- Performance improvement for slow network links (WAN/VPN/cross-region) when using many/large stored procedures, functions, views, or triggers (3e822d6)
- Timeout behavior has been improved to ensure that server-side lock wait timeouts always occur prior to any client-side query timeout (373c702)
- This aids in troubleshooting Skeema performance issues, allowing easier identification of whether the root cause relates to locks (now manifests as a lock wait timeout error) vs a slow query timing out due to a non-responsive database server (which still shows an I/O timeout error).
- TLS fix: very old MySQL 5.7 point releases (prior to MySQL 5.7.28 / Oct 2019) don't support TLS 1.2, so use of TLS 1.1 is now permitted automatically for these server versions (e46bd0c)
An installation guide and full documentation are available on our website skeema.io.
v1.12.2
- TLS fixes for allowing encrypted connections to old/EOL database server versions
- By default, Go 1.22+ no longer enables TLS cipher suites using RSA key exchange, but these older cipher suites are typically needed to establish a secure connection to MySQL 5.5-5.7, Percona Server 5.5-5.6, or MariaDB 10.1. Skeema now allows use of these cipher suites when communicating with older servers, or when the server flavor has not been introspected yet. (#239, 6d2daf0)
- By default, Go 1.18+ normally uses a minimum of TLS 1.2, which is not supported by MySQL 5.5-5.6 or Percona Server 5.5-5.6. Skeema now allows use of TLS 1.0 when communicating with these older servers, or when the server flavor has not been introspected yet. (7a4fbcd, 3cfa747)
- When TLS-related options are specified on the command-line for
skeema init
orskeema add-environment
, these options are now automatically persisted to the .skeema option file, similar to other connectivity-related options. (c4f0af8) - Bug fix: when using the ssl-cert and ssl-key Premium options alongside ssl-mode=preferred, an error would be returned if the server was not actually configured to support TLS. This situation now falls back to a plaintext connection, which is the intended behavior of ssl-mode=preferred aligning with the standard
mysql
command-line client.
v1.12.1
- MySQL 9.0 and 9.1 support (7c94fcb, 47bfc0a, a0a060a)
- The new
VECTOR
column type is supported. Inskeema diff
andskeema push
, altering a column type betweenVECTOR
and any other sufficiently-large binary type is permitted as a safe operation since the conversion is non-lossy. - MySQL 9 finally processes "inline" foreign key definitions (that is,
REFERENCES
clause in a column definition). These are supported as-is in Skeema.
- The new
- MariaDB 11.5 and 11.6 support (6165c90, f24ad30)
- MariaDB 11.5 changes the default collation for Unicode charsets to use uca1400_ai_ci collations, which are fully supported in Skeema.
- MariaDB 11.5 solves the
TIMESTAMP
col type's previous Y2K38 limitation, and Skeema's lint-has-time annotation message has been adjusted accordingly.
CHECK
constraint improvement: When a diff only affects the name of aCHECK
constraint without modifying its check expression,skeema diff
andskeema push
now ignore this cosmetic change by default. This improves compatibility with external OSC tools, which inherently need to renameCHECK
constraints as part of their operation. This new behavior can be overridden by enabling the --exact-match option. (f000616)- Event handling improvements and fixes (Skeema Premium)
- When an event diff only included a change to the
DEFINER
clause, and no other differences, theALTER EVENT
emitted by Skeema was not valid SQL (despite conforming to syntax in the MySQL and MariaDB manuals). To fix this situation, the SQL will now also include an additional no-op clause, such asENABLE
for an event that is already enabled. - Several dump normalizations for
CREATE EVENT
statements were inadvertently omitted the first time an event was dumped byskeema init
orskeema pull
. - If any workspace query failed (e.g. query timeout), and any events were present in the *.sql definitions, a panic would result instead of the intended workspace query failure error message. (#229)
- When an event diff only included a change to the
- SSH tunnel enhancements (Skeema Premium)
- CAs, which are indicated in the known_hosts file using
@cert-authority
lines, are now fully supported. (skeema/knownhosts#8, skeema/knownhosts#9) - known_hosts lines using non-default ports are now matched properly. (skeema/knownhosts#10)
- CAs, which are indicated in the known_hosts file using
- If any hand-written *.sql files use the optional
CREATE OR REPLACE
SQL syntax, Skeema now parses and ignores theOR REPLACE
clause. Previously, use of this syntax would prevent Skeema from parsing the statement. (6805737) - Enhancements for Docker workspaces
- When a redundant non-unique index is flagged by lint-dupe-index, the annotation message is now clearer (since false positives may be possible) and suggests making the index be
INVISIBLE
/IGNORED
before dropping (#238, #237) - MariaDB's August 2024 point releases have changed the formatting of compressed columns in
SHOW CREATE TABLE
, which affected Skeema's diff logic safeguards. This change is now handled and compressed columns are fully supported again. (49aed41) - Minor wording changes in log messages and help text, for consistency. (4f8fa44, 5f7598e)
Thank you to all code contributors and issue reporters!
v1.12.0
See the Skeema v1.12 release announcement blog post for a summary of the most important changes in this release.
- MySQL 8.4 is now supported (4674f90, 992dd60)
- New linter check lint-fk-parent examines the parent (referenced) side of foreign key constraints, confirming that the parent table exists, and has an appropriate unique index as per new behavior in MySQL 8.4 (#79, 45d66b6, 38f22f0, db33690)
- lint-reserved-word now accounts for several reserved word changes in MySQL 8.2, 8.3, and 8.4
- MariaDB 11.4 is now supported (94f8475)
- Skeema's baseline TLS support is compatible with MariaDB 11.4's new automatic self-signed server certificates, similar to the behavior of MySQL 5.7+. Configuring Skeema to use ssl-mode=required works as expected with MariaDB 11.4 out of the box.
- Events (scheduled tasks) can now be fully managed and diffed by Skeema Premium (#61)
- New options ignore-event and lint-has-event provide parity with other object types.
- Existing options allow-unsafe, lint-reserved-word, lint-definer, strip-definer, lax-comments, and compare-metadata now interact with events.
- To export any existing events from your database server, run
skeema pull
one time after upgrading to Skeema v1.12. Note that if your Skeema database user isn't a superuser, you must have the EVENT privilege to interact with events. - Refer to the events documentation page for full usage instructions and special cases.
- Index renames are now detected automatically by
skeema diff
andskeema push
, which will emitALTER TABLE ... RENAME KEY
clauses as appropriate (478ceaf, d67a058) - Substantial performance improvements and memory usage reduction when processing a directory containing a large volume of .sql files, such as thousands of CREATE statements and/or sizable seed data (9f49591)
- Linter bug fix: when using workspace=temp-schema, if the value of the flavor option is determined to be incorrect / outdated relative to the actual workspace server, linter check behavior will now ignore the incorrect value and use the server's actual flavor. (c151901)
v1.11.2
- MySQL 8.3 is now marked as supported (31239e7)
- MariaDB 11.3 is now marked as supported (c05a1fa)
- In MariaDB 11.3+, modifying a column's data type from inet4 to inet6 is no longer considered unsafe
- Several improvements and edge case fixes for Docker workspaces, especially when using an arm64 system (e.g. Apple Silicon)
- When copying the sql_mode from the target database server and applying it to the Dockerized instance, if the flavors/versions of the two databases differ, incompatible sql_mode values are now removed automatically (686294e)
- When using an arm64 client system with a MySQL 5.x requested flavor, utf8mb4 columns now use the old MySQL 5.x collation default in the Dockerized instance, despite it actually running MySQL 8.0 for arm64 compatibility (48d2074)
- When using an arm64 client system with a MySQL 5.x requested flavor, utf8mb3 columns could cause an uncaught panic due to a logic bug, which is now fixed (58e9338, #226)
- Percona Server 8.0, 8.1, 8.2 images are now available regardless of CPU architecture; previously 8.0 was only available for amd64, and 8.1+ was unavailable entirely (f7753c1, e50f754, da0e8e1)
- If the requested flavor value is a release series newer than the current version of Skeema, a non-fatal warning is now logged; previously this caused a fatal error (a45dbf2)
- Logging improvement: word wrapping is now disabled automatically if STDERR is a narrow terminal window below 80 characters in width (4ab585c)
- MariaDB bug fix: when using foreign key constraints in MariaDB 10.6+, Skeema's workspace cleanup step could sometimes stall due to database server bug MDEV-32899; this condition is now avoided by using a low innodb_lock_wait_timeout and retries during workspace cleanup (a5ed51d)
- MariaDB bug fix: in lint-reserved-word, erroneous handling of two MariaDB-specific reserved words has been corrected (0c0b8a8)
- Premium edition bug fix: when using SSH tunnel functionality to connect to a server that only has an RSA host key, previously the rsa-sha2-512 or rsa-sha2-256 algorithms would not be attempted by Skeema during the handshake. This is now fixed, thanks to a community contribution to our open source knownhosts wrapper package. (skeema/knownhosts#6)
Thank you to all code contributors and issue reporters!
v1.11.1
- MySQL 8.2 is now supported (0346508)
- The new
SET_ANY_DEFINER
privilege is now properly handled by the strip-definer=auto Premium option
- The new
- MariaDB 11.2 is now supported (3611359)
- MariaDB 11.2 extends its built-in online schema change support to include
ALTER TABLE ... ALGORITHM=COPY, LOCK=NONE
. As always, Skeema users can enforce a minimum algorithm/lock for generated ALTER TABLE statements by using Skeema's alter-algorithm and alter-lock options. However, users should be aware that the database server's built-in OSC can cause replication lag. Enabling MariaDB'sbinlog_alter_two_phase
server variable may help reduce or prevent this lag.
- MariaDB 11.2 extends its built-in online schema change support to include
- Performance improvement for
skeema diff
andskeema push
: the verify option, which is enabled by default, now ignores cosmetic table discrepancies which are excluded fromALTER TABLE
generation anyway. This provides a major performance benefit in environments with many auto-increment tables or range-partitioned tables, among other situations. (bcd46d4) - Performance improvements for the workspace=docker option (22d4b9b, c029294, 766efc3)
- Newly-created containerized databases now use a smaller buffer pool, use smaller redo log files, disable performance_schema, disable the adaptive hash index, and disable separate log writer threads. These changes improve performance for the workspace workload, and reduce system resource consumption.
- On Linux systems, when docker-cleanup=destroy is configured, the ephemeral containerized database will now automatically use a tmpfs mount for its data directory. This greatly improves performance by avoiding disk writes for the workspace workload.
- These changes do not affect pre-existing containers which were created from prior use of workspace=docker. You can manually remove older containers (for example
docker rm -v -f skeema-mysql-8.0
) if you wish for Skeema to recreate them with the new tuned settings.
- Two problematic variants of CREATE TABLE statements are now simply ignored by all Skeema commands entirely; a warning is logged in these situations (62c33e0)
CREATE TABLE ... SELECT
statements in the filesystem previously caused their entire subdir to be skipped with a fatal errorCREATE TABLE ... WITH SYSTEM VERSIONING
(MariaDB-only database feature) statements in the filesystem previously would be erroneously removed byskeema pull
(#187, #206)
- Bug fix for MariaDB 10.10+: tables using the new UCA-14.0.0 collations, such as utf8mb4_uca1400_ai_ci, are now introspected properly. Previously, these collations were not handled correctly by Skeema because they are represented differently in information_schema.collations than all other collations. (ee25133)
- Internal improvement for Skeema developers/contributors: integration test suite output is now substantially less noisy, suppressing all output from subtests which pass (5d3d1b5)
v1.11.0
See the Skeema v1.11 release announcement blog post for a summary of the most important changes in this release.
- Spatial indexes and SRID column attributes are now fully supported for diff operations. (#97, 77ab3de, 5e357db)
- In MySQL 8+, if a spatial index is on a column that lacks an SRID, lint-dupe-index will now flag the index since the database server query optimizer will not use it. (27686f0)
- AWS Aurora's nonstandard B-Tree based spatial index implementation is properly supported in Skeema's Premium edition.
- MySQL 8.1 is now supported. (23520ea, f4e480f)
- MariaDB 11.1 is now supported. (865aa62)
- Premium edition improvement for triggers: whenever
skeema push
needs to perform multiple trigger manipulations in the same schema, the corresponding parent tables are now briefly write-locked, to prevent data inconsistencies from writes which occur in the middle of the push operation.- Even though MySQL lacks
CREATE OR REPLACE
syntax to atomically modify a trigger, this improvement now makes it safe to modify existing triggers, so allow-unsafe is no longer necessary in this situation.
- Even though MySQL lacks
- The workspace=docker option now shells out to an external Docker CLI binary, instead of bundling a Golang Docker client library inside of Skeema. This change reduces the size of the
skeema
binary by 25-40%, and avoids spurious false-positive security warnings related to dependencies of the Docker client library. (#186, 2a2d8e3, 233c73e) - New option lax-column-order provides a way to ignore differences in column ordering in
skeema diff
andskeema push
. (#178, c6de431) - New option lax-comments provides a way to ignore COMMENT clause differences in
skeema diff
andskeema push
. (76a7323) - When
skeema diff
orskeema push
detects multiple unsafe changes, all such unsafe changes are now logged, instead of just the first one. Additionally, linting still occurs if unsafe changes are present, allowing the user to see all problematic unsafe statements and linter violations at the same time. (01a93d5) - Several additional column modification edge cases are now considered unsafe by
skeema diff
andskeema push
. (905ee14)- Changing the collation of a column that appears in a uniqueness constraint
- Adding, removing, or changing the SRID of a spatial column in MySQL 8+
- Converting the column type between TIME and TIMESTAMP
- Several small improvements when modifying existing routines when using
skeema diff
orskeema push
- Changes to the parameters or return type of a routine are now considered unsafe, requiring allow-unsafe to proceed even in MariaDB (where atomic CREATE OR REPLACE syntax normally makes other types of routine modifications safe). (a3ecc18)
- When modifying a routine's characteristics (COMMENT clause, SECURITY characteristic, SQL DATA characteristic) and no other properties of the routine, Skeema now emits
ALTER PROCEDURE
/ALTER FUNCTION
, which is safe and atomic even in MySQL. (6fab6d8) - In the output for
skeema diff
andskeema push
, if the last statement for a schema required use of a nonstandard DELIMITER, the output will now also include aDELIMITER ;
line before moving on to the next schema. This is beneficial for users who pipeskeema diff
STDOUT to another program and then add additional SQL statements afterwards. (605b735)
- Linter annotation messages now backtick-wrap the name of the problematic table, routine, view, or trigger. (2dd1fb6)
- Premium edition improvement for Windows build: when Skeema needs to invoke external commands with PowerShell, its
-EncodedCommand
option is now used in order to prevent problems with tricky nested escaping of quoted parameters. - Premium edition Aurora bug fix: the latest release of Aurora for MySQL 5.7 (Aurora v2.12.0, from 2023-07-25) was not properly detected as flavor=aurora. This version of Aurora self-reports its MySQL server version as 5.7.40, whereas all previous Aurora v2 versions reported it as MySQL 5.7.12. Skeema's Aurora detection logic has now been adjusted to allow for dynamic 5.7 versions, similar to how the logic for Aurora v3 (MySQL 8.0.x) already worked.
- Premium edition bug fix: when using Skeema Premium's ssh tunnel functionality on a server with an IPv6 address, if the SSH configuration specifies
StrictHostKeyChecking=no
orStrictHostKeyChecking=ask
, Skeema could previously write the knownhosts entry incorrectly, in part due to an upstream Golang bug. Workarounds are now in place, thanks to community contributions to our open source knownhosts wrapper package. (skeema/knownhosts#2, skeema/knownhosts#4)
Upgrade notice for users of Skeema's workspace=docker option:
- Skeema v1.11+ no longer bundles a built-in Docker client. A
docker
command-line client binary must be available in your $PATH to use workspace=docker. If you use this setting while also runningskeema
inside of a container, you must ensure thatskeema
's container has a workingdocker
binary prior to upgrading. See #186 for more information.
v1.10.1
- MariaDB 11.0 is now supported. (963f0e3, 2b112b6)
skeema diff
andskeema push
can now generate supportedALTER TABLE
statements even for tables that already have unsupported features, as long as the new modification to the table does not affect those unsupported features. (#214, 7b5e86d)- For example, these commands can now add columns or indexes to pre-existing tables that already happen to use unsupported features such as spatial indexes, sub-partitioning, application time periods, etc. (Previously, Skeema could not generate an
ALTER TABLE
for such tables under any circumstances.) - In these cases, Skeema always verifies that the generated DDL has the correct effect by testing it in a workspace, even if skip-verify has been configured.
- This verification step is conservative, and some edge cases may fail verification, particularly on MySQL 8 tables with non-default collations. In that situation, the operation remains marked as unsupported and the table is skipped with a warning message.
- For example, these commands can now add columns or indexes to pre-existing tables that already happen to use unsupported features such as spatial indexes, sub-partitioning, application time periods, etc. (Previously, Skeema could not generate an
- When using workspace=docker, Skeema will attempt to automatically use a session sql_mode equivalent to that of your "real" database server (assuming a database host is configured and reachable). This solves common strict-mode problems on database systems that often use a nonstandard sql_mode, such as AWS RDS. (cfc11a0)
- Bug fix: On Mac and Windows client systems, a change in Skeema v1.10.0 inadvertently caused
skeema init
andskeema pull
to always downcase the name of any newly-created .sql files. This has now been fixed, and the casing of the original table/object will be retained when naming the .sql file. (f0e52b7)- Regardless of this change, users can always freely rename .sql files or move statements between .sql files in the same directory. Skeema never requires that you keep statements in the exact location that
skeema init
orskeema pull
put them in.
- Regardless of this change, users can always freely rename .sql files or move statements between .sql files in the same directory. Skeema never requires that you keep statements in the exact location that
- Bug fix: a regression in Skeema v1.8.1 inadvertently reduced the effectiveness of the strip-definer option specifically for procs/funcs, when using an unprivileged database user and workspace=temp-schema. In that situation, if the
CREATE FUNCTION
orCREATE PROCEDURE
statement in the .sql file contained a DEFINER clause, workspace errors could result. This has now been fixed, and DEFINER clauses are now properly stripped from procs and funcs. (The bug did not affect views or triggers; those already worked properly and this remains the case.) - Bug fix: On Windows, when
skeema pull
needs to delete a .sql file because the corresponding table/object no longer exists in the database, file locking errors could sometimes occur on Skeema v1.10.0. This has now been fixed. (061f478) - Improvements to logging and error messages in several situations:
- When host and/or schema are not supplied in the appropriate location, or host-wrapper doesn't output any hostnames (0825d1a, 1055b2d)
- Common mistakes with the password option (80635d9)
- Workspace locking conflicts and timeouts (f8f0745)
- Problems with the connect-options configuration (4d218c1)
v1.10.0
For a summary of the most important changes in this release, see the Skeema v1.10.0 release announcement blog post.
- The Premium edition CLI now supports management of seed data using INSERT statements, for populating new tables or spinning up new environments. (#22)
- The new inserts option controls how
skeema push
handles INSERT statements found in your *.sql files. The default setting, inserts=seed, will execute INSERTs whenever the target table is empty. skeema pull
's new update-seed-inserts option provides a mechanism for selectively dumping row data from an environment using view logic, automatically creating or updating INSERT statements in your *.sql files.
- The new inserts option controls how
- All logic for processing .sql files has been completely rewritten. The new implementation provides an 8x to 40x speedup on parsing time, while also using substantially less memory. This was motivated by the requirement to handle arbitrarily-large seed data INSERT statements in the Premium edition, but the performance improvements are generally beneficial to all users, and are present in the Community edition as well. (e625c97)
- MariaDB 10.11 is now marked as supported by Skeema. (5b0cc10)
- New linter rule lint-pk-type provides a way to restrict which column data types may be used in primary keys. The list of allowed data types is configurable using the new allow-pk-type companion option. (#204, #205)
- New linter rule lint-reserved-word flags names of identifiers (tables, columns, routines, etc) which match reserved words in any known version of your database server. (#120, #207, 4c2ddd0)
- Linter improvement: lint-has-time now provides more descriptive messages that differ for timestamp vs datetime/time. The timestamp message now includes a warning about Y2K38 problems with this type, in addition to other improvements. (#209, #210)
skeema diff --brief
now automatically disables linter checks and omits all INFO-level logging. These changes are designed to make the output more easily human-readable, while still surfacing any unusual errors or warnings. (310164a)- If STDERR isn't a terminal (e.g. being piped to another program or redirected to a file), all error/warning linter annotation output from
skeema lint
,skeema diff
, andskeema push
now omits embedded newlines. Previously, each annotation message could span multiple lines, which made automated parsing and processing more difficult. Now, each individual annotation message will consist of a single line when STDERR isn't a terminal. (#211) - Bug fix: previously,
skeema init
would hang for a long period if a large .sql file was present in the working directory, for examplemysqldump
output from a large database. The contents of the working directory no longer affectskeema init
. (#190, 2481bed) - Bug fix: Partitioned tables using the LIST COLUMNS partitioning method were previously unsupported for diff operations in many cases. Now most LIST COLUMNS tables are supported, as long as the partitioning key column names don't conflict with MySQL keywords. (#199, 3313bfc)
- Bug fix: On MySQL 8, if a table contained at least one BINARY or VARBINARY column with a literal (non-expression) DEFAULT value, previously the table could be marked as unsupported for diff operations due to a MySQL information_schema bug. Skeema now implements a workaround for this MySQL bug. (0177ef9)
Thank you to all code contributors and issue reporters!
v1.9.0
For a summary of the most important changes in this release, see the Skeema v1.9.0 release announcement blog post.
- Environment variables may be used as option values in .skeema option files for options user, password, host, schema, port, socket, and temp-schema. This provides a flexible mechanism for dynamic configuration. (16b54e4, #101)
- Premium CLI now includes the ability to offload the temp-schema workspace to a different database server, via the new temp-schema-environment option. The option value is set to the name of an environment (.skeema file section) which can override some or all connectivity options (host, port, socket, user, password, host-wrapper, SSH options, SSL options, etc) for determining what host to place the temp-schema workspace on. (#94)
- Improvements to the various ignore-* options (ignore-table, ignore-proc, ignore-func, ignore-view, ignore-trigger)
- The ignore-proc and ignore-func options, which previously were only available in the Premium edition (since v1.6.0-premium one year ago), are now available in the Community edition as well. (0de3c57)
- The ignore options now take effect earlier in the processing flow for all commands. Workspaces skip ignored statements entirely now, improving performance and ensuring that execution cannot be affected by SQL errors from ignored statements. (b35f065)
- Several MariaDB-specific improvements and fixes
- MariaDB 10.10 is now fully supported, including special conversion logic for the new
inet4
column type. (53de093) - MariaDB's November 2022 point releases (MariaDB 10.3.37, 10.4.27, 10.5.18, 10.6.11, 10.7.7, 10.8.6, 10.9.4) are now supported by Skeema. These MariaDB releases unexpectedly changed the output logic for collations in SHOW CREATE TABLE, which broke compatibility with a core safety check in Skeema. (f2dcaf8, #193, #194, #195)
- When modifying existing procs/funcs in MariaDB, atomic CREATE OR REPLACE syntax is now used. This functionality was originally introduced in Skeema v1.6.0-premium one year ago, but is now present in the Community Edition as well. (412a326)
- MariaDB 10.10 is now fully supported, including special conversion logic for the new
- When interacting with multiple hosts (running
skeema
from a parent directory), it is now possible to interactively prompt for different passwords for each host, by configuring the bare password option with no=value
in the same .skeema file as the host. (ab4a84c, 5e35143, b004616)- Previously, bare password option with no
=value
was only supported in global option files. This still works, and still prompts for a single "global" password rather than host-specific ones. - For an alternative mechanism for passing different passwords to each host, also see the new ENV variable support, mentioned above.
- Previously, bare password option with no
- When using workspace=docker with MySQL 8, whenever Skeema creates a new ephemeral containerized DB, binary logging will be disabled automatically, despite MySQL 8 normally defaulting to enabling binlogging. This improves workspace performance, and prevents potential issues with non-deterministic CREATE FUNCTION definitions. (2804a44)