Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
3e3edcfa
Commit
3e3edcfa
authored
Oct 12, 2007
by
sunny
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Prevent loading of tables that have unsupported features most notably
FTS indexes.
parent
b48d3b66
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
63 additions
and
42 deletions
+63
-42
dict/dict0load.c
dict/dict0load.c
+47
-33
handler/ha_innodb.cc
handler/ha_innodb.cc
+12
-7
include/db0err.h
include/db0err.h
+4
-2
No files found.
dict/dict0load.c
View file @
3e3edcfa
...
...
@@ -551,11 +551,13 @@ dict_load_fields(
Loads definitions for table indexes. Adds them to the data dictionary
cache. */
static
ibool
ulint
dict_load_indexes
(
/*==============*/
/* out: TRUE if ok, FALSE if corruption
of dictionary table */
/* out: DB_SUCCESS if ok, DB_CORRUPTION
if corruption of dictionary table or
DB_UNSUPPORTED if table has unknown index
type */
dict_table_t
*
table
,
/* in: table */
mem_heap_t
*
heap
)
/* in: memory heap for temporary storage */
{
...
...
@@ -578,6 +580,7 @@ dict_load_indexes(
ibool
is_sys_table
;
dulint
id
;
mtr_t
mtr
;
ulint
error
=
DB_SUCCESS
;
ut_ad
(
mutex_own
(
&
(
dict_sys
->
mutex
)));
...
...
@@ -624,10 +627,8 @@ dict_load_indexes(
dict_load_report_deleted_index
(
table
->
name
,
ULINT_UNDEFINED
);
btr_pcur_close
(
&
pcur
);
mtr_commit
(
&
mtr
);
return
(
FALSE
);
error
=
DB_CORRUPTION
;
goto
func_exit
;
}
field
=
rec_get_nth_field_old
(
rec
,
1
,
&
len
);
...
...
@@ -653,7 +654,18 @@ dict_load_indexes(
field
=
rec_get_nth_field_old
(
rec
,
8
,
&
len
);
page_no
=
mach_read_from_4
(
field
);
if
(
page_no
==
FIL_NULL
)
{
/* We check for unsupported types first, so that the
subsequent checks are relevant for the supported types. */
if
(
type
&
~
(
DICT_CLUSTERED
|
DICT_UNIQUE
))
{
fprintf
(
stderr
,
"InnoDB: Error: unknown type %lu"
" of index %s of table %s
\n
"
,
(
ulong
)
type
,
name_buf
,
table
->
name
);
error
=
DB_UNSUPPORTED
;
goto
func_exit
;
}
else
if
(
page_no
==
FIL_NULL
)
{
fprintf
(
stderr
,
"InnoDB: Error: trying to load index %s"
...
...
@@ -661,14 +673,10 @@ dict_load_indexes(
"InnoDB: but the index tree has been freed!
\n
"
,
name_buf
,
table
->
name
);
btr_pcur_close
(
&
pcur
);
mtr_commit
(
&
mtr
);
return
(
FALSE
);
}
if
((
type
&
DICT_CLUSTERED
)
==
0
&&
NULL
==
dict_table_get_first_index
(
table
))
{
error
=
DB_CORRUPTION
;
goto
func_exit
;
}
else
if
((
type
&
DICT_CLUSTERED
)
==
0
&&
NULL
==
dict_table_get_first_index
(
table
))
{
fprintf
(
stderr
,
"InnoDB: Error: trying to load index %s"
...
...
@@ -677,18 +685,14 @@ dict_load_indexes(
" is not clustered!
\n
"
,
name_buf
,
table
->
name
);
btr_pcur_close
(
&
pcur
);
mtr_commit
(
&
mtr
);
return
(
FALSE
);
}
if
(
is_sys_table
&&
((
type
&
DICT_CLUSTERED
)
||
((
table
==
dict_sys
->
sys_tables
)
&&
(
name_len
==
(
sizeof
"ID_IND"
)
-
1
)
&&
(
0
==
ut_memcmp
(
name_buf
,
"ID_IND"
,
name_len
)))))
{
error
=
DB_CORRUPTION
;
goto
func_exit
;
}
else
if
(
is_sys_table
&&
((
type
&
DICT_CLUSTERED
)
||
((
table
==
dict_sys
->
sys_tables
)
&&
(
name_len
==
(
sizeof
"ID_IND"
)
-
1
)
&&
(
0
==
ut_memcmp
(
name_buf
,
"ID_IND"
,
name_len
)))))
{
/* The index was created in memory already at booting
of the database server */
...
...
@@ -704,10 +708,11 @@ dict_load_indexes(
btr_pcur_move_to_next_user_rec
(
&
pcur
,
&
mtr
);
}
func_exit:
btr_pcur_close
(
&
pcur
);
mtr_commit
(
&
mtr
);
return
(
TRUE
);
return
(
error
);
}
/************************************************************************
...
...
@@ -857,11 +862,20 @@ dict_load_table(
mem_heap_empty
(
heap
);
dict_load_indexes
(
table
,
heap
);
err
=
dict_load_foreigns
(
table
->
name
,
TRUE
);
err
=
dict_load_indexes
(
table
,
heap
);
/* If the force recovery flag is set, we open the table irrespective
of the error condition, since the user may want to dump data from the
clustered index. However we load the foreign key information only if
all indexes were loaded. */
if
(
err
!=
DB_SUCCESS
&&
!
srv_force_recovery
)
{
dict_mem_table_free
(
table
);
table
=
NULL
;
}
else
if
(
err
==
DB_SUCCESS
)
{
err
=
dict_load_foreigns
(
table
->
name
,
TRUE
);
}
#if 0
if (err != DB_SUCCESS) {
if (err != DB_SUCCESS
&& table != NULL
) {
mutex_enter(&dict_foreign_err_mutex);
...
...
handler/ha_innodb.cc
View file @
3e3edcfa
...
...
@@ -2334,13 +2334,18 @@ ha_innobase::open(
if
(
NULL
==
ib_table
)
{
ut_print_timestamp
(
stderr
);
sql_print_error
(
"Cannot find table %s from the internal data "
"dictionary
\n
of InnoDB though the .frm file "
"for the table exists. Maybe you
\n
have "
"deleted and recreated InnoDB data files but "
"have forgotten
\n
to delete the corresponding "
".frm files of InnoDB tables, or you
\n
"
"have moved .frm files to another database?
\n
"
sql_print_error
(
"Cannot find or open table %s from
\n
"
"the internal data dictionary of InnoDB "
"though the .frm file for the
\n
"
"table exists. Maybe you have deleted and "
"recreated InnoDB data
\n
"
"files but have forgotten to delete the "
"corresponding .frm files
\n
"
"of InnoDB tables, or you have moved .frm "
"files to another database?
\n
"
"or, the table contains indexes that this "
"version of the engine
\n
"
"doesn't support.
\n
"
"See http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html
\n
"
"how you can resolve the problem.
\n
"
,
norm_name
);
...
...
include/db0err.h
View file @
3e3edcfa
...
...
@@ -61,12 +61,14 @@ Created 5/24/1996 Heikki Tuuri
activated by the operation would
lead to a duplicate key in some
table */
#define DB_TOO_MANY_CONCURRENT_TRXS 47
/* when InnoDB runs out of the
preconfigured undo slots, this can
only happen when there are too many
concurrent transactions */
#define DB_UNSUPPORTED 48
/* when InnoDB sees any artefact or
a feature that it can't recoginize or
work with e.g., FT indexes created by
a later version of the engine. */
/* The following are partial failure codes */
#define DB_FAIL 1000
#define DB_OVERFLOW 1001
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment