Make WordPress Core

Opened 2 years ago

Closed 22 months ago

Last modified 22 months ago

#24800 closed defect (bug) (fixed)

DROP TABLE error 1051 (Unknown table)

Reported by: soulseekah Owned by: nacin
Milestone: 3.9 Priority: normal
Severity: normal Version:
Component: Unit Tests Keywords: has-patch
Focuses: Cc:


When dropping a table via $wpdb->query the query is rewritten to its temporary counterpart DROP TEMPORARY TABLE.


However, all CREATE TABLE queries are not rewritten to CREATE TEMPORARY TABLE, so when the time comes the database shoves an error into the face of anyone who's trying to drop a table.

This is currently only relevant to custom tests extending from the WP_UnitTestCase class.

Attachments (4)

24800.tests.diff (577 bytes) - added by soulseekah 2 years ago.
24800.diff (933 bytes) - added by soulseekah 2 years ago.
24800.2.diff (1.6 KB) - added by nacin 2 years ago.
24800.3.diff (697 bytes) - added by jdgrimes 22 months ago.

Download all attachments as: .zip

Change History (12)

#1 @soulseekah
2 years ago

Again, just to clarify: the issue is in the WP_UnitTestCase, which doesn't allow custom code to CREATE and DROP tables. This is relevant for custom plugin and theme tests making use of the provided WordPress test case class.

2 years ago

2 years ago

#2 @nacin
2 years ago

The create filter wasn't as careful as the drop filter, as it was working on only dbDelta creation queries, not any queries that go through $wpdb.

24800.2.diff (untested) makes both filters much more careful.

#3 @soulseekah
2 years ago

Related tests seem to pass fine (unrelated current failing tests reside in XMLRPC, formats and media).

#4 follow-up: @nacin
22 months ago

  • Owner set to nacin
  • Resolution set to fixed
  • Status changed from new to closed

In 27041:

Test framework: Parse CREATE TABLE queries the same way we do DROP TABLE queries.

props soulseekah.
fixes #24800.

#5 in reply to: ↑ 4 @jdgrimes
22 months ago

  • Resolution fixed deleted
  • Status changed from closed to reopened

Replying to nacin:

In 27041:

Test framework: Parse CREATE TABLE queries the same way we do DROP TABLE queries.

props soulseekah.
fixes #24800.

This has broken some things. I noticed that some unit tests for one of my plugins were giving strange results. In one unit test for multisite, a blog would be created using $this->factory->blog->create(). Then stuff would fly apart in the next unit test, because for some reason the changes were being committed instead of rolled-back by MySQL. I eventually traced this down to the fact that the CREATE TABLE queries for new a new blog will have a leading newline. That is causing the CREATE TABLE query not to be converted to a CREATE TEMPORARY TABLE query. And a CREATE TABLE query will automatically cause a commit. It worked before, because it was a simple str_replace(). Now it will ignore the query if there is leading whitespace.

I'll attach a patch with a possible fix.

Last edited 22 months ago by jdgrimes (previous) (diff)

22 months ago

#6 @jdgrimes
22 months ago

  • Keywords has-patch added

Also, note that the names of these functions were changed (the plural was dropped), so anybody who is hacking them (e.g., for testing plugin install/uninstall), will have to update.

#7 @nacin
22 months ago

  • Resolution set to fixed
  • Status changed from reopened to closed

In 27086:

Test suite: Trim queries before deciding whether to create temporary tables.

props jdgrimes.
fixes #24800.

#8 @nacin
22 months ago

  • Milestone changed from Awaiting Review to 3.9

I chose to trim() inside the checks because then we would not be trimming the whitespace off all queries, only CREATE/DROP TABLE ones. The second trim is not a problem as it'll only run for these kinds of queries.

Note: See TracTickets for help on using tickets.