diff --git a/.mokogitea/workflows/issue-branch.yml b/.mokogitea/workflows/issue-branch.yml
index 365393eb..e85e17fb 100644
--- a/.mokogitea/workflows/issue-branch.yml
+++ b/.mokogitea/workflows/issue-branch.yml
@@ -5,7 +5,7 @@
# FILE INFORMATION
# DEFGROUP: MokoGitea.Workflow
# INGROUP: mokocli.Automation
-# VERSION: 02.57.00
+# VERSION: 02.57.01
# BRIEF: Auto-create feature branch when an issue is opened
name: "Universal: Issue Branch"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7b1eacb2..26def769 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,9 @@
## [Unreleased]
+### Fixed
+- Installer no longer aborts on MySQL 8 with "This command is not supported in the prepared statement protocol yet" (error 1295). The legacy remote-column purge migration (`02.56.01.sql`) used `PREPARE`/`EXECUTE`/`DEALLOCATE`, which Joomla's installer rejects; the drop now runs in the package installer script via an INFORMATION_SCHEMA-gated plain `ALTER` (portable across MariaDB and MySQL 8). (#213 update path)
+
## [02.57.00] --- 2026-07-05
### Added
diff --git a/SECURITY.md b/SECURITY.md
index 41fe89dc..cfe33d04 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -23,7 +23,7 @@ DEFGROUP: Template-Joomla
INGROUP: Template-Joomla.Documentation
REPO: https://git.mokoconsulting.tech/MokoConsulting/Template-Joomla
PATH: /SECURITY.md
-VERSION: 02.57.00
+VERSION: 02.57.01
BRIEF: Security vulnerability reporting and handling policy
-->
diff --git a/source/packages/MokoSuiteClient b/source/packages/MokoSuiteClient
index 2273690f..9419d19f 160000
--- a/source/packages/MokoSuiteClient
+++ b/source/packages/MokoSuiteClient
@@ -1 +1 @@
-Subproject commit 2273690f9493c78fd0c3a579d1dbc04897f55e9b
+Subproject commit 9419d19fbc192953c3cfb33b1702546bf9bee6c1
diff --git a/source/packages/com_mokosuitebackup/mokosuitebackup.xml b/source/packages/com_mokosuitebackup/mokosuitebackup.xml
index e957fb39..75dfc1ec 100644
--- a/source/packages/com_mokosuitebackup/mokosuitebackup.xml
+++ b/source/packages/com_mokosuitebackup/mokosuitebackup.xml
@@ -17,7 +17,7 @@
display label there.
-->
MokoSuiteBackup
- 02.57.00
+ 02.57.01
2026-06-02
Moko Consulting
hello@mokoconsulting.tech
diff --git a/source/packages/com_mokosuitebackup/sql/updates/mysql/02.56.01.sql b/source/packages/com_mokosuitebackup/sql/updates/mysql/02.56.01.sql
index 04a5b622..533fca7b 100644
--- a/source/packages/com_mokosuitebackup/sql/updates/mysql/02.56.01.sql
+++ b/source/packages/com_mokosuitebackup/sql/updates/mysql/02.56.01.sql
@@ -1,32 +1,13 @@
--- Purge legacy single-remote storage columns from installs where they are still present.
+-- Legacy single-remote storage columns are now purged by the package installer
+-- script (Pkg_MokoSuiteBackupInstallerScript::dropLegacyRemoteColumns()), NOT here.
--
--- Background: 02.52.25.sql originally used `DROP COLUMN IF EXISTS`, which is a
--- MariaDB-only extension and errors on Oracle MySQL 8.x. On MySQL 8 installs the
--- migration failed but Joomla still recorded the schema as applied, leaving all 26
--- legacy remote_storage/ftp_*/sftp_*/gdrive_*/s3_* columns stranded on the profiles
--- table. This migration removes them portably.
+-- The 26 legacy remote_storage/ftp_*/sftp_*/gdrive_*/s3_* columns must be removed
+-- portably across MariaDB and MySQL 8. `DROP COLUMN IF EXISTS` is MariaDB-only
+-- (errors on MySQL 8); plain `DROP COLUMN` errors when a column is absent. The
+-- previous version gated the ALTER on INFORMATION_SCHEMA and ran it via
+-- PREPARE/EXECUTE/DEALLOCATE — but those statements are rejected by Joomla's
+-- installer SQL path (MySQL error 1295: "This command is not supported in the
+-- prepared statement protocol yet"), which ABORTED the whole component install.
--
--- It must be safe on BOTH engines AND on installs where the columns are already gone
--- (MariaDB, or anyone who ran the corrected 02.52.25). Plain `DROP COLUMN` errors when
--- a column is absent, and `DROP COLUMN IF EXISTS` errors on MySQL 8 — so neither works
--- unconditionally. We gate the drop on INFORMATION_SCHEMA and build the ALTER via a
--- prepared statement, which runs on MySQL 8 and MariaDB alike. All 26 columns were
--- created and dropped together, so the presence of `remote_storage` gates the whole set.
--- When the columns are absent this is a no-op (`DO 0`).
-
-SET @moko_has_legacy_remote := (
- SELECT COUNT(*)
- FROM INFORMATION_SCHEMA.COLUMNS
- WHERE TABLE_SCHEMA = DATABASE()
- AND TABLE_NAME = '#__mokosuitebackup_profiles'
- AND COLUMN_NAME = 'remote_storage'
-);
-
-SET @moko_drop_legacy_remote := IF(@moko_has_legacy_remote > 0,
- 'ALTER TABLE `#__mokosuitebackup_profiles` DROP COLUMN `remote_storage`, DROP COLUMN `ftp_host`, DROP COLUMN `ftp_port`, DROP COLUMN `ftp_username`, DROP COLUMN `ftp_password`, DROP COLUMN `ftp_path`, DROP COLUMN `ftp_passive`, DROP COLUMN `ftp_ssl`, DROP COLUMN `sftp_host`, DROP COLUMN `sftp_port`, DROP COLUMN `sftp_username`, DROP COLUMN `sftp_auth_type`, DROP COLUMN `sftp_password`, DROP COLUMN `sftp_key_data`, DROP COLUMN `sftp_passphrase`, DROP COLUMN `sftp_path`, DROP COLUMN `gdrive_client_id`, DROP COLUMN `gdrive_client_secret`, DROP COLUMN `gdrive_refresh_token`, DROP COLUMN `gdrive_folder_id`, DROP COLUMN `s3_endpoint`, DROP COLUMN `s3_region`, DROP COLUMN `s3_access_key`, DROP COLUMN `s3_secret_key`, DROP COLUMN `s3_bucket`, DROP COLUMN `s3_path`',
- 'DO 0'
-);
-
-PREPARE moko_stmt FROM @moko_drop_legacy_remote;
-EXECUTE moko_stmt;
-DEALLOCATE PREPARE moko_stmt;
+-- The drop is now done in PHP (INFORMATION_SCHEMA gate + a plain ALTER for only the
+-- columns that still exist), so this migration is intentionally a no-op.
diff --git a/source/packages/com_mokosuitebackup/sql/updates/mysql/02.57.01.sql b/source/packages/com_mokosuitebackup/sql/updates/mysql/02.57.01.sql
new file mode 100644
index 00000000..5bf7e33c
--- /dev/null
+++ b/source/packages/com_mokosuitebackup/sql/updates/mysql/02.57.01.sql
@@ -0,0 +1 @@
+/* 02.57.01 — no schema changes */
diff --git a/source/packages/mod_mokosuitebackup_cpanel/mod_mokosuitebackup_cpanel.xml b/source/packages/mod_mokosuitebackup_cpanel/mod_mokosuitebackup_cpanel.xml
index 92d82b1b..8cd0c882 100644
--- a/source/packages/mod_mokosuitebackup_cpanel/mod_mokosuitebackup_cpanel.xml
+++ b/source/packages/mod_mokosuitebackup_cpanel/mod_mokosuitebackup_cpanel.xml
@@ -8,7 +8,7 @@
-->
Module - MokoSuiteBackup - cPanel
- 02.57.00
+ 02.57.01
2026-06-23
Moko Consulting
hello@mokoconsulting.tech
diff --git a/source/packages/plg_actionlog_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_actionlog_mokosuitebackup/mokosuitebackup.xml
index fa7380ee..915be3d6 100644
--- a/source/packages/plg_actionlog_mokosuitebackup/mokosuitebackup.xml
+++ b/source/packages/plg_actionlog_mokosuitebackup/mokosuitebackup.xml
@@ -7,7 +7,7 @@
-->
Action Log - MokoSuiteBackup
- 02.57.00
+ 02.57.01
2026-06-04
Moko Consulting
hello@mokoconsulting.tech
diff --git a/source/packages/plg_console_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_console_mokosuitebackup/mokosuitebackup.xml
index 0a4ed7b7..0315533f 100644
--- a/source/packages/plg_console_mokosuitebackup/mokosuitebackup.xml
+++ b/source/packages/plg_console_mokosuitebackup/mokosuitebackup.xml
@@ -7,7 +7,7 @@
-->
Console - MokoSuiteBackup
- 02.57.00
+ 02.57.01
2026-06-04
Moko Consulting
hello@mokoconsulting.tech
diff --git a/source/packages/plg_content_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_content_mokosuitebackup/mokosuitebackup.xml
index cb7e6cd3..6274773f 100644
--- a/source/packages/plg_content_mokosuitebackup/mokosuitebackup.xml
+++ b/source/packages/plg_content_mokosuitebackup/mokosuitebackup.xml
@@ -7,7 +7,7 @@
-->
Content - MokoSuiteBackup
- 02.57.00
+ 02.57.01
2026-06-04
Moko Consulting
hello@mokoconsulting.tech
diff --git a/source/packages/plg_quickicon_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_quickicon_mokosuitebackup/mokosuitebackup.xml
index 838aa44f..a2db9506 100644
--- a/source/packages/plg_quickicon_mokosuitebackup/mokosuitebackup.xml
+++ b/source/packages/plg_quickicon_mokosuitebackup/mokosuitebackup.xml
@@ -1,7 +1,7 @@
Quick Icon - MokoSuiteBackup
- 02.57.00
+ 02.57.01
2026-06-02
Moko Consulting
hello@mokoconsulting.tech
diff --git a/source/packages/plg_system_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_system_mokosuitebackup/mokosuitebackup.xml
index 3b0d00e0..7efd6081 100644
--- a/source/packages/plg_system_mokosuitebackup/mokosuitebackup.xml
+++ b/source/packages/plg_system_mokosuitebackup/mokosuitebackup.xml
@@ -7,7 +7,7 @@
-->
System - MokoSuiteBackup
- 02.57.00
+ 02.57.01
2026-06-02
Moko Consulting
hello@mokoconsulting.tech
diff --git a/source/packages/plg_task_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_task_mokosuitebackup/mokosuitebackup.xml
index 07734a53..f5cea6f7 100644
--- a/source/packages/plg_task_mokosuitebackup/mokosuitebackup.xml
+++ b/source/packages/plg_task_mokosuitebackup/mokosuitebackup.xml
@@ -7,7 +7,7 @@
-->
Task - MokoSuiteBackup
- 02.57.00
+ 02.57.01
2026-06-02
Moko Consulting
hello@mokoconsulting.tech
diff --git a/source/packages/plg_webservices_mokosuitebackup/mokosuitebackup.xml b/source/packages/plg_webservices_mokosuitebackup/mokosuitebackup.xml
index e4ed7018..0ba1c4a6 100644
--- a/source/packages/plg_webservices_mokosuitebackup/mokosuitebackup.xml
+++ b/source/packages/plg_webservices_mokosuitebackup/mokosuitebackup.xml
@@ -7,7 +7,7 @@
-->
Web Services - MokoSuiteBackup
- 02.57.00
+ 02.57.01
2026-06-02
Moko Consulting
hello@mokoconsulting.tech
diff --git a/source/pkg_mokosuitebackup.xml b/source/pkg_mokosuitebackup.xml
index 140cb4be..d61363cc 100644
--- a/source/pkg_mokosuitebackup.xml
+++ b/source/pkg_mokosuitebackup.xml
@@ -8,7 +8,7 @@
Package - MokoSuiteBackup
mokosuitebackup
- 02.57.00
+ 02.57.01
2026-06-02
Moko Consulting
hello@mokoconsulting.tech
diff --git a/source/script.php b/source/script.php
index dbd12a54..4e209884 100644
--- a/source/script.php
+++ b/source/script.php
@@ -177,6 +177,10 @@ class Pkg_MokoSuiteBackupInstallerScript
briefly used the "Type - Name" convention. Self-healing on every update. */
$this->removeOrphanedComponent();
+ /* Drop legacy single-remote storage columns portably (replaces the old
+ PREPARE/EXECUTE migration that MySQL 8 rejected in Joomla's installer). */
+ $this->dropLegacyRemoteColumns();
+
/* Install completion notice (install and update) */
$this->installSuccessful();
@@ -273,6 +277,54 @@ class Pkg_MokoSuiteBackupInstallerScript
}
}
+ /**
+ * Drop the 26 legacy single-remote storage columns from the profiles table if
+ * they are still present. Replaces sql/updates/mysql/02.56.01.sql, whose
+ * PREPARE/EXECUTE/DEALLOCATE approach is rejected by Joomla's installer on
+ * MySQL 8 (error 1295) and aborted the whole install. Done here in PHP: gate on
+ * INFORMATION_SCHEMA, then issue a plain ALTER for only the columns that exist —
+ * portable across MariaDB and MySQL 8. Idempotent and non-fatal.
+ *
+ * @return void
+ */
+ private function dropLegacyRemoteColumns(): void
+ {
+ try {
+ $db = Factory::getDbo();
+ $table = $db->getPrefix() . 'mokosuitebackup_profiles';
+
+ $columns = [
+ 'remote_storage',
+ 'ftp_host', 'ftp_port', 'ftp_username', 'ftp_password', 'ftp_path', 'ftp_passive', 'ftp_ssl',
+ 'sftp_host', 'sftp_port', 'sftp_username', 'sftp_auth_type', 'sftp_password', 'sftp_key_data', 'sftp_passphrase', 'sftp_path',
+ 'gdrive_client_id', 'gdrive_client_secret', 'gdrive_refresh_token', 'gdrive_folder_id',
+ 's3_endpoint', 's3_region', 's3_access_key', 's3_secret_key', 's3_bucket', 's3_path',
+ ];
+
+ // Which legacy columns still exist on this install?
+ $db->setQuery(
+ $db->getQuery(true)
+ ->select($db->quoteName('COLUMN_NAME'))
+ ->from($db->quoteName('INFORMATION_SCHEMA.COLUMNS'))
+ ->where($db->quoteName('TABLE_SCHEMA') . ' = DATABASE()')
+ ->where($db->quoteName('TABLE_NAME') . ' = ' . $db->quote($table))
+ ->where($db->quoteName('COLUMN_NAME') . ' IN (' . implode(',', array_map([$db, 'quote'], $columns)) . ')')
+ );
+ $present = $db->loadColumn();
+
+ if (empty($present)) {
+ return;
+ }
+
+ $drops = array_map(fn($c) => 'DROP COLUMN ' . $db->quoteName($c), $present);
+ $db->setQuery('ALTER TABLE ' . $db->quoteName($table) . ' ' . implode(', ', $drops));
+ $db->execute();
+ } catch (\Throwable $e) {
+ /* Best-effort — a leftover column is harmless and must never abort the install */
+ Log::add('MokoSuiteBackup legacy-remote-column drop failed: ' . $e->getMessage(), Log::WARNING, 'jerror');
+ }
+ }
+
/**
* Recursively delete a directory (version-independent, no Folder dependency).
*