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
73c1578f
Commit
73c1578f
authored
Jun 20, 2005
by
msvensson@neptunus.(none)
Browse files
Options
Browse Files
Download
Plain Diff
Merge neptunus.(none):/home/msvensson/mysql/mysql-4.1
into neptunus.(none):/home/msvensson/mysql/bug10365
parents
a152d291
4602b180
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
124 additions
and
81 deletions
+124
-81
mysql-test/r/ndb_autodiscover.result
mysql-test/r/ndb_autodiscover.result
+17
-3
mysql-test/t/ndb_autodiscover.test
mysql-test/t/ndb_autodiscover.test
+21
-0
ndb/test/ndbapi/create_tab.cpp
ndb/test/ndbapi/create_tab.cpp
+1
-1
sql/ha_ndbcluster.cc
sql/ha_ndbcluster.cc
+12
-13
sql/ha_ndbcluster.h
sql/ha_ndbcluster.h
+2
-1
sql/handler.cc
sql/handler.cc
+46
-49
sql/handler.h
sql/handler.h
+2
-3
sql/sql_base.cc
sql/sql_base.cc
+13
-3
sql/sql_table.cc
sql/sql_table.cc
+10
-8
No files found.
mysql-test/r/ndb_autodiscover.result
View file @
73c1578f
...
...
@@ -93,7 +93,7 @@ name char(20), a int, b float, c char(24)
ERROR 42S01: Table 't3' already exists
show status like 'handler_discover%';
Variable_name Value
Handler_discover
1
Handler_discover
0
create table IF NOT EXISTS t3(
id int not null primary key,
id2 int not null,
...
...
@@ -101,7 +101,7 @@ name char(20)
) engine=ndb;
show status like 'handler_discover%';
Variable_name Value
Handler_discover
2
Handler_discover
0
SHOW CREATE TABLE t3;
Table Create Table
t3 CREATE TABLE `t3` (
...
...
@@ -114,7 +114,7 @@ id name
1 Explorer
show status like 'handler_discover%';
Variable_name Value
Handler_discover
2
Handler_discover
1
drop table t3;
flush status;
create table t7(
...
...
@@ -358,6 +358,20 @@ Database
mysql
test
use test;
CREATE TABLE sys.SYSTAB_0 (a int);
ERROR 42S01: Table 'SYSTAB_0' already exists
select * from sys.SYSTAB_0;
ERROR HY000: Failed to open 'SYSTAB_0', error while unpacking from engine
CREATE TABLE IF NOT EXISTS sys.SYSTAB_0 (a int);
show warnings;
Level Code Message
select * from sys.SYSTAB_0;
ERROR HY000: Failed to open 'SYSTAB_0', error while unpacking from engine
drop table sys.SYSTAB_0;
ERROR 42S02: Unknown table 'SYSTAB_0'
drop table IF EXISTS sys.SYSTAB_0;
Warnings:
Note 1051 Unknown table 'SYSTAB_0'
CREATE TABLE t9 (
a int NOT NULL PRIMARY KEY,
b int
...
...
mysql-test/t/ndb_autodiscover.test
View file @
73c1578f
...
...
@@ -453,6 +453,27 @@ drop database test2;
show
databases
;
use
test
;
#####################################################
# Test that it's not possible to create tables
# with same name as NDB internal tables
# This will also test that it's not possible to create
# a table with tha same name as a table that can't be
# discovered( for example a table created via NDBAPI)
--
error
1050
CREATE
TABLE
sys
.
SYSTAB_0
(
a
int
);
--
error
1105
select
*
from
sys
.
SYSTAB_0
;
CREATE
TABLE
IF
NOT
EXISTS
sys
.
SYSTAB_0
(
a
int
);
show
warnings
;
--
error
1105
select
*
from
sys
.
SYSTAB_0
;
--
error
1051
drop
table
sys
.
SYSTAB_0
;
drop
table
IF
EXISTS
sys
.
SYSTAB_0
;
######################################################
# Note! This should always be the last step in this
# file, the table t9 will be used and dropped
...
...
ndb/test/ndbapi/create_tab.cpp
View file @
73c1578f
...
...
@@ -77,8 +77,8 @@ int main(int argc, const char** argv){
*/
// Connect to Ndb
Ndb
::
setConnectString
(
_connectstr
);
Ndb
MyNdb
(
"TEST_DB"
);
MyNdb
.
setConnectString
(
_connectstr
);
if
(
MyNdb
.
init
()
!=
0
){
ERR
(
MyNdb
.
getNdbError
());
...
...
sql/ha_ndbcluster.cc
View file @
73c1578f
...
...
@@ -4300,7 +4300,7 @@ int ndbcluster_discover(THD* thd, const char *db, const char *name,
{
const
NdbError
err
=
dict
->
getNdbError
();
if
(
err
.
code
==
709
)
DBUG_RETURN
(
1
);
DBUG_RETURN
(
-
1
);
ERR_RETURN
(
err
);
}
DBUG_PRINT
(
"info"
,
(
"Found table %s"
,
tab
->
getName
()));
...
...
@@ -4308,13 +4308,15 @@ int ndbcluster_discover(THD* thd, const char *db, const char *name,
len
=
tab
->
getFrmLength
();
if
(
len
==
0
||
tab
->
getFrmData
()
==
NULL
)
{
DBUG_PRINT
(
"No frm data found"
,
(
"Table is probably created via NdbApi"
));
DBUG_RETURN
(
2
);
DBUG_PRINT
(
"error"
,
(
"No frm data found."
));
DBUG_RETURN
(
1
);
}
if
(
unpackfrm
(
&
data
,
&
len
,
tab
->
getFrmData
()))
DBUG_RETURN
(
3
);
{
DBUG_PRINT
(
"error"
,
(
"Could not unpack table"
));
DBUG_RETURN
(
1
);
}
*
frmlen
=
len
;
*
frmblob
=
data
;
...
...
@@ -4327,13 +4329,13 @@ int ndbcluster_discover(THD* thd, const char *db, const char *name,
*/
int
ndbcluster_table_exists
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
)
int
ndbcluster_table_exists
_in_engine
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
)
{
uint
len
;
const
void
*
data
;
const
NDBTAB
*
tab
;
Ndb
*
ndb
;
DBUG_ENTER
(
"ndbcluster_table_exists"
);
DBUG_ENTER
(
"ndbcluster_table_exists
_in_engine
"
);
DBUG_PRINT
(
"enter"
,
(
"db: %s, name: %s"
,
db
,
name
));
if
(
!
(
ndb
=
check_ndb_in_thd
(
thd
)))
...
...
@@ -4512,7 +4514,7 @@ int ndbcluster_find_files(THD *thd,const char *db,const char *path,
DBUG_PRINT
(
"info"
,
(
"%s existed on disk"
,
name
));
// The .ndb file exists on disk, but it's not in list of tables in ndb
// Verify that handler agrees table is gone.
if
(
ndbcluster_table_exists
(
thd
,
db
,
file_name
)
==
0
)
if
(
ndbcluster_table_exists
_in_engine
(
thd
,
db
,
file_name
)
==
0
)
{
DBUG_PRINT
(
"info"
,
(
"NDB says %s does not exists"
,
file_name
));
it
.
remove
();
...
...
@@ -4563,7 +4565,7 @@ int ndbcluster_find_files(THD *thd,const char *db,const char *path,
while
((
file_name
=
it2
++
))
{
DBUG_PRINT
(
"info"
,
(
"Table %s need discovery"
,
name
));
if
(
ha_create_table_from_engine
(
thd
,
db
,
file_name
,
TRUE
)
==
0
)
if
(
ha_create_table_from_engine
(
thd
,
db
,
file_name
)
==
0
)
files
->
push_back
(
thd
->
strdup
(
file_name
));
}
...
...
@@ -4639,11 +4641,8 @@ bool ndbcluster_init()
pthread_mutex_init
(
&
ndbcluster_mutex
,
MY_MUTEX_INIT_FAST
);
ndbcluster_inited
=
1
;
#ifdef USE_DISCOVER_ON_STARTUP
if
(
ndb_discover_tables
()
!=
0
)
goto
ndbcluster_init_error
;
#endif
DBUG_RETURN
(
FALSE
);
ndbcluster_init_error:
ndbcluster_end
();
DBUG_RETURN
(
TRUE
);
...
...
sql/ha_ndbcluster.h
View file @
73c1578f
...
...
@@ -275,7 +275,8 @@ int ndbcluster_discover(THD* thd, const char* dbname, const char* name,
const
void
**
frmblob
,
uint
*
frmlen
);
int
ndbcluster_find_files
(
THD
*
thd
,
const
char
*
db
,
const
char
*
path
,
const
char
*
wild
,
bool
dir
,
List
<
char
>
*
files
);
int
ndbcluster_table_exists
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
);
int
ndbcluster_table_exists_in_engine
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
);
int
ndbcluster_drop_database
(
const
char
*
path
);
void
ndbcluster_print_error
(
int
error
,
const
NdbOperation
*
error_op
);
sql/handler.cc
View file @
73c1578f
...
...
@@ -1336,21 +1336,19 @@ int ha_create_table(const char *name, HA_CREATE_INFO *create_info,
}
/*
Try to discover table from engine and
Try to discover table from engine and
if found, write the frm file to disk.
RETURN VALUES:
0 : Table existed in engine and created
on disk if so requested
1 : Table does not exist
>1 : error
-1 : Table did not exists
0 : Table created ok
> 0 : Error, table existed but could not be created
*/
int
ha_create_table_from_engine
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
,
bool
create_if_found
)
int
ha_create_table_from_engine
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
)
{
int
error
;
const
void
*
frmblob
;
...
...
@@ -1359,45 +1357,47 @@ int ha_create_table_from_engine(THD* thd,
HA_CREATE_INFO
create_info
;
TABLE
table
;
DBUG_ENTER
(
"ha_create_table_from_engine"
);
DBUG_PRINT
(
"enter"
,
(
"name '%s'.'%s'
create_if_found: %d
"
,
db
,
name
,
create_if_found
));
DBUG_PRINT
(
"enter"
,
(
"name '%s'.'%s'"
,
db
,
name
));
bzero
((
char
*
)
&
create_info
,
sizeof
(
create_info
));
if
((
error
=
ha_discover
(
thd
,
db
,
name
,
&
frmblob
,
&
frmlen
)))
DBUG_RETURN
(
error
);
if
(
error
=
ha_discover
(
thd
,
db
,
name
,
&
frmblob
,
&
frmlen
))
{
// Table could not be discovered and thus not created
DBUG_RETURN
(
error
);
}
/*
Table exists in handler
frmblob and frmlen are set
Table exists in handler
and could be discovered
frmblob and frmlen are set
, write the frm to disk
*/
if
(
create_if_found
)
(
void
)
strxnmov
(
path
,
FN_REFLEN
,
mysql_data_home
,
"/"
,
db
,
"/"
,
name
,
NullS
);
// Save the frm file
if
(
writefrm
(
path
,
frmblob
,
frmlen
))
{
(
void
)
strxnmov
(
path
,
FN_REFLEN
,
mysql_data_home
,
"/"
,
db
,
"/"
,
name
,
NullS
);
// Save the frm file
if
((
error
=
writefrm
(
path
,
frmblob
,
frmlen
)))
goto
err_end
;
my_free
((
char
*
)
frmblob
,
MYF
(
MY_ALLOW_ZERO_PTR
));
DBUG_RETURN
(
2
);
}
if
(
openfrm
(
path
,
""
,
0
,(
uint
)
READ_ALL
,
0
,
&
table
))
DBUG_RETURN
(
1
);
if
(
openfrm
(
path
,
""
,
0
,(
uint
)
READ_ALL
,
0
,
&
table
))
DBUG_RETURN
(
3
);
update_create_info_from_table
(
&
create_info
,
&
table
);
create_info
.
table_options
|=
HA_CREATE_FROM_ENGINE
;
update_create_info_from_table
(
&
create_info
,
&
table
);
create_info
.
table_options
|=
HA_CREATE_FROM_ENGINE
;
if
(
lower_case_table_names
==
2
&&
!
(
table
.
file
->
table_flags
()
&
HA_FILE_BASED
))
{
/* Ensure that handler gets name in lower case */
my_casedn_str
(
files_charset_info
,
path
);
}
error
=
table
.
file
->
create
(
path
,
&
table
,
&
create_info
);
VOID
(
closefrm
(
&
table
));
if
(
lower_case_table_names
==
2
&&
!
(
table
.
file
->
table_flags
()
&
HA_FILE_BASED
))
{
/* Ensure that handler gets name in lower case */
my_casedn_str
(
files_charset_info
,
path
);
}
err_end:
error
=
table
.
file
->
create
(
path
,
&
table
,
&
create_info
);
VOID
(
closefrm
(
&
table
));
my_free
((
char
*
)
frmblob
,
MYF
(
MY_ALLOW_ZERO_PTR
));
DBUG_RETURN
(
error
);
DBUG_RETURN
(
error
!=
0
);
}
static
int
NEAR_F
delete_file
(
const
char
*
name
,
const
char
*
ext
,
int
extflag
)
...
...
@@ -1507,14 +1507,15 @@ int ha_change_key_cache(KEY_CACHE *old_key_cache,
Try to discover one table from handler(s)
RETURN
0 ok. In this case *frmblob and *frmlen are set
1 error. frmblob and frmlen may not be set
-1 : Table did not exists
0 : OK. In this case *frmblob and *frmlen are set
>0 : error. frmblob and frmlen may not be set
*/
int
ha_discover
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
,
const
void
**
frmblob
,
uint
*
frmlen
)
{
int
error
=
1
;
// Table does not exist in any handler
int
error
=
-
1
;
// Table does not exist in any handler
DBUG_ENTER
(
"ha_discover"
);
DBUG_PRINT
(
"enter"
,
(
"db: %s, name: %s"
,
db
,
name
));
#ifdef HAVE_NDBCLUSTER_DB
...
...
@@ -1546,11 +1547,8 @@ ha_find_files(THD *thd,const char *db,const char *path,
error
=
ndbcluster_find_files
(
thd
,
db
,
path
,
wild
,
dir
,
files
);
#endif
DBUG_RETURN
(
error
);
}
#ifdef NOT_YET_USED
/*
Ask handler if the table exists in engine
...
...
@@ -1561,20 +1559,19 @@ ha_find_files(THD *thd,const char *db,const char *path,
# Error code
*/
int
ha_table_exists
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
)
int
ha_table_exists
_in_engine
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
)
{
int
error
=
2
;
DBUG_ENTER
(
"ha_table_exists"
);
int
error
=
0
;
DBUG_ENTER
(
"ha_table_exists
_in_engine
"
);
DBUG_PRINT
(
"enter"
,
(
"db: %s, name: %s"
,
db
,
name
));
#ifdef HAVE_NDBCLUSTER_DB
if
(
have_ndbcluster
==
SHOW_OPTION_YES
)
error
=
ndbcluster_table_exists
(
thd
,
db
,
name
);
error
=
ndbcluster_table_exists
_in_engine
(
thd
,
db
,
name
);
#endif
DBUG_PRINT
(
"exit"
,
(
"error: %d"
,
error
));
DBUG_RETURN
(
error
);
}
#endif
/*
Read first row between two ranges.
...
...
sql/handler.h
View file @
73c1578f
...
...
@@ -547,8 +547,7 @@ enum db_type ha_checktype(enum db_type database_type);
my_bool
ha_storage_engine_is_enabled
(
enum
db_type
database_type
);
int
ha_create_table
(
const
char
*
name
,
HA_CREATE_INFO
*
create_info
,
bool
update_create_info
);
int
ha_create_table_from_engine
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
,
bool
create_if_found
);
int
ha_create_table_from_engine
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
);
int
ha_delete_table
(
enum
db_type
db_type
,
const
char
*
path
);
void
ha_drop_database
(
char
*
path
);
int
ha_init_key_cache
(
const
char
*
name
,
KEY_CACHE
*
key_cache
);
...
...
@@ -574,6 +573,6 @@ int ha_discover(THD* thd, const char* dbname, const char* name,
const
void
**
frmblob
,
uint
*
frmlen
);
int
ha_find_files
(
THD
*
thd
,
const
char
*
db
,
const
char
*
path
,
const
char
*
wild
,
bool
dir
,
List
<
char
>*
files
);
int
ha_table_exists
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
);
int
ha_table_exists
_in_engine
(
THD
*
thd
,
const
char
*
db
,
const
char
*
name
);
TYPELIB
*
ha_known_exts
(
void
);
int
ha_start_consistent_snapshot
(
THD
*
thd
);
sql/sql_base.cc
View file @
73c1578f
...
...
@@ -1375,9 +1375,19 @@ static int open_unireg_entry(THD *thd, TABLE *entry, const char *db,
trying to discover the table at the same time.
*/
if
(
discover_retry_count
++
!=
0
)
goto
err
;
if
(
ha_create_table_from_engine
(
thd
,
db
,
name
,
TRUE
)
!=
0
)
goto
err
;
goto
err
;
if
(
ha_create_table_from_engine
(
thd
,
db
,
name
)
>
0
)
{
/* Give right error message */
thd
->
clear_error
();
DBUG_PRINT
(
"error"
,
(
"Dicovery of %s/%s failed"
,
db
,
name
));
my_printf_error
(
ER_UNKNOWN_ERROR
,
"Failed to open '%-.64s', error while "
"unpacking from engine"
,
MYF
(
0
),
name
);
goto
err
;
}
thd
->
clear_error
();
// Clear error message
continue
;
...
...
sql/sql_table.cc
View file @
73c1578f
...
...
@@ -244,15 +244,18 @@ int mysql_rm_table_part2(THD *thd, TABLE_LIST *tables, bool if_exists,
/* remove form file and isam files */
build_table_path
(
path
,
sizeof
(
path
),
db
,
alias
,
reg_ext
);
}
if
(
drop_temporary
||
(
access
(
path
,
F_OK
)
&&
ha_create_table_from_engine
(
thd
,
db
,
alias
,
TRUE
)))
if
(
drop_temporary
||
(
access
(
path
,
F_OK
)
&&
ha_create_table_from_engine
(
thd
,
db
,
alias
)))
{
// Table was not found on disk and table can't be created from engine
if
(
if_exists
)
push_warning_printf
(
thd
,
MYSQL_ERROR
::
WARN_LEVEL_NOTE
,
ER_BAD_TABLE_ERROR
,
ER
(
ER_BAD_TABLE_ERROR
),
table
->
real_name
);
else
error
=
1
;
error
=
1
;
}
else
{
...
...
@@ -1394,15 +1397,14 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
{
bool
create_if_not_exists
=
create_info
->
options
&
HA_LEX_CREATE_IF_NOT_EXISTS
;
if
(
!
ha_create_table_from_engine
(
thd
,
db
,
table_name
,
create_if_not_exists
))
if
(
ha_table_exists_in_engine
(
thd
,
db
,
table_name
))
{
DBUG_PRINT
(
"info"
,
(
"Table already existed in handler"
));
DBUG_PRINT
(
"info"
,
(
"Table
with same name
already existed in handler"
));
if
(
create_if_not_exists
)
{
create_info
->
table_existed
=
1
;
// Mark that table existed
error
=
0
;
create_info
->
table_existed
=
1
;
// Mark that table existed
error
=
0
;
}
else
my_error
(
ER_TABLE_EXISTS_ERROR
,
MYF
(
0
),
table_name
);
...
...
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