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
d0603db7
Commit
d0603db7
authored
Mar 15, 2005
by
patg@krsna
Browse files
Options
Browse Files
Download
Plain Diff
Merge pgalbraith@bk-internal.mysql.com:/home/bk/mysql-5.0
into krsna.:/home/patg/test/mysql-5.0
parents
ce564b2d
24bc8624
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
416 additions
and
42 deletions
+416
-42
BitKeeper/etc/logging_ok
BitKeeper/etc/logging_ok
+1
-0
mysql-test/r/federated.result
mysql-test/r/federated.result
+114
-2
mysql-test/t/federated.test
mysql-test/t/federated.test
+146
-18
sql/ha_federated.cc
sql/ha_federated.cc
+155
-22
No files found.
BitKeeper/etc/logging_ok
View file @
d0603db7
...
@@ -182,6 +182,7 @@ ndbdev@shark.
...
@@ -182,6 +182,7 @@ ndbdev@shark.
nick@mysql.com
nick@mysql.com
nick@nick.leippe.com
nick@nick.leippe.com
papa@gbichot.local
papa@gbichot.local
patg@krsna.
patg@krsna.patg.net
patg@krsna.patg.net
patg@patrick-galbraiths-computer.local
patg@patrick-galbraiths-computer.local
patg@pc248.lfp.kcls.org
patg@pc248.lfp.kcls.org
...
...
mysql-test/r/federated.result
View file @
d0603db7
...
@@ -8,6 +8,120 @@ stop slave;
...
@@ -8,6 +8,120 @@ stop slave;
DROP DATABASE IF EXISTS federated;
DROP DATABASE IF EXISTS federated;
CREATE DATABASE federated;
CREATE DATABASE federated;
CREATE TABLE federated.t1 (
CREATE TABLE federated.t1 (
`id` int(20) NOT NULL,
`name` varchar(32) NOT NULL default ''
)
DEFAULT CHARSET=latin1;
DROP DATABASE IF EXISTS federated;
CREATE DATABASE federated;
CREATE TABLE federated.t1 (
`id` int(20) NOT NULL,
`name` varchar(32) NOT NULL default ''
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
COMMENT='mysql://root@127.0.0.1:@/too/many/items/federated/t1';
ERROR HY000: Can't create table 'this connection string is not in the correct format!
' (errno: 0)
CREATE TABLE federated.t1 (
`id` int(20) NOT NULL,
`name` varchar(32) NOT NULL default ''
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
COMMENT='mysql://root@127.0.0.1';
ERROR HY000: Can't create table 'this connection string is not in the correct format!
' (errno: 0)
CREATE TABLE federated.t1 (
`id` int(20) NOT NULL,
`name` varchar(32) NOT NULL default ''
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
COMMENT='mysql://root@127.0.0.1:SLAVE_PORT/federated/t3';
ERROR HY000: Error running query on master: foreign table 't3' does not exist!
CREATE TABLE federated.t1 (
`id` int(20) NOT NULL,
`name` varchar(32) NOT NULL default ''
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
COMMENT='mysql://user:pass@127.0.0.1:SLAVE_PORT/federated/t1';
ERROR 08S01: Error connecting to master: unable to connect to database 'federated' on host '127.0.0.1 as user 'user' !
DROP TABLE IF EXISTS federated.t1;
Warnings:
Note 1051 Unknown table 't1'
CREATE TABLE federated.t1 (
`id` int(20) NOT NULL,
`name` varchar(32) NOT NULL default ''
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
COMMENT='mysql://root@127.0.0.1:SLAVE_PORT/federated/t1';
INSERT INTO federated.t1 (id, name) VALUES (1, 'foo');
INSERT INTO federated.t1 (id, name) VALUES (2, 'fee');
SELECT * FROM federated.t1;
id name
1 foo
2 fee
DELETE FROM federated.t1;
DROP TABLE federated.t1;
DROP TABLE IF EXISTS federated.t2;
Warnings:
Note 1051 Unknown table 't2'
CREATE TABLE federated.t2 (
`id` int(20) NOT NULL,
`name` varchar(32) NOT NULL default ''
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
COMMENT='mysql://root@127.0.0.1:SLAVE_PORT/federated/t1';
INSERT INTO federated.t2 (id, name) VALUES (1, 'foo');
INSERT INTO federated.t2 (id, name) VALUES (2, 'fee');
SELECT * FROM federated.t2;
id name
1 foo
2 fee
DROP TABLE federated.t2;
DROP TABLE IF EXISTS federated.t1;
DROP TABLE IF EXISTS federated.`t1%`;
Warnings:
Note 1051 Unknown table 't1%'
CREATE TABLE federated.`t1%` (
`id` int(20) NOT NULL,
`name` varchar(32) NOT NULL default ''
)
DEFAULT CHARSET=latin1;
DROP TABLE IF EXISTS federated.t1;
Warnings:
Note 1051 Unknown table 't1'
CREATE TABLE federated.t1 (
`id` int(20) NOT NULL,
`name` varchar(32) NOT NULL default ''
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
COMMENT='mysql://root@127.0.0.1:SLAVE_PORT/federated/t1%';
INSERT INTO federated.t1 (id, name) VALUES (1, 'foo');
INSERT INTO federated.t1 (id, name) VALUES (2, 'fee');
SELECT * FROM federated.t1;
id name
1 foo
2 fee
DELETE FROM federated.t1;
DROP TABLE IF EXISTS federated.t1;
CREATE TABLE federated.`t1%` (
`id` int(20) NOT NULL,
`name` varchar(32) NOT NULL default ''
)
ENGINE="FEDERATED" DEFAULT CHARSET=latin1
COMMENT='mysql://root@127.0.0.1:9308/federated/t1%';
INSERT INTO federated.`t1%` (id, name) VALUES (1, 'foo');
INSERT INTO federated.`t1%` (id, name) VALUES (2, 'fee');
SELECT * FROM federated.`t1%`;
id name
1 foo
2 fee
DELETE FROM federated.`t1%`;
DROP TABLE IF EXISTS federated.`t1%`;
DROP TABLE IF EXISTS federated.`t1%`;
DROP TABLE IF EXISTS federated.t1;
Warnings:
Note 1051 Unknown table 't1'
CREATE TABLE federated.t1 (
`id` int(20) NOT NULL auto_increment,
`id` int(20) NOT NULL auto_increment,
`name` varchar(32) NOT NULL default '',
`name` varchar(32) NOT NULL default '',
`other` int(20) NOT NULL default '0',
`other` int(20) NOT NULL default '0',
...
@@ -16,8 +130,6 @@ PRIMARY KEY (`id`),
...
@@ -16,8 +130,6 @@ PRIMARY KEY (`id`),
KEY `name` (`name`),
KEY `name` (`name`),
KEY `other_key` (`other`))
KEY `other_key` (`other`))
DEFAULT CHARSET=latin1;
DEFAULT CHARSET=latin1;
DROP DATABASE IF EXISTS federated;
CREATE DATABASE federated;
CREATE TABLE federated.t1 (
CREATE TABLE federated.t1 (
`id` int(20) NOT NULL auto_increment,
`id` int(20) NOT NULL auto_increment,
`name` varchar(32) NOT NULL default '',
`name` varchar(32) NOT NULL default '',
...
...
mysql-test/t/federated.test
View file @
d0603db7
...
@@ -14,7 +14,136 @@ DROP DATABASE IF EXISTS federated;
...
@@ -14,7 +14,136 @@ DROP DATABASE IF EXISTS federated;
--
enable_warnings
--
enable_warnings
CREATE
DATABASE
federated
;
CREATE
DATABASE
federated
;
CREATE
TABLE
federated
.
t1
(
`id`
int
(
20
)
NOT
NULL
,
`name`
varchar
(
32
)
NOT
NULL
default
''
)
DEFAULT
CHARSET
=
latin1
;
connection
master
;
--
disable_warnings
DROP
DATABASE
IF
EXISTS
federated
;
--
enable_warnings
CREATE
DATABASE
federated
;
# test too many items (malformed) in the comment string url
--
error
1005
eval
CREATE
TABLE
federated
.
t1
(
`id`
int
(
20
)
NOT
NULL
,
`name`
varchar
(
32
)
NOT
NULL
default
''
)
ENGINE
=
"FEDERATED"
DEFAULT
CHARSET
=
latin1
COMMENT
=
'mysql://root@127.0.0.1:@/too/many/items/federated/t1'
;
# test not enough items (malformed) in the comment string url
--
error
1005
eval
CREATE
TABLE
federated
.
t1
(
`id`
int
(
20
)
NOT
NULL
,
`name`
varchar
(
32
)
NOT
NULL
default
''
)
ENGINE
=
"FEDERATED"
DEFAULT
CHARSET
=
latin1
COMMENT
=
'mysql://root@127.0.0.1'
;
# test non-existant table
--
replace_result
$SLAVE_MYPORT
SLAVE_PORT
--
error
1219
eval
CREATE
TABLE
federated
.
t1
(
`id`
int
(
20
)
NOT
NULL
,
`name`
varchar
(
32
)
NOT
NULL
default
''
)
ENGINE
=
"FEDERATED"
DEFAULT
CHARSET
=
latin1
COMMENT
=
'mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t3'
;
# test bad user/password
--
replace_result
$SLAVE_MYPORT
SLAVE_PORT
--
error
1218
eval
CREATE
TABLE
federated
.
t1
(
`id`
int
(
20
)
NOT
NULL
,
`name`
varchar
(
32
)
NOT
NULL
default
''
)
ENGINE
=
"FEDERATED"
DEFAULT
CHARSET
=
latin1
COMMENT
=
'mysql://user:pass@127.0.0.1:$SLAVE_MYPORT/federated/t1'
;
DROP
TABLE
IF
EXISTS
federated
.
t1
;
# # correct connection, same named tables
--
replace_result
$SLAVE_MYPORT
SLAVE_PORT
eval
CREATE
TABLE
federated
.
t1
(
`id`
int
(
20
)
NOT
NULL
,
`name`
varchar
(
32
)
NOT
NULL
default
''
)
ENGINE
=
"FEDERATED"
DEFAULT
CHARSET
=
latin1
COMMENT
=
'mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1'
;
INSERT
INTO
federated
.
t1
(
id
,
name
)
VALUES
(
1
,
'foo'
);
INSERT
INTO
federated
.
t1
(
id
,
name
)
VALUES
(
2
,
'fee'
);
SELECT
*
FROM
federated
.
t1
;
DELETE
FROM
federated
.
t1
;
DROP
TABLE
federated
.
t1
;
# correct connection, differently named tables
DROP
TABLE
IF
EXISTS
federated
.
t2
;
--
replace_result
$SLAVE_MYPORT
SLAVE_PORT
eval
CREATE
TABLE
federated
.
t2
(
`id`
int
(
20
)
NOT
NULL
,
`name`
varchar
(
32
)
NOT
NULL
default
''
)
ENGINE
=
"FEDERATED"
DEFAULT
CHARSET
=
latin1
COMMENT
=
'mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1'
;
INSERT
INTO
federated
.
t2
(
id
,
name
)
VALUES
(
1
,
'foo'
);
INSERT
INTO
federated
.
t2
(
id
,
name
)
VALUES
(
2
,
'fee'
);
SELECT
*
FROM
federated
.
t2
;
DROP
TABLE
federated
.
t2
;
connection
slave
;
DROP
TABLE
IF
EXISTS
federated
.
t1
;
DROP
TABLE
IF
EXISTS
federated
.
`t1%`
;
CREATE
TABLE
federated
.
`t1%`
(
`id`
int
(
20
)
NOT
NULL
,
`name`
varchar
(
32
)
NOT
NULL
default
''
)
DEFAULT
CHARSET
=
latin1
;
connection
master
;
DROP
TABLE
IF
EXISTS
federated
.
t1
;
--
replace_result
$SLAVE_MYPORT
SLAVE_PORT
eval
CREATE
TABLE
federated
.
t1
(
`id`
int
(
20
)
NOT
NULL
,
`name`
varchar
(
32
)
NOT
NULL
default
''
)
ENGINE
=
"FEDERATED"
DEFAULT
CHARSET
=
latin1
COMMENT
=
'mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1%'
;
INSERT
INTO
federated
.
t1
(
id
,
name
)
VALUES
(
1
,
'foo'
);
INSERT
INTO
federated
.
t1
(
id
,
name
)
VALUES
(
2
,
'fee'
);
SELECT
*
FROM
federated
.
t1
;
DELETE
FROM
federated
.
t1
;
DROP
TABLE
IF
EXISTS
federated
.
t1
;
eval
CREATE
TABLE
federated
.
`t1%`
(
`id`
int
(
20
)
NOT
NULL
,
`name`
varchar
(
32
)
NOT
NULL
default
''
)
ENGINE
=
"FEDERATED"
DEFAULT
CHARSET
=
latin1
COMMENT
=
'mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1%'
;
INSERT
INTO
federated
.
`t1%`
(
id
,
name
)
VALUES
(
1
,
'foo'
);
INSERT
INTO
federated
.
`t1%`
(
id
,
name
)
VALUES
(
2
,
'fee'
);
SELECT
*
FROM
federated
.
`t1%`
;
DELETE
FROM
federated
.
`t1%`
;
DROP
TABLE
IF
EXISTS
federated
.
`t1%`
;
connection
slave
;
DROP
TABLE
IF
EXISTS
federated
.
`t1%`
;
# I wanted to use timestamp, but results will fail if so!!!
# I wanted to use timestamp, but results will fail if so!!!
DROP
TABLE
IF
EXISTS
federated
.
t1
;
CREATE
TABLE
federated
.
t1
(
CREATE
TABLE
federated
.
t1
(
`id`
int
(
20
)
NOT
NULL
auto_increment
,
`id`
int
(
20
)
NOT
NULL
auto_increment
,
`name`
varchar
(
32
)
NOT
NULL
default
''
,
`name`
varchar
(
32
)
NOT
NULL
default
''
,
...
@@ -25,12 +154,8 @@ CREATE TABLE federated.t1 (
...
@@ -25,12 +154,8 @@ CREATE TABLE federated.t1 (
KEY
`other_key`
(
`other`
))
KEY
`other_key`
(
`other`
))
DEFAULT
CHARSET
=
latin1
;
DEFAULT
CHARSET
=
latin1
;
connection
master
;
--
disable_warnings
DROP
DATABASE
IF
EXISTS
federated
;
--
enable_warnings
CREATE
DATABASE
federated
;
connection
master
;
--
replace_result
$SLAVE_MYPORT
SLAVE_PORT
--
replace_result
$SLAVE_MYPORT
SLAVE_PORT
eval
CREATE
TABLE
federated
.
t1
(
eval
CREATE
TABLE
federated
.
t1
(
`id`
int
(
20
)
NOT
NULL
auto_increment
,
`id`
int
(
20
)
NOT
NULL
auto_increment
,
...
@@ -660,33 +785,36 @@ INSERT INTO federated.t1 VALUES (0x0001);
...
@@ -660,33 +785,36 @@ INSERT INTO federated.t1 VALUES (0x0001);
INSERT
INTO
federated
.
t1
VALUES
(
0x0100
);
INSERT
INTO
federated
.
t1
VALUES
(
0x0100
);
SELECT
HEX
(
a
)
FROM
federated
.
t1
;
SELECT
HEX
(
a
)
FROM
federated
.
t1
;
# # simple tests for cyrillic, given to me by
#
TODO
#
DROP TABLE IF EXISTS federated.t1;
#
#
--replace_result $SLAVE_MYPORT SLAVE_PORT
#
CREATE TABLE federated.t1
#
eval CREATE TABLE federated.t1
# (a char(20)) charset=cp1251
# (a char(20)) charset=cp1251
# ENGINE="FEDERATED" COMMENT="mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1";
# ENGINE="FEDERATED" COMMENT="mysql://root@127.0.0.1:$SLAVE_MYPORT/federated/t1";
#
#
#
# connection slave;
# connection slave;
# DROP TABLE IF EXISTS federated.t1;
# DROP TABLE IF EXISTS federated.t1;
# CREATE TABLE federated.t1 (a char(20)) charset=cp1251;
# CREATE TABLE federated.t1 (a char(20)) charset=cp1251;
#
#
#
# connection master;
# connection master;
# INSERT INTO federated.t1 values (_cp1251'--1');
# INSERT INTO federated.t1 values (_cp1251'--1');
# INSERT INTO federated.t1 values (_cp1251'--2');
# INSERT INTO federated.t1 values (_cp1251'--2');
# SELECT * FROM federated.t1;
# SET names cp1251;
# SET names cp1251;
# INSERT INTO federated.t1 values ('--3');
# INSERT INTO federated.t1 values ('--3');
# INSERT INTO federated.t1 values ('-Ũ-4');
# INSERT INTO federated.t1 values ('-Ũ-4');
# SELECT * FROM federated.t1;
# SELECT * FROM federated.t1;
#
select
hex(a) from federated.t1;
#
SELECT
hex(a) from federated.t1;
#
select
hex(a) from federated.t1 ORDER BY a desc;
#
SELECT
hex(a) from federated.t1 ORDER BY a desc;
#
update
federated.t1 SET a='--1' WHERE a='--1';
#
UPDATE
federated.t1 SET a='--1' WHERE a='--1';
# SELECT * FROM federated.t1;
# SELECT * FROM federated.t1;
# DELETE FROM federated.t1 WHERE a='-Ũ-4';
# DELETE FROM federated.t1 WHERE a='-Ũ-4';
# SELECT * FROM federated.t1;
# SELECT * FROM federated.t1;
# DELETE FROM federated.t1 WHERE a>'-';
# DELETE FROM federated.t1 WHERE a>'-';
# SELECT * FROM federated.t1;
# SELECT * FROM federated.t1;
# SET names default;
# SET names default;
# DROP TABLE IF EXISTS federated.t1;
#
#
# DROP TABLE IF EXISTS federated.t1;
# DROP TABLE IF EXISTS federated.t1;
#
#
...
...
sql/ha_federated.cc
View file @
d0603db7
...
@@ -414,6 +414,99 @@ bool federated_db_end()
...
@@ -414,6 +414,99 @@ bool federated_db_end()
return
FALSE
;
return
FALSE
;
}
}
/*
Check (in create) whether the tables exists, and that it can be connected to
SYNOPSIS
check_foreign_data_source()
share pointer to FEDERATED share
DESCRIPTION
This method first checks that the connection information that parse url
has populated into the share will be sufficient to connect to the foreign
table, and if so, does the foreign table exist.
*/
static
int
check_foreign_data_source
(
FEDERATED_SHARE
*
share
)
{
char
escaped_table_base_name
[
IO_SIZE
];
MYSQL
*
mysql
;
MYSQL_RES
*
result
=
0
;
uint
error_code
;
char
query_buffer
[
IO_SIZE
];
char
error_buffer
[
IO_SIZE
];
String
query
(
query_buffer
,
sizeof
(
query_buffer
),
&
my_charset_bin
);
DBUG_ENTER
(
"ha_federated::check_foreign_data_source"
);
query
.
length
(
0
);
/* error out if we can't alloc memory for mysql_init(NULL) (per Georg) */
if
(
!
(
mysql
=
mysql_init
(
NULL
)))
{
DBUG_RETURN
(
HA_ERR_OUT_OF_MEM
);
}
/* check if we can connect */
if
(
!
mysql_real_connect
(
mysql
,
share
->
hostname
,
share
->
username
,
share
->
password
,
share
->
database
,
share
->
port
,
share
->
socket
,
0
))
{
my_sprintf
(
error_buffer
,
(
error_buffer
,
"unable to connect to database '%s' on host '%s as user '%s' !"
,
share
->
database
,
share
->
hostname
,
share
->
username
));
error_code
=
ER_CONNECT_TO_MASTER
;
goto
error
;
}
else
{
/*
Note: I am not using INORMATION_SCHEMA because this needs to work with < 5.0
if we can connect, then make sure the table exists
*/
query
.
append
(
"SHOW TABLES LIKE '"
);
escape_string_for_mysql
(
&
my_charset_bin
,
(
char
*
)
escaped_table_base_name
,
share
->
table_base_name
,
share
->
table_base_name_length
);
query
.
append
(
escaped_table_base_name
);
query
.
append
(
"'"
);
error_code
=
ER_QUERY_ON_MASTER
;
if
(
mysql_real_query
(
mysql
,
query
.
ptr
(),
query
.
length
()))
goto
error
;
result
=
mysql_store_result
(
mysql
);
if
(
!
result
)
goto
error
;
/* if ! mysql_num_rows, the table doesn't exist, send error */
if
(
!
mysql_num_rows
(
result
))
{
my_sprintf
(
error_buffer
,
(
error_buffer
,
"foreign table '%s' does not exist!"
,
share
->
table_base_name
));
goto
error
;
}
mysql_free_result
(
result
);
result
=
0
;
mysql_close
(
mysql
);
}
DBUG_RETURN
(
0
);
error:
if
(
result
)
mysql_free_result
(
result
);
mysql_close
(
mysql
);
my_error
(
error_code
,
MYF
(
0
),
error_buffer
);
DBUG_RETURN
(
error_code
);
}
/*
/*
Parse connection info from table->s->comment
Parse connection info from table->s->comment
...
@@ -521,6 +614,8 @@ static int parse_url(FEDERATED_SHARE *share, TABLE *table,
...
@@ -521,6 +614,8 @@ static int parse_url(FEDERATED_SHARE *share, TABLE *table,
}
}
else
else
goto
error
;
goto
error
;
share
->
table_base_name_length
=
strlen
(
share
->
table_base_name
);
}
}
else
else
goto
error
;
goto
error
;
...
@@ -545,6 +640,17 @@ static int parse_url(FEDERATED_SHARE *share, TABLE *table,
...
@@ -545,6 +640,17 @@ static int parse_url(FEDERATED_SHARE *share, TABLE *table,
share
->
scheme
,
share
->
username
,
share
->
password
,
share
->
scheme
,
share
->
username
,
share
->
password
,
share
->
hostname
,
share
->
port
,
share
->
database
,
share
->
hostname
,
share
->
port
,
share
->
database
,
share
->
table_base_name
));
share
->
table_base_name
));
/* If creation, check first if we can connect and that the table exists */
/*if (table_create_flag)
{
if (check_foreign_data_source(share))
goto error;
*/
/* free share->schema even if no error, since this is a create */
/*
my_free((gptr) share->scheme, MYF(0));
}*/
}
}
else
else
goto
error
;
goto
error
;
...
@@ -561,6 +667,7 @@ static int parse_url(FEDERATED_SHARE *share, TABLE *table,
...
@@ -561,6 +667,7 @@ static int parse_url(FEDERATED_SHARE *share, TABLE *table,
}
}
/*
/*
Convert MySQL result set row to handler internal format
Convert MySQL result set row to handler internal format
...
@@ -778,15 +885,14 @@ static FEDERATED_SHARE *get_share(const char *table_name, TABLE *table)
...
@@ -778,15 +885,14 @@ static FEDERATED_SHARE *get_share(const char *table_name, TABLE *table)
table_name_length
)))
table_name_length
)))
{
{
query
.
set_charset
(
system_charset_info
);
query
.
set_charset
(
system_charset_info
);
query
.
append
(
"SELECT * FROM "
);
query
.
append
(
"SELECT * FROM `"
);
query
.
append
(
table_base_name
);
if
(
!
(
share
=
(
FEDERATED_SHARE
*
)
if
(
!
(
share
=
(
FEDERATED_SHARE
*
)
my_multi_malloc
(
MYF
(
MY_WME
|
MY_ZEROFILL
),
my_multi_malloc
(
MYF
(
MY_WME
|
MY_ZEROFILL
),
&
share
,
sizeof
(
*
share
),
&
share
,
sizeof
(
*
share
),
&
tmp_table_name
,
table_name_length
+
1
,
&
tmp_table_name
,
table_name_length
+
1
,
&
tmp_table_base_name
,
table_base_name_length
+
1
,
&
select_query
,
query
.
length
()
+
&
select_query
,
query
.
length
()
+
1
,
NullS
)))
strlen
(
table
->
s
->
comment
)
+
1
,
NullS
)))
{
{
pthread_mutex_unlock
(
&
federated_mutex
);
pthread_mutex_unlock
(
&
federated_mutex
);
return
NULL
;
return
NULL
;
...
@@ -795,14 +901,13 @@ static FEDERATED_SHARE *get_share(const char *table_name, TABLE *table)
...
@@ -795,14 +901,13 @@ static FEDERATED_SHARE *get_share(const char *table_name, TABLE *table)
if
(
parse_url
(
share
,
table
,
0
))
if
(
parse_url
(
share
,
table
,
0
))
goto
error
;
goto
error
;
query
.
append
(
share
->
table_base_name
);
query
.
append
(
"`"
);
share
->
use_count
=
0
;
share
->
use_count
=
0
;
share
->
table_name_length
=
table_name_length
;
share
->
table_name_length
=
table_name_length
;
share
->
table_name
=
tmp_table_name
;
share
->
table_name
=
tmp_table_name
;
share
->
table_base_name_length
=
table_base_name_length
;
share
->
table_base_name
=
tmp_table_base_name
;
share
->
select_query
=
select_query
;
share
->
select_query
=
select_query
;
strmov
(
share
->
table_name
,
table_name
);
strmov
(
share
->
table_name
,
table_name
);
strmov
(
share
->
table_base_name
,
table_base_name
);
strmov
(
share
->
select_query
,
query
.
ptr
());
strmov
(
share
->
select_query
,
query
.
ptr
());
DBUG_PRINT
(
"ha_federated::get_share"
,
DBUG_PRINT
(
"ha_federated::get_share"
,
(
"share->select_query %s"
,
share
->
select_query
));
(
"share->select_query %s"
,
share
->
select_query
));
...
@@ -820,7 +925,6 @@ static FEDERATED_SHARE *get_share(const char *table_name, TABLE *table)
...
@@ -820,7 +925,6 @@ static FEDERATED_SHARE *get_share(const char *table_name, TABLE *table)
pthread_mutex_unlock
(
&
federated_mutex
);
pthread_mutex_unlock
(
&
federated_mutex
);
if
(
share
->
scheme
)
if
(
share
->
scheme
)
my_free
((
gptr
)
share
->
scheme
,
MYF
(
0
));
my_free
((
gptr
)
share
->
scheme
,
MYF
(
0
));
VOID
(
pthread_mutex_destroy
(
&
share
->
mutex
));
my_free
((
gptr
)
share
,
MYF
(
0
));
my_free
((
gptr
)
share
,
MYF
(
0
));
return
NULL
;
return
NULL
;
...
@@ -1016,6 +1120,8 @@ int ha_federated::write_row(byte *buf)
...
@@ -1016,6 +1120,8 @@ int ha_federated::write_row(byte *buf)
insert_field_value_string
.
length
(
0
);
insert_field_value_string
.
length
(
0
);
DBUG_ENTER
(
"ha_federated::write_row"
);
DBUG_ENTER
(
"ha_federated::write_row"
);
DBUG_PRINT
(
"ha_federated::write_row"
,
(
"table charset name %s csname %s"
,
table
->
s
->
table_charset
->
name
,
table
->
s
->
table_charset
->
csname
));
statistic_increment
(
table
->
in_use
->
status_var
.
ha_write_count
,
&
LOCK_status
);
statistic_increment
(
table
->
in_use
->
status_var
.
ha_write_count
,
&
LOCK_status
);
if
(
table
->
timestamp_field_type
&
TIMESTAMP_AUTO_SET_ON_INSERT
)
if
(
table
->
timestamp_field_type
&
TIMESTAMP_AUTO_SET_ON_INSERT
)
...
@@ -1031,8 +1137,9 @@ int ha_federated::write_row(byte *buf)
...
@@ -1031,8 +1137,9 @@ int ha_federated::write_row(byte *buf)
current_query_id
));
current_query_id
));
/* start off our string */
/* start off our string */
insert_string
.
append
(
"INSERT INTO "
);
insert_string
.
append
(
"INSERT INTO
`
"
);
insert_string
.
append
(
share
->
table_base_name
);
insert_string
.
append
(
share
->
table_base_name
);
insert_string
.
append
(
"`"
);
/* start both our field and field values strings */
/* start both our field and field values strings */
insert_string
.
append
(
" ("
);
insert_string
.
append
(
" ("
);
values_string
.
append
(
" VALUES ("
);
values_string
.
append
(
" VALUES ("
);
...
@@ -1056,7 +1163,7 @@ int ha_federated::write_row(byte *buf)
...
@@ -1056,7 +1163,7 @@ int ha_federated::write_row(byte *buf)
for
(
field
=
table
->
field
;
*
field
;
field
++
,
x
++
)
for
(
field
=
table
->
field
;
*
field
;
field
++
,
x
++
)
{
{
DBUG_PRINT
(
"ha_federated::write_row"
,
(
"field type %d"
,
(
*
field
)
->
type
()));
DBUG_PRINT
(
"ha_federated::write_row"
,
(
"field type %d"
,
(
*
field
)
->
type
()));
/
/ if there is a query id and if it's equal to the current query id
/
* if there is a query id and if it's equal to the current query id */
if
(((
*
field
)
->
query_id
&&
(
*
field
)
->
query_id
==
current_query_id
)
if
(((
*
field
)
->
query_id
&&
(
*
field
)
->
query_id
==
current_query_id
)
||
all_fields_have_same_query_id
)
||
all_fields_have_same_query_id
)
{
{
...
@@ -1076,8 +1183,7 @@ int ha_federated::write_row(byte *buf)
...
@@ -1076,8 +1183,7 @@ int ha_federated::write_row(byte *buf)
current_query_id
,
(
*
field
)
->
query_id
));
current_query_id
,
(
*
field
)
->
query_id
));
(
*
field
)
->
val_str
(
&
insert_field_value_string
);
(
*
field
)
->
val_str
(
&
insert_field_value_string
);
/* quote these fields if they require it */
/* quote these fields if they require it */
(
*
field
)
->
quote_data
(
&
insert_field_value_string
);
(
*
field
)
->
quote_data
(
&
insert_field_value_string
);
}
}
/* append the field name */
/* append the field name */
insert_string
.
append
((
*
field
)
->
field_name
);
insert_string
.
append
((
*
field
)
->
field_name
);
...
@@ -1162,20 +1268,19 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
...
@@ -1162,20 +1268,19 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
/* stores the value to be replaced of the field were are updating */
/* stores the value to be replaced of the field were are updating */
String
old_field_value
(
old_field_value_buffer
,
sizeof
(
old_field_value_buffer
),
String
old_field_value
(
old_field_value_buffer
,
sizeof
(
old_field_value_buffer
),
&
my_charset_bin
);
&
my_charset_bin
);
old_field_value
.
length
(
0
);
/* stores the new value of the field */
/* stores the new value of the field */
String
new_field_value
(
new_field_value_buffer
,
sizeof
(
new_field_value_buffer
),
String
new_field_value
(
new_field_value_buffer
,
sizeof
(
new_field_value_buffer
),
&
my_charset_bin
);
&
my_charset_bin
);
new_field_value
.
length
(
0
);
/* stores the update query */
/* stores the update query */
String
update_string
(
update_buffer
,
sizeof
(
update_buffer
),
&
my_charset_bin
);
String
update_string
(
update_buffer
,
sizeof
(
update_buffer
),
&
my_charset_bin
);
update_string
.
length
(
0
);
/* stores the WHERE clause */
/* stores the WHERE clause */
String
where_string
(
where_buffer
,
sizeof
(
where_buffer
),
&
my_charset_bin
);
String
where_string
(
where_buffer
,
sizeof
(
where_buffer
),
&
my_charset_bin
);
where_string
.
length
(
0
);
DBUG_ENTER
(
"ha_federated::update_row"
);
DBUG_ENTER
(
"ha_federated::update_row"
);
old_field_value
.
length
(
0
);
new_field_value
.
length
(
0
);
update_string
.
length
(
0
);
where_string
.
length
(
0
);
has_a_primary_key
=
(
table
->
s
->
primary_key
==
0
?
1
:
0
);
has_a_primary_key
=
(
table
->
s
->
primary_key
==
0
?
1
:
0
);
primary_key_field_num
=
has_a_primary_key
?
primary_key_field_num
=
has_a_primary_key
?
...
@@ -1183,8 +1288,9 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
...
@@ -1183,8 +1288,9 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
if
(
has_a_primary_key
)
if
(
has_a_primary_key
)
DBUG_PRINT
(
"ha_federated::update_row"
,
(
"has a primary key"
));
DBUG_PRINT
(
"ha_federated::update_row"
,
(
"has a primary key"
));
update_string
.
append
(
"UPDATE "
);
update_string
.
append
(
"UPDATE
`
"
);
update_string
.
append
(
share
->
table_base_name
);
update_string
.
append
(
share
->
table_base_name
);
update_string
.
append
(
"`"
);
update_string
.
append
(
" SET "
);
update_string
.
append
(
" SET "
);
/*
/*
...
@@ -1312,8 +1418,9 @@ int ha_federated::delete_row(const byte *buf)
...
@@ -1312,8 +1418,9 @@ int ha_federated::delete_row(const byte *buf)
DBUG_ENTER
(
"ha_federated::delete_row"
);
DBUG_ENTER
(
"ha_federated::delete_row"
);
delete_string
.
append
(
"DELETE FROM "
);
delete_string
.
append
(
"DELETE FROM
`
"
);
delete_string
.
append
(
share
->
table_base_name
);
delete_string
.
append
(
share
->
table_base_name
);
delete_string
.
append
(
"`"
);
delete_string
.
append
(
" WHERE "
);
delete_string
.
append
(
" WHERE "
);
for
(
Field
**
field
=
table
->
field
;
*
field
;
field
++
,
x
++
)
for
(
Field
**
field
=
table
->
field
;
*
field
;
field
++
,
x
++
)
...
@@ -1395,6 +1502,7 @@ int ha_federated::index_read_idx(byte *buf, uint index, const byte *key,
...
@@ -1395,6 +1502,7 @@ int ha_federated::index_read_idx(byte *buf, uint index, const byte *key,
sql_query
.
length
(
0
);
sql_query
.
length
(
0
);
DBUG_ENTER
(
"ha_federated::index_read_idx"
);
DBUG_ENTER
(
"ha_federated::index_read_idx"
);
statistic_increment
(
table
->
in_use
->
status_var
.
ha_read_key_count
,
statistic_increment
(
table
->
in_use
->
status_var
.
ha_read_key_count
,
&
LOCK_status
);
&
LOCK_status
);
...
@@ -1576,6 +1684,16 @@ int ha_federated::rnd_next(byte *buf)
...
@@ -1576,6 +1684,16 @@ int ha_federated::rnd_next(byte *buf)
MYSQL_ROW
row
;
MYSQL_ROW
row
;
DBUG_ENTER
(
"ha_federated::rnd_next"
);
DBUG_ENTER
(
"ha_federated::rnd_next"
);
if
(
result
==
0
)
{
/*
Return value of rnd_init is not always checked (see records.cc),
so we can get here _even_ if there is _no_ pre-fetched result-set!
TODO: fix it.
*/
DBUG_RETURN
(
1
);
}
/* Fetch a row, insert it back in a row format. */
/* Fetch a row, insert it back in a row format. */
current_position
=
result
->
data_cursor
;
current_position
=
result
->
data_cursor
;
DBUG_PRINT
(
"ha_federated::rnd_next"
,
DBUG_PRINT
(
"ha_federated::rnd_next"
,
...
@@ -1716,8 +1834,9 @@ int ha_federated::delete_all_rows()
...
@@ -1716,8 +1834,9 @@ int ha_federated::delete_all_rows()
query
.
length
(
0
);
query
.
length
(
0
);
query
.
set_charset
(
system_charset_info
);
query
.
set_charset
(
system_charset_info
);
query
.
append
(
"TRUNCATE "
);
query
.
append
(
"TRUNCATE
`
"
);
query
.
append
(
share
->
table_base_name
);
query
.
append
(
share
->
table_base_name
);
query
.
append
(
"`"
);
if
(
mysql_real_query
(
mysql
,
query
.
ptr
(),
query
.
length
()))
if
(
mysql_real_query
(
mysql
,
query
.
ptr
(),
query
.
length
()))
{
{
...
@@ -1803,14 +1922,28 @@ THR_LOCK_DATA **ha_federated::store_lock(THD *thd,
...
@@ -1803,14 +1922,28 @@ THR_LOCK_DATA **ha_federated::store_lock(THD *thd,
int
ha_federated
::
create
(
const
char
*
name
,
TABLE
*
table_arg
,
int
ha_federated
::
create
(
const
char
*
name
,
TABLE
*
table_arg
,
HA_CREATE_INFO
*
create_info
)
HA_CREATE_INFO
*
create_info
)
{
{
int
connection_error
=
0
;
FEDERATED_SHARE
tmp
;
FEDERATED_SHARE
tmp
;
DBUG_ENTER
(
"ha_federated::create"
);
DBUG_ENTER
(
"ha_federated::create"
);
if
(
parse_url
(
&
tmp
,
table_arg
,
1
))
if
(
parse_url
(
&
tmp
,
table_arg
,
1
))
{
{
my_error
(
ER_CANT_CREATE_TABLE
,
MYF
(
0
));
my_error
(
ER_CANT_CREATE_TABLE
,
MYF
(
0
),
name
,
1
);
DBUG_RETURN
(
ER_CANT_CREATE_TABLE
);
goto
error
;
}
if
((
connection_error
=
check_foreign_data_source
(
&
tmp
)))
{
my_error
(
connection_error
,
MYF
(
0
),
name
,
1
);
goto
error
;
}
}
my_free
((
gptr
)
tmp
.
scheme
,
MYF
(
0
));
my_free
((
gptr
)
tmp
.
scheme
,
MYF
(
0
));
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
error:
DBUG_PRINT
(
"ha_federated::create"
,
(
"errors, returning %d"
,
ER_CANT_CREATE_TABLE
));
my_free
((
gptr
)
tmp
.
scheme
,
MYF
(
0
));
DBUG_RETURN
(
ER_CANT_CREATE_TABLE
);
}
}
#endif
/* HAVE_FEDERATED_DB */
#endif
/* HAVE_FEDERATED_DB */
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