1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-07 00:04:31 +03:00

MDEV-30118 exception in ha_maria::extra

I have not been able to repeat the problem, but the stack trace indicates
that ha_maria::extra() is called with a null file pointer.

This indicates the table has either never been opened or opened and closed,
with file pointer set to NULL, but ha_maria::extra() is still called.

In JOIN::partial_cleanup() we are only checking of table->is_created(),
which will fail if table was created and later closed.

Fixed by clearing table->created if table is dropped.

I added an assert to is_created() to catch the case that the create
flag does not match 'file'.
This commit is contained in:
Monty
2022-12-13 12:43:19 +02:00
parent 92ff7bb63f
commit d0cd49497f
2 changed files with 12 additions and 1 deletions

View File

@@ -20320,6 +20320,8 @@ free_tmp_table(THD *thd, TABLE *entry)
} }
entry->file->ha_drop_table(entry->s->path.str); entry->file->ha_drop_table(entry->s->path.str);
delete entry->file; delete entry->file;
entry->file= NULL;
entry->reset_created();
} }
/* free blobs */ /* free blobs */

View File

@@ -1643,7 +1643,11 @@ public:
} }
/// Return true if table is instantiated, and false otherwise. /// Return true if table is instantiated, and false otherwise.
bool is_created() const { return created; } bool is_created() const
{
DBUG_ASSERT(!created || file != 0);
return created;
}
/** /**
Set the table as "created", and enable flags in storage engine Set the table as "created", and enable flags in storage engine
@@ -1658,6 +1662,11 @@ public:
created= true; created= true;
} }
void reset_created()
{
created= 0;
}
/* /*
Returns TRUE if the table is filled at execution phase (and so, the Returns TRUE if the table is filled at execution phase (and so, the
optimizer must not do anything that depends on the contents of the table, optimizer must not do anything that depends on the contents of the table,