• Hi Aaron. Just reporting another flood of continously repeating debug.log messages after updating from version 4.1.3 to version 4.1.4. This problem might have exposed an underlying consistency issue we need to resolve concerning the character set used across the tables in our database. Posting here though since it is still surprising this issue came up with your plugin.

    [21-Apr-2026 22:18:15 UTC] WordPress database error COLLATION ‘utf8mb4_unicode_520_ci’ is not valid for CHARACTER SET ‘utf8mb3’ for query
    /* —————— /home/▒▒▒/▒▒▒/▒▒▒/wp-content/plugins/404-solution/includes/sql/getPublishedPagesAndPostsIDs.sql BEGIN —– */

    select wp_posts.id,
    wp_posts.post_type,
    wp_posts.post_parent,
    wp_posts.post_title,

       /* the depth is only here to initialize the value to something. later it's used for sorting. */
       '0' as depth,
    
       usefulterms.grouped_terms,
    
       plc.url

    from wp_▒▒▒_posts wp_posts

    left outer join (
    /* This selects posts that have the exclude keys set in woocommerce.
    The exclude keys are all aggregated on one line with group_concat(). */
    select wptr.object_id,
    group_concat(wpt.name) as grouped_terms
    from wp_▒▒▒_term_relationships wptr

        left outer join wp_▒▒▒_terms wpt
    on wptr.term_taxonomy_id = wpt.term_id
    and wpt.name COLLATE utf8mb4_unicode_520_ci in ('exclude-from-search', 'exclude-from-catalog')

    where wpt.name is not null

    group by wptr.object_id

    ) usefulterms

    on wp_posts.ID = usefulterms.object_id

    left outer join wp_▒▒▒_abj404_permalink_cache plc
    on wp_posts.ID = plc.id

    where wp_posts.post_status in (‘publish’, ‘published’)
    and lcase(wp_posts.post_type) in (‘page’, ‘post’, ‘product’) /* ‘page’, ‘post’, ‘product’ */

    /* only include this line if a slug has been specified. e.g.
    and post_name = ‘specifiedSlug’
    */
    and CAST(wp_posts.post_name AS CHAR CHARACTER SET utf8mb4) COLLATE utf8mb4_unicode_ci = ’11’

    /* */

    /* only include this line if a search term has been specified. e.g.
    and lower(post_name) like ‘searchTerm’

    /* */

    /* only include this line if it’s been specified. e.g.
    and abs(plc.url_length – 100) <= 6

    /* */

    and ( usefulterms.grouped_terms is null or
    usefulterms.grouped_terms COLLATE utf8mb4_unicode_520_ci not like ‘%exclude-from-search%’
    or usefulterms.grouped_terms COLLATE utf8mb4_unicode_520_ci not like ‘%exclude-from-catalog%’
    )

    /* order results. e.g order by abs(plc.url_length – 100), wp_posts.ID

    /* */

    /* limit results. e.g limit 250

    /* */

    /* —————— /home/▒▒▒/▒▒▒/▒▒▒/wp-content/plugins/404-solution/includes/sql/getPublishedPagesAndPostsIDs.sql END —– */
    made by require(‘wp-blog-header.php’), require_once(‘wp-includes/template-loader.php’), do_action(‘template_redirect’), WP_Hook->do_action, WP_Hook->apply_filters, abj404_404listener, ABJ_404_Solution_WordPress_Connector->process404, ABJ_404_Solution_FrontendRequestPipeline->process404, ABJ_404_Solution_FrontendRequestPipeline->runMatchingEngines, ABJ_404_Solution_SlugMatchingEngine->match, ABJ_404_Solution_SpellChecker->getPermalinkUsingSlug, ABJ_404_Solution_DataAccess->getPublishedPagesAndPostsIDs

    • This topic was modified 1 month, 1 week ago by Aharon.
Viewing 7 replies - 1 through 7 (of 7 total)
  • Plugin Author Aaron

    (@aaron13100)

    Thank you for letting me know and thank you for the debug log. It’s very helpful. I’ll try to get a fix out for this today.

    Sorry, more issues: I’ve noticed your plugin was ruining my 404 redirects from Rank Math, had to disable it now.

    For example, https://www.showmetech.com.br/redes/ should redirect to https://www.showmetech.com.br/redes-sociais/, because I have that configured in the Rank Math redirect. But when 404 Soliton is activated, it redirects to a weird 404 page.

    Plugin Author Aaron

    (@aaron13100)

    Bruno > I understand. No worries.

    Aharon > Anyway I’ve hopefully fixed this in version 4.1.5. If not let me know.

    thanks

    Plugin Author Aaron

    (@aaron13100)

    I’ll assume that this is fixed for @spaceling . Of course we’re still continuing to debug with Bruno in a different thread.

    Thread Starter Aharon

    (@spaceling)

    We did see a number of messages posted to our debug log after the 4.1.18 version update earlier today. I’m keeping my eye on them in case they continue to post. (I’ll mainly post here in the event of a continuous, unending flood of debug.log messages.)

    Thread Starter Aharon

    (@spaceling)

    We have reverted to version 4.1.17 for now due to the flood of messages printed to the debug.log. I’ll copy below the wave messages printed there for a specific timestamp. I’m not sure what is initiating each wave of messages — it’s not every second but every few minutes. Possibly they’re printed to the debug.log each time the plugin is triggered by a visitor clicking a site URL… I don’t know.

    [15-May-2026 03:19:55 UTC] WordPress database error Table '░░░░░░.wp░░░_abj404_view_build' doesn't exist for query SET STATEMENT max_statement_time=296 FOR
    /* ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/02_insert.sql BEGIN ----- */

    /* S2: bulk-load every row from the live redirects table into the build
    buffer, with status_for_view, type_for_view (constant-per-status),
    final_dest, code, disabled, timestamp, engine, score, and fd_int
    (CAST(final_dest AS UNSIGNED)) computed inline. dest_for_view and
    published_status start at the column defaults and are filled in
    per-type by the next stages.

    The shared build buffer holds ALL redirects (both active and trashed,
    both redirect statuses and captured statuses). Per-tab status filter,
    disabled filter, score-range filter, and search filter are all applied
    at READ time against the served view_done table.

    Resumable batching: this fragment is invoked once per batch by
    stageInsertRedirectsBatched(). 0 is MAX(id) of the build
    buffer at batch start (0 on first batch), and 2000 caps how
    many rows the batch copies. ORDER BY id ASC is required so MAX(id)
    advances strictly, which lets the next batch resume cleanly without
    ever inserting duplicates and without needing INSERT IGNORE. / INSERT INTO wp_siddur_abj404_view_build (id, url, status, status_for_view, type, type_for_view, final_dest, code, disabled, timestamp, engine, score, fd_int) SELECT id, url, status, CASE WHEN status = 1 THEN 'Manual' WHEN status = 2 THEN 'Automatic' WHEN status = 6 THEN 'Regex' ELSE 'Unknown' END, type, CASE WHEN type = 4 THEN 'External' WHEN type = 2 THEN 'Category' WHEN type = 3 THEN 'Tag' WHEN type = 5 THEN 'Home' WHEN type = 0 THEN 'Special' ELSE '' END, final_dest, code, disabled, timestamp, engine, score, / fd_int: numeric form of final_dest for the per-type UPDATE-JOINs in
    S4 (wp_posts.ID) and S5 (wp_terms.term_id). Non-numeric final_dest
    (external URLs, empty for HOME/404-displayed) becomes 0, which
    matches the legacy CAST behavior under non-strict sql_mode. The
    REGEXP guard avoids strict-mode CAST errors in MySQL 8+ defaults. */
    CAST(IF(final_dest REGEXP '^[0-9]+$', final_dest, '0') AS UNSIGNED)
    FROM wp_siddur_abj404_redirects
    WHERE id > 0
    ORDER BY id ASC
    LIMIT 2000

    /* ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/02_insert.sql END ----- / made by do_action_ref_array('abj404_rebuildViewDone'), WP_Hook->do_action, WP_Hook->apply_filters, abj404_rebuildViewDoneListener, ABJ_404_Solution_DataAccess->rebuildViewDoneInBackground, ABJ_404_Solution_DataAccess->runStagedBuildOnce, ABJ_404_Solution_DataAccess->runTimedViewBuildStage, ABJ_404_Solution_DataAccess->{closure:ABJ_404_Solution_DataAccess_ViewQueriesStagedTrait::runStagedBuildOnce():1300}, ABJ_404_Solution_DataAccess->stageInsertRedirectsBatched, ABJ_404_Solution_DataAccess->runInsertBatch, ABJ_404_Solution_DataAccess->runStagedSqlFile, ABJ_404_Solution_DataAccess->queryAndGetResults [15-May-2026 03:19:55 UTC] WordPress database error Table '░░░░░░.wp░░░_abj404_view_build' doesn't exist for query SET STATEMENT max_statement_time=296 FOR
    /
    ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/03_index_fd.sql BEGIN ----- */

    /* S3: indexes used by the per-type UPDATE-JOINs in S4 (POST), S5 (CAT/TAG),
    S6 (HOME), S7 (EXTERNAL), S8 (404 displayed). Composite is added because
    MySQL/MariaDB usually pick one index per table reference per join step
    (no index merge by default), and every per-type UPDATE combines a
    WHERE type = X predicate with a fd_int = ... join key. */
    ALTER TABLE wp_siddur_abj404_view_build
    ADD INDEX idx_fd_int (fd_int),
    ADD INDEX idx_type (type),
    ADD INDEX idx_type_fd_int (type, fd_int)

    /* ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/03_index_fd.sql END ----- / made by do_action_ref_array('abj404_rebuildViewDone'), WP_Hook->do_action, WP_Hook->apply_filters, abj404_rebuildViewDoneListener, ABJ_404_Solution_DataAccess->rebuildViewDoneInBackground, ABJ_404_Solution_DataAccess->runStagedBuildOnce, ABJ_404_Solution_DataAccess->runNonBatchedStageWithKillStreakEscape, ABJ_404_Solution_DataAccess->runTimedViewBuildStage, ABJ_404_Solution_DataAccess->{closure:ABJ_404_Solution_DataAccess_ViewQueriesStagedTrait::runStagedBuildOnce():1325}, ABJ_404_Solution_DataAccess->stageAddPreJoinIndexes, ABJ_404_Solution_DataAccess->runStagedSqlFileTolerantOfDuplicateKey, ABJ_404_Solution_DataAccess->runStagedSqlFile, ABJ_404_Solution_DataAccess->queryAndGetResults [15-May-2026 03:19:55 UTC] WordPress database error Table '░░░░░░.wp░░░_abj404_view_build' doesn't exist for query SET STATEMENT max_statement_time=296 FOR
    /
    ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/06_update_home.sql BEGIN ----- */

    /* S6: HOME-typed redirects show the site's blogname as their destination.
    wp_options.option_name is a UNIQUE index in WP core, so this scalar
    subquery reads exactly one row regardless of multisite shape. Missing
    blogname yields '' for dest_for_view (acceptable degraded path). */
    UPDATE wp_siddur_abj404_view_build
    SET
    dest_for_view = COALESCE((
    SELECT option_value FROM wp_siddur_options
    WHERE option_name = 'blogname' LIMIT 1), ''),
    published_status = 1
    WHERE type = 5

    /* ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/06_update_home.sql END ----- / made by do_action_ref_array('abj404_rebuildViewDone'), WP_Hook->do_action, WP_Hook->apply_filters, abj404_rebuildViewDoneListener, ABJ_404_Solution_DataAccess->rebuildViewDoneInBackground, ABJ_404_Solution_DataAccess->runStagedBuildOnce, ABJ_404_Solution_DataAccess->runTimedViewBuildStage, ABJ_404_Solution_DataAccess->{closure:ABJ_404_Solution_DataAccess_ViewQueriesStagedTrait::runStagedBuildOnce():1362}, ABJ_404_Solution_DataAccess->stageUpdateHome, ABJ_404_Solution_DataAccess->runStagedSqlFile, ABJ_404_Solution_DataAccess->queryAndGetResults [15-May-2026 03:19:55 UTC] WordPress database error Table '░░░░░░.wp░░░_abj404_view_build' doesn't exist for query SET STATEMENT max_statement_time=296 FOR
    /
    ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/07_update_external.sql BEGIN ----- */

    /* S7: EXTERNAL redirects display the destination URL itself. */
    UPDATE wp_siddur_abj404_view_build
    SET
    dest_for_view = final_dest,
    published_status = 1
    WHERE type = 4

    /* ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/07_update_external.sql END ----- / made by do_action_ref_array('abj404_rebuildViewDone'), WP_Hook->do_action, WP_Hook->apply_filters, abj404_rebuildViewDoneListener, ABJ_404_Solution_DataAccess->rebuildViewDoneInBackground, ABJ_404_Solution_DataAccess->runStagedBuildOnce, ABJ_404_Solution_DataAccess->runTimedViewBuildStage, ABJ_404_Solution_DataAccess->{closure:ABJ_404_Solution_DataAccess_ViewQueriesStagedTrait::runStagedBuildOnce():1375}, ABJ_404_Solution_DataAccess->stageUpdateExternal, ABJ_404_Solution_DataAccess->runStagedSqlFile, ABJ_404_Solution_DataAccess->queryAndGetResults [15-May-2026 03:19:55 UTC] WordPress database error Table '░░░░░░.wp░░░_abj404_view_build' doesn't exist for query SET STATEMENT max_statement_time=296 FOR
    /
    ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/08_update_special.sql BEGIN ----- */

    /* S8: 404-displayed redirects use a fixed translated label as their
    destination. Captured 404 rows also fall in this branch (status =
    captured/ignored/later, type = 404_displayed). */
    UPDATE wp_siddur_abj404_view_build
    SET
    dest_for_view = '(404 page)',
    published_status = 1
    WHERE type = 0

    /* ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/08_update_special.sql END ----- / made by do_action_ref_array('abj404_rebuildViewDone'), WP_Hook->do_action, WP_Hook->apply_filters, abj404_rebuildViewDoneListener, ABJ_404_Solution_DataAccess->rebuildViewDoneInBackground, ABJ_404_Solution_DataAccess->runStagedBuildOnce, ABJ_404_Solution_DataAccess->runTimedViewBuildStage, ABJ_404_Solution_DataAccess->{closure:ABJ_404_Solution_DataAccess_ViewQueriesStagedTrait::runStagedBuildOnce():1388}, ABJ_404_Solution_DataAccess->stageUpdateSpecial, ABJ_404_Solution_DataAccess->runStagedSqlFile, ABJ_404_Solution_DataAccess->queryAndGetResults [15-May-2026 03:19:55 UTC] WordPress database error Table '░░░░░░.wp░░░_abj404_view_build' doesn't exist for query SET STATEMENT max_statement_time=296 FOR
    /
    ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/09_update_hits.sql BEGIN ----- */

    /* S9c: LEFT JOIN the indexed S9 temporary aggregate onto the build buffer
    so the rendered table can sort/show logshits and last_used. Skipped
    entirely (orchestrator never reaches S9) when wp_abj404_logs_hits does
    not exist.

    The preceding temporary aggregate is defensive: the rebuild pipeline already
    produces one row per canonical_url via GROUP BY, but the table schema
    does not enforce UNIQUE on requested_url, so a corrupted/partial
    rebuild could leave duplicates. SUM/MAX on every group keeps the JOIN
    deterministic regardless. */
    UPDATE wp_siddur_abj404_view_build t
    LEFT JOIN wp_siddur_abj404_view_build_hits h
    ON h.requested_url =
    (CONVERT(CONCAT('/', TRIM(BOTH '/' FROM t.url)) USING utf8mb4) COLLATE utf8mb4_bin)
    SET
    t.logshits = h.logshits,
    t.logsid = h.logsid,
    t.last_used = h.last_used

    /* ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/09_update_hits.sql END ----- / made by do_action_ref_array('abj404_rebuildViewDone'), WP_Hook->do_action, WP_Hook->apply_filters, abj404_rebuildViewDoneListener, ABJ_404_Solution_DataAccess->rebuildViewDoneInBackground, ABJ_404_Solution_DataAccess->runStagedBuildOnce, ABJ_404_Solution_DataAccess->runNonBatchedStageWithKillStreakEscape, ABJ_404_Solution_DataAccess->runTimedViewBuildStage, ABJ_404_Solution_DataAccess->{closure:ABJ_404_Solution_DataAccess_ViewQueriesStagedTrait::runStagedBuildOnce():1411}, ABJ_404_Solution_DataAccess->stageUpdateHits, ABJ_404_Solution_DataAccess->runStagedSqlFile, ABJ_404_Solution_DataAccess->queryAndGetResults [15-May-2026 03:19:55 UTC] WordPress database error Table '░░░░░░.wp░░░_abj404_view_build' doesn't exist for query SET STATEMENT max_statement_time=296 FOR
    /
    ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/10_index_sort.sql BEGIN ----- */

    /* S10: indexes used by the read query against the served view_done table.
    Read filters: status IN (…), disabled = ?, optional score-range,
    optional filterText LIKE composite. Read sorts: published_status ASC
    primary, then user-chosen orderby column (url/status/type/code/score/
    timestamp/logshits/last_used/final_dest), then url ASC, then id.

    The composite indexes lead with published_status because that is the
    first ORDER BY key. Trailing column makes the (sort + LIMIT 0,25) shape
    plan-friendly: the planner reads directly off the index in order
    without filesort. status_disabled covers the WHERE filter. */
    ALTER TABLE wp_siddur_abj404_view_build
    ADD INDEX idx_status_disabled (status, disabled),
    ADD INDEX idx_pub_url (published_status, url(190)),
    ADD INDEX idx_pub_status (published_status, status),
    ADD INDEX idx_pub_type (published_status, type),
    ADD INDEX idx_pub_code (published_status, code),
    ADD INDEX idx_pub_score (published_status, score),
    ADD INDEX idx_pub_timestamp (published_status, timestamp),
    ADD INDEX idx_pub_logshits (published_status, logshits),
    ADD INDEX idx_pub_last_used (published_status, last_used),
    ADD INDEX idx_pub_dest (published_status, final_dest(190))

    /* ------------------ /░░░/░░░/░░░/░░░/wp-content/plugins/404-solution/includes/sql/getRedirectsForViewStaged/10_index_sort.sql END ----- */
    made by do_action_ref_array('abj404_rebuildViewDone'), WP_Hook->do_action, WP_Hook->apply_filters, abj404_rebuildViewDoneListener, ABJ_404_Solution_DataAccess->rebuildViewDoneInBackground, ABJ_404_Solution_DataAccess->runStagedBuildOnce, ABJ_404_Solution_DataAccess->runNonBatchedStageWithKillStreakEscape, ABJ_404_Solution_DataAccess->runTimedViewBuildStage, ABJ_404_Solution_DataAccess->{closure:ABJ_404_Solution_DataAccess_ViewQueriesStagedTrait::runStagedBuildOnce():1442}, ABJ_404_Solution_DataAccess->stageAddSortIndexes, ABJ_404_Solution_DataAccess->runStagedSqlFileTolerantOfDuplicateKey, ABJ_404_Solution_DataAccess->runStagedSqlFile, ABJ_404_Solution_DataAccess->queryAndGetResults
    [15-May-2026 03:19:55 UTC] WordPress database error Table '░░░░░░.wp░░░_abj404_view_build' doesn't exist for query SET STATEMENT max_statement_time=60 FOR RENAME TABLE wp_siddur_abj404_view_done TO wp_siddur_abj404_view_deleteme, wp_siddur_abj404_view_build TO wp_siddur_abj404_view_done made by do_action_ref_array('abj404_rebuildViewDone'), WP_Hook->do_action, WP_Hook->apply_filters, abj404_rebuildViewDoneListener, ABJ_404_Solution_DataAccess->rebuildViewDoneInBackground, ABJ_404_Solution_DataAccess->runStagedBuildOnce, ABJ_404_Solution_DataAccess->runTimedViewBuildStage, ABJ_404_Solution_DataAccess->{closure:ABJ_404_Solution_DataAccess_ViewQueriesStagedTrait::runStagedBuildOnce():1455}, ABJ_404_Solution_DataAccess->stageRenameSwap, ABJ_404_Solution_DataAccess->queryAndGetResults
    • This reply was modified 2 weeks, 2 days ago by Aharon.
    Plugin Author Aaron

    (@aaron13100)

    Hey Aharon, thank you for the report. Version 4.2.0 was released today. The larger rewriting project is not done yet and has a long way to go. This version was released now to possibly fix the ongoing issue for you. If 4.1.17 is working for you though, there is no functional change in 4.2.0 so you can safely wait for the next release.

Viewing 7 replies - 1 through 7 (of 7 total)

You must be logged in to reply to this topic.