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
8bd2c37d
Commit
8bd2c37d
authored
Mar 09, 2006
by
msvensson@neptunus.(none)
Browse files
Options
Browse Files
Download
Plain Diff
Merge bk-internal:/home/bk/mysql-5.1-new
into neptunus.(none):/home/msvensson/mysql/mysql-5.1
parents
e316aa6d
bdd57aee
Changes
17
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
497 additions
and
151 deletions
+497
-151
mysql-test/include/show_binlog_events.inc
mysql-test/include/show_binlog_events.inc
+4
-0
mysql-test/r/ndb_binlog_ddl_multi.result
mysql-test/r/ndb_binlog_ddl_multi.result
+67
-2
mysql-test/t/ndb_binlog_ddl_multi.test
mysql-test/t/ndb_binlog_ddl_multi.test
+54
-20
sql/ha_ndbcluster.cc
sql/ha_ndbcluster.cc
+6
-4
sql/ha_ndbcluster.h
sql/ha_ndbcluster.h
+2
-1
sql/ha_ndbcluster_binlog.cc
sql/ha_ndbcluster_binlog.cc
+202
-94
storage/ndb/include/ndbapi/NdbBlob.hpp
storage/ndb/include/ndbapi/NdbBlob.hpp
+4
-0
storage/ndb/include/ndbapi/NdbOperation.hpp
storage/ndb/include/ndbapi/NdbOperation.hpp
+1
-1
storage/ndb/include/ndbapi/NdbScanOperation.hpp
storage/ndb/include/ndbapi/NdbScanOperation.hpp
+1
-1
storage/ndb/src/ndbapi/NdbBlob.cpp
storage/ndb/src/ndbapi/NdbBlob.cpp
+99
-18
storage/ndb/src/ndbapi/NdbBlobImpl.hpp
storage/ndb/src/ndbapi/NdbBlobImpl.hpp
+2
-0
storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp
storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp
+39
-3
storage/ndb/src/ndbapi/NdbOperationSearch.cpp
storage/ndb/src/ndbapi/NdbOperationSearch.cpp
+3
-2
storage/ndb/src/ndbapi/NdbRecAttr.cpp
storage/ndb/src/ndbapi/NdbRecAttr.cpp
+1
-1
storage/ndb/src/ndbapi/NdbScanOperation.cpp
storage/ndb/src/ndbapi/NdbScanOperation.cpp
+9
-2
storage/ndb/src/ndbapi/ndberror.c
storage/ndb/src/ndbapi/ndberror.c
+2
-1
storage/ndb/test/ndbapi/testBlobs.cpp
storage/ndb/test/ndbapi/testBlobs.cpp
+1
-1
No files found.
mysql-test/include/show_binlog_events.inc
0 → 100644
View file @
8bd2c37d
--
let
$binlog_start
=
102
--
replace_result
$binlog_start
<
binlog_start
>
--
replace_column
2
# 4 # 5 #
--
eval
show
binlog
events
from
$binlog_start
mysql-test/r/ndb_binlog_ddl_multi.result
View file @
8bd2c37d
drop database if exists mysqltest;
drop table if exists t1,t2;
drop table if exists t1,t2
,t3
;
drop database if exists mysqltest;
drop table if exists t1,t2;
drop table if exists t1,t2
,t3
;
reset master;
reset master;
create database mysqltest;
...
...
@@ -123,3 +123,68 @@ master-bin1.000001 # Table_map # # cluster.apply_status
master-bin1.000001 # Write_rows # #
master-bin1.000001 # Query # # COMMIT
master-bin1.000001 # Query # # use `test`; drop table `t1`
reset master;
show tables;
Tables_in_test
reset master;
show tables;
Tables_in_test
create table t1 (a int key) engine=ndb;
create table t2 (a int key) engine=ndb;
create table t3 (a int key) engine=ndb;
rename table t3 to t4, t2 to t3, t1 to t2, t4 to t1;
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
master-bin1.000001 # Query # # use `test`; create table t1 (a int key) engine=ndb
master-bin1.000001 # Query # # use `test`; create table t2 (a int key) engine=ndb
master-bin1.000001 # Query # # use `test`; create table t3 (a int key) engine=ndb
master-bin1.000001 # Query # # BEGIN
master-bin1.000001 # Table_map # # cluster.apply_status
master-bin1.000001 # Write_rows # #
master-bin1.000001 # Query # # COMMIT
master-bin1.000001 # Query # # use `test`; rename table `test.t3` to `test.t4`
master-bin1.000001 # Query # # BEGIN
master-bin1.000001 # Table_map # # cluster.apply_status
master-bin1.000001 # Write_rows # #
master-bin1.000001 # Query # # COMMIT
master-bin1.000001 # Query # # use `test`; rename table `test.t2` to `test.t3`
master-bin1.000001 # Query # # BEGIN
master-bin1.000001 # Table_map # # cluster.apply_status
master-bin1.000001 # Write_rows # #
master-bin1.000001 # Query # # COMMIT
master-bin1.000001 # Query # # use `test`; rename table `test.t1` to `test.t2`
master-bin1.000001 # Query # # BEGIN
master-bin1.000001 # Table_map # # cluster.apply_status
master-bin1.000001 # Write_rows # #
master-bin1.000001 # Query # # COMMIT
master-bin1.000001 # Query # # use `test`; rename table `test.t4` to `test.t1`
drop table t1;
drop table t2;
drop table t3;
reset master;
show tables;
Tables_in_test
reset master;
show tables;
Tables_in_test
create table t1 (a int key) engine=ndb;
insert into t1 values(1);
rename table t1 to t2;
insert into t2 values(2);
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
master-bin1.000001 # Query # # use `test`; create table t1 (a int key) engine=ndb
master-bin1.000001 # Query # # BEGIN
master-bin1.000001 # Table_map # # cluster.apply_status
master-bin1.000001 # Write_rows # #
master-bin1.000001 # Table_map # # test.t1
master-bin1.000001 # Write_rows # #
master-bin1.000001 # Query # # COMMIT
master-bin1.000001 # Query # # use `test`; rename table `test.t1` to `test.t2`
master-bin1.000001 # Query # # BEGIN
master-bin1.000001 # Table_map # # cluster.apply_status
master-bin1.000001 # Write_rows # #
master-bin1.000001 # Table_map # # test.t2
master-bin1.000001 # Write_rows # #
master-bin1.000001 # Query # # COMMIT
drop table t2;
mysql-test/t/ndb_binlog_ddl_multi.test
View file @
8bd2c37d
...
...
@@ -5,18 +5,16 @@
--
disable_warnings
connection
server2
;
drop
database
if
exists
mysqltest
;
drop
table
if
exists
t1
,
t2
;
drop
table
if
exists
t1
,
t2
,
t3
;
connection
server1
;
drop
database
if
exists
mysqltest
;
drop
table
if
exists
t1
,
t2
;
drop
table
if
exists
t1
,
t2
,
t3
;
--
connection
server1
reset
master
;
--
connection
server2
reset
master
;
--
enable_warnings
--
let
$binlog_start
=
102
#
# basic test to see if ddl distribution works across
# multiple binlogs
...
...
@@ -33,15 +31,10 @@ create table t1 (a int primary key) engine=ndb;
--
connection
server2
create
table
t2
(
a
int
primary
key
)
engine
=
ndb
;
--
replace_result
$binlog_start
<
binlog_start
>
--
replace_column
2
# 4 # 5 #
--
eval
show
binlog
events
from
$binlog_start
--
source
include
/
show_binlog_events
.
inc
--
connection
server1
--
replace_result
$binlog_start
<
binlog_start
>
--
replace_column
2
# 4 # 5 #
--
eval
show
binlog
events
from
$binlog_start
--
source
include
/
show_binlog_events
.
inc
# alter table
--
connection
server1
...
...
@@ -53,9 +46,7 @@ reset master;
alter
table
t2
add
column
(
b
int
);
--
connections
server1
--
replace_result
$binlog_start
<
binlog_start
>
--
replace_column
2
# 4 # 5 #
--
eval
show
binlog
events
from
$binlog_start
--
source
include
/
show_binlog_events
.
inc
# alter database
...
...
@@ -91,9 +82,7 @@ drop database mysqltest;
create
table
t1
(
a
int
primary
key
)
engine
=
ndb
;
--
connection
server2
--
replace_result
$binlog_start
<
binlog_start
>
--
replace_column
2
# 4 # 5 #
--
eval
show
binlog
events
from
$binlog_start
--
source
include
/
show_binlog_events
.
inc
--
connection
server2
drop
table
t2
;
...
...
@@ -144,6 +133,51 @@ ENGINE =NDB;
drop
table
t1
;
--
connection
server2
--
replace_result
$binlog_start
<
binlog_start
>
--
replace_column
2
# 4 # 5 #
--
eval
show
binlog
events
from
$binlog_start
--
source
include
/
show_binlog_events
.
inc
#
# Bug #17827 cluster: rename of several tables in one statement,
# gets multiply logged
#
--
connection
server1
reset
master
;
show
tables
;
--
connection
server2
reset
master
;
show
tables
;
--
connection
server1
create
table
t1
(
a
int
key
)
engine
=
ndb
;
create
table
t2
(
a
int
key
)
engine
=
ndb
;
create
table
t3
(
a
int
key
)
engine
=
ndb
;
rename
table
t3
to
t4
,
t2
to
t3
,
t1
to
t2
,
t4
to
t1
;
--
connection
server2
--
source
include
/
show_binlog_events
.
inc
drop
table
t1
;
drop
table
t2
;
drop
table
t3
;
#
# Bug #17838 binlog not setup on seconday master after rename
#
#
--
connection
server1
reset
master
;
show
tables
;
--
connection
server2
reset
master
;
show
tables
;
--
connection
server1
create
table
t1
(
a
int
key
)
engine
=
ndb
;
insert
into
t1
values
(
1
);
rename
table
t1
to
t2
;
insert
into
t2
values
(
2
);
# now we should see data in table t1 _and_ t2
# prior to bug fix, data was missing for t2
--
connection
server2
--
source
include
/
show_binlog_events
.
inc
drop
table
t2
;
sql/ha_ndbcluster.cc
View file @
8bd2c37d
...
...
@@ -1367,15 +1367,17 @@ int ha_ndbcluster::drop_indexes(Ndb *ndb, TABLE *tab)
*/
NDB_INDEX_TYPE
ha_ndbcluster
::
get_index_type_from_table
(
uint
inx
)
const
{
return
get_index_type_from_key
(
inx
,
table_share
->
key_info
);
return
get_index_type_from_key
(
inx
,
table_share
->
key_info
,
inx
==
table_share
->
primary_key
);
}
NDB_INDEX_TYPE
ha_ndbcluster
::
get_index_type_from_key
(
uint
inx
,
KEY
*
key_info
)
const
KEY
*
key_info
,
bool
primary
)
const
{
bool
is_hash_index
=
(
key_info
[
inx
].
algorithm
==
HA_KEY_ALG_HASH
);
if
(
inx
==
table_share
->
primary_ke
y
)
if
(
primar
y
)
return
is_hash_index
?
PRIMARY_KEY_INDEX
:
PRIMARY_KEY_ORDERED_INDEX
;
return
((
key_info
[
inx
].
flags
&
HA_NOSAME
)
?
...
...
@@ -4644,7 +4646,7 @@ int ha_ndbcluster::add_index(TABLE *table_arg,
KEY
*
key
=
key_info
+
idx
;
KEY_PART_INFO
*
key_part
=
key
->
key_part
;
KEY_PART_INFO
*
end
=
key_part
+
key
->
key_parts
;
NDB_INDEX_TYPE
idx_type
=
get_index_type_from_key
(
idx
,
key
);
NDB_INDEX_TYPE
idx_type
=
get_index_type_from_key
(
idx
,
key
,
false
);
DBUG_PRINT
(
"info"
,
(
"Adding index: '%s'"
,
key_info
[
idx
].
name
));
// Add fields to key_part struct
for
(;
key_part
!=
end
;
key_part
++
)
...
...
sql/ha_ndbcluster.h
View file @
8bd2c37d
...
...
@@ -719,7 +719,8 @@ static void set_tabname(const char *pathname, char *tabname);
void
release_metadata
();
NDB_INDEX_TYPE
get_index_type
(
uint
idx_no
)
const
;
NDB_INDEX_TYPE
get_index_type_from_table
(
uint
index_no
)
const
;
NDB_INDEX_TYPE
get_index_type_from_key
(
uint
index_no
,
KEY
*
key_info
)
const
;
NDB_INDEX_TYPE
get_index_type_from_key
(
uint
index_no
,
KEY
*
key_info
,
bool
primary
)
const
;
int
check_index_fields_not_null
(
uint
index_no
);
uint
set_up_partition_info
(
partition_info
*
part_info
,
...
...
sql/ha_ndbcluster_binlog.cc
View file @
8bd2c37d
This diff is collapsed.
Click to expand it.
storage/ndb/include/ndbapi/NdbBlob.hpp
View file @
8bd2c37d
...
...
@@ -292,6 +292,7 @@ private:
};
Buf
theKeyBuf
;
Buf
theAccessKeyBuf
;
Buf
thePackKeyBuf
;
Buf
theHeadInlineBuf
;
Buf
theHeadInlineCopyBuf
;
// for writeTuple
Buf
thePartBuf
;
...
...
@@ -328,6 +329,9 @@ private:
Uint32
getPartNumber
(
Uint64
pos
);
Uint32
getPartCount
();
Uint32
getDistKey
(
Uint32
part
);
// pack / unpack
int
packKeyValue
(
const
NdbTableImpl
*
aTable
,
const
Buf
&
srcBuf
);
int
unpackKeyValue
(
const
NdbTableImpl
*
aTable
,
Buf
&
dstBuf
);
// getters and setters
int
getTableKeyValue
(
NdbOperation
*
anOp
);
int
setTableKeyValue
(
NdbOperation
*
anOp
);
...
...
storage/ndb/include/ndbapi/NdbOperation.hpp
View file @
8bd2c37d
...
...
@@ -881,7 +881,7 @@ protected:
Uint32
ptr2int
()
{
return
theReceiver
.
getId
();
};
// get table or index key from prepared signals
int
getKeyFromTCREQ
(
Uint32
*
data
,
unsigned
size
);
int
getKeyFromTCREQ
(
Uint32
*
data
,
Uint32
&
size
);
/******************************************************************************
* These are the private variables that are defined in the operation objects.
...
...
storage/ndb/include/ndbapi/NdbScanOperation.hpp
View file @
8bd2c37d
...
...
@@ -240,7 +240,7 @@ protected:
void
receiver_completed
(
NdbReceiver
*
);
void
execCLOSE_SCAN_REP
();
int
getKeyFromKEYINFO20
(
Uint32
*
data
,
unsigned
size
);
int
getKeyFromKEYINFO20
(
Uint32
*
data
,
Uint32
&
size
);
NdbOperation
*
takeOverScanOp
(
OperationType
opType
,
NdbTransaction
*
);
bool
m_ordered
;
...
...
storage/ndb/src/ndbapi/NdbBlob.cpp
View file @
8bd2c37d
...
...
@@ -310,7 +310,7 @@ NdbBlob::Buf::alloc(unsigned n)
void
NdbBlob
::
Buf
::
copyfrom
(
const
NdbBlob
::
Buf
&
src
)
{
assert
(
size
==
src
.
size
)
;
size
=
src
.
size
;
memcpy
(
data
,
src
.
data
,
size
);
}
...
...
@@ -408,6 +408,75 @@ NdbBlob::getDistKey(Uint32 part)
return
(
part
/
theStripeSize
)
%
theStripeSize
;
}
// pack/unpack table/index key XXX support routines, shortcuts
int
NdbBlob
::
packKeyValue
(
const
NdbTableImpl
*
aTable
,
const
Buf
&
srcBuf
)
{
DBUG_ENTER
(
"NdbBlob::packKeyValue"
);
const
Uint32
*
data
=
(
const
Uint32
*
)
srcBuf
.
data
;
unsigned
pos
=
0
;
Uint32
*
pack_data
=
(
Uint32
*
)
thePackKeyBuf
.
data
;
unsigned
pack_pos
=
0
;
for
(
unsigned
i
=
0
;
i
<
aTable
->
m_columns
.
size
();
i
++
)
{
NdbColumnImpl
*
c
=
aTable
->
m_columns
[
i
];
assert
(
c
!=
NULL
);
if
(
c
->
m_pk
)
{
unsigned
len
=
c
->
m_attrSize
*
c
->
m_arraySize
;
Uint32
pack_len
;
bool
ok
=
c
->
get_var_length
(
&
data
[
pos
],
pack_len
);
if
(
!
ok
)
{
setErrorCode
(
NdbBlobImpl
::
ErrCorruptPK
);
DBUG_RETURN
(
-
1
);
}
memcpy
(
&
pack_data
[
pack_pos
],
&
data
[
pos
],
pack_len
);
while
(
pack_len
%
4
!=
0
)
{
char
*
p
=
(
char
*
)
&
pack_data
[
pack_pos
]
+
pack_len
++
;
*
p
=
0
;
}
pos
+=
(
len
+
3
)
/
4
;
pack_pos
+=
pack_len
/
4
;
}
}
assert
(
4
*
pos
==
srcBuf
.
size
);
assert
(
4
*
pack_pos
<=
thePackKeyBuf
.
maxsize
);
thePackKeyBuf
.
size
=
4
*
pack_pos
;
DBUG_RETURN
(
0
);
}
int
NdbBlob
::
unpackKeyValue
(
const
NdbTableImpl
*
aTable
,
Buf
&
dstBuf
)
{
DBUG_ENTER
(
"NdbBlob::unpackKeyValue"
);
Uint32
*
data
=
(
Uint32
*
)
dstBuf
.
data
;
unsigned
pos
=
0
;
const
Uint32
*
pack_data
=
(
const
Uint32
*
)
thePackKeyBuf
.
data
;
unsigned
pack_pos
=
0
;
for
(
unsigned
i
=
0
;
i
<
aTable
->
m_columns
.
size
();
i
++
)
{
NdbColumnImpl
*
c
=
aTable
->
m_columns
[
i
];
assert
(
c
!=
NULL
);
if
(
c
->
m_pk
)
{
unsigned
len
=
c
->
m_attrSize
*
c
->
m_arraySize
;
Uint32
pack_len
;
bool
ok
=
c
->
get_var_length
(
&
pack_data
[
pack_pos
],
pack_len
);
if
(
!
ok
)
{
setErrorCode
(
NdbBlobImpl
::
ErrCorruptPK
);
DBUG_RETURN
(
-
1
);
}
memcpy
(
&
data
[
pos
],
&
pack_data
[
pack_pos
],
pack_len
);
while
(
pack_len
%
4
!=
0
)
{
char
*
p
=
(
char
*
)
&
data
[
pos
]
+
pack_len
++
;
*
p
=
0
;
}
pos
+=
(
len
+
3
)
/
4
;
pack_pos
+=
pack_len
/
4
;
}
}
assert
(
4
*
pos
==
dstBuf
.
size
);
assert
(
4
*
pack_pos
==
thePackKeyBuf
.
size
);
DBUG_RETURN
(
0
);
}
// getters and setters
int
...
...
@@ -489,12 +558,10 @@ int
NdbBlob
::
setPartKeyValue
(
NdbOperation
*
anOp
,
Uint32
part
)
{
DBUG_ENTER
(
"NdbBlob::setPartKeyValue"
);
DBUG_PRINT
(
"info"
,
(
"dist=%u part=%u key="
,
getDistKey
(
part
),
part
));
DBUG_DUMP
(
"info"
,
theKeyBuf
.
data
,
4
*
theTable
->
m_keyLenInWords
);
//Uint32* data = (Uint32*)theKeyBuf.data;
//unsigned size = theTable->m_keyLenInWords;
DBUG_PRINT
(
"info"
,
(
"dist=%u part=%u packkey="
,
getDistKey
(
part
),
part
));
DBUG_DUMP
(
"info"
,
thePackKeyBuf
.
data
,
4
*
thePackKeyBuf
.
size
);
// TODO use attr ids after compatibility with 4.1.7 not needed
if
(
anOp
->
equal
(
"PK"
,
theKeyBuf
.
data
)
==
-
1
||
if
(
anOp
->
equal
(
"PK"
,
the
Pack
KeyBuf
.
data
)
==
-
1
||
anOp
->
equal
(
"DIST"
,
getDistKey
(
part
))
==
-
1
||
anOp
->
equal
(
"PART"
,
part
)
==
-
1
)
{
setErrorCode
(
anOp
);
...
...
@@ -1242,21 +1309,27 @@ NdbBlob::atPrepare(NdbTransaction* aCon, NdbOperation* anOp, const NdbColumnImpl
if
(
isKeyOp
())
{
if
(
isTableOp
())
{
// get table key
Uint32
*
data
=
(
Uint32
*
)
theKeyBuf
.
data
;
unsigned
size
=
theTable
->
m_keyLenInWords
;
Uint32
*
data
=
(
Uint32
*
)
the
Pack
KeyBuf
.
data
;
Uint32
size
=
theTable
->
m_keyLenInWords
;
// in-out
if
(
theNdbOp
->
getKeyFromTCREQ
(
data
,
size
)
==
-
1
)
{
setErrorCode
(
NdbBlobImpl
::
ErrUsage
);
DBUG_RETURN
(
-
1
);
}
thePackKeyBuf
.
size
=
4
*
size
;
if
(
unpackKeyValue
(
theTable
,
theKeyBuf
)
==
-
1
)
DBUG_RETURN
(
-
1
);
}
if
(
isIndexOp
())
{
// get index key
Uint32
*
data
=
(
Uint32
*
)
the
Access
KeyBuf
.
data
;
unsigned
size
=
theAccessTable
->
m_keyLenInWords
;
Uint32
*
data
=
(
Uint32
*
)
the
Pack
KeyBuf
.
data
;
Uint32
size
=
theAccessTable
->
m_keyLenInWords
;
// in-out
if
(
theNdbOp
->
getKeyFromTCREQ
(
data
,
size
)
==
-
1
)
{
setErrorCode
(
NdbBlobImpl
::
ErrUsage
);
DBUG_RETURN
(
-
1
);
}
thePackKeyBuf
.
size
=
4
*
size
;
if
(
unpackKeyValue
(
theAccessTable
,
theAccessKeyBuf
)
==
-
1
)
DBUG_RETURN
(
-
1
);
}
if
(
isReadOp
())
{
// add read of head+inline in this op
...
...
@@ -1303,6 +1376,7 @@ NdbBlob::atPrepare(NdbEventOperationImpl* anOp, NdbEventOperationImpl* aBlobOp,
theEventOp
=
anOp
;
theBlobEventOp
=
aBlobOp
;
theTable
=
anOp
->
m_eventImpl
->
m_tableImpl
;
theAccessTable
=
theTable
;
theColumn
=
aColumn
;
// prepare blob column and table
if
(
prepareColumn
()
==
-
1
)
...
...
@@ -1321,7 +1395,7 @@ NdbBlob::atPrepare(NdbEventOperationImpl* anOp, NdbEventOperationImpl* aBlobOp,
if
(
theBlobEventOp
!=
NULL
)
{
if
((
theBlobEventPkRecAttr
=
theBlobEventOp
->
getValue
(
theBlobTable
->
getColumn
((
Uint32
)
0
),
theKeyBuf
.
data
,
version
))
==
NULL
||
the
Pack
KeyBuf
.
data
,
version
))
==
NULL
||
(
theBlobEventDistRecAttr
=
theBlobEventOp
->
getValue
(
theBlobTable
->
getColumn
((
Uint32
)
1
),
(
char
*
)
0
,
version
))
==
NULL
||
...
...
@@ -1380,6 +1454,7 @@ NdbBlob::prepareColumn()
}
// these buffers are always used
theKeyBuf
.
alloc
(
theTable
->
m_keyLenInWords
<<
2
);
thePackKeyBuf
.
alloc
(
max
(
theTable
->
m_keyLenInWords
,
theAccessTable
->
m_keyLenInWords
)
<<
2
);
theHeadInlineBuf
.
alloc
(
sizeof
(
Head
)
+
theInlineSize
);
theHead
=
(
Head
*
)
theHeadInlineBuf
.
data
;
theInlineData
=
theHeadInlineBuf
.
data
+
sizeof
(
Head
);
...
...
@@ -1464,7 +1539,7 @@ NdbBlob::preExecute(NdbTransaction::ExecType anExecType, bool& batch)
if
(
tOp
==
NULL
||
tOp
->
readTuple
()
==
-
1
||
setAccessKeyValue
(
tOp
)
==
-
1
||
tOp
->
getValue
(
pkAttrId
,
theKeyBuf
.
data
)
==
NULL
)
{
tOp
->
getValue
(
pkAttrId
,
the
Pack
KeyBuf
.
data
)
==
NULL
)
{
setErrorCode
(
tOp
);
DBUG_RETURN
(
-
1
);
}
...
...
@@ -1553,10 +1628,12 @@ NdbBlob::postExecute(NdbTransaction::ExecType anExecType)
assert
(
isKeyOp
());
if
(
isIndexOp
())
{
NdbBlob
*
tFirstBlob
=
theNdbOp
->
theBlobList
;
if
(
this
!=
tFirstBlob
)
{
if
(
this
==
tFirstBlob
)
{
packKeyValue
(
theTable
,
theKeyBuf
);
}
else
{
// copy key from first blob
assert
(
theKeyBuf
.
size
==
tFirstBlob
->
theKeyBuf
.
size
);
memcpy
(
theKeyBuf
.
data
,
tFirstBlob
->
theKeyBuf
.
data
,
tFirstBlob
->
theKeyBuf
.
size
);
theKeyBuf
.
copyfrom
(
tFirstBlob
->
theKeyBuf
);
thePackKeyBuf
.
copyfrom
(
tFirstBlob
->
thePackKeyBuf
);
}
}
if
(
isReadOp
())
{
...
...
@@ -1710,12 +1787,16 @@ NdbBlob::atNextResult()
DBUG_RETURN
(
-
1
);
assert
(
isScanOp
());
// get primary key
{
Uint32
*
data
=
(
Uint32
*
)
theKeyBuf
.
data
;
unsigned
size
=
theTable
->
m_keyLenInWords
;
if
(((
NdbScanOperation
*
)
theNdbOp
)
->
getKeyFromKEYINFO20
(
data
,
size
)
==
-
1
)
{
{
NdbScanOperation
*
tScanOp
=
(
NdbScanOperation
*
)
theNdbOp
;
Uint32
*
data
=
(
Uint32
*
)
thePackKeyBuf
.
data
;
unsigned
size
=
theTable
->
m_keyLenInWords
;
// in-out
if
(
tScanOp
->
getKeyFromKEYINFO20
(
data
,
size
)
==
-
1
)
{
setErrorCode
(
NdbBlobImpl
::
ErrUsage
);
DBUG_RETURN
(
-
1
);
}
thePackKeyBuf
.
size
=
4
*
size
;
if
(
unpackKeyValue
(
theTable
,
theKeyBuf
)
==
-
1
)
DBUG_RETURN
(
-
1
);
}
getHeadFromRecAttr
();
if
(
setPos
(
0
)
==
-
1
)
...
...
storage/ndb/src/ndbapi/NdbBlobImpl.hpp
View file @
8bd2c37d
...
...
@@ -34,6 +34,8 @@ public:
STATIC_CONST
(
ErrAbort
=
4268
);
// "Unknown blob error"
STATIC_CONST
(
ErrUnknown
=
4269
);
// "Corrupted main table PK in blob operation"
STATIC_CONST
(
ErrCorruptPK
=
4274
);
};
#endif
storage/ndb/src/ndbapi/NdbEventOperationImpl.cpp
View file @
8bd2c37d
...
...
@@ -689,9 +689,45 @@ NdbEventOperationImpl::receive_event()
error
.
code
));
DBUG_RETURN_EVENT
(
1
);
}
if
(
m_eventImpl
->
m_tableImpl
)
delete
m_eventImpl
->
m_tableImpl
;
NdbTableImpl
*
tmp_table_impl
=
m_eventImpl
->
m_tableImpl
;
m_eventImpl
->
m_tableImpl
=
at
;
DBUG_PRINT
(
"info"
,
(
"switching table impl 0x%x -> 0x%x"
,
tmp_table_impl
,
at
));
// change the rec attrs to refer to the new table object
int
i
;
for
(
i
=
0
;
i
<
2
;
i
++
)
{
NdbRecAttr
*
p
=
theFirstPkAttrs
[
i
];
while
(
p
)
{
int
no
=
p
->
getColumn
()
->
getColumnNo
();
NdbColumnImpl
*
tAttrInfo
=
at
->
getColumn
(
no
);
DBUG_PRINT
(
"info"
,
(
"rec_attr: 0x%x "
"switching column impl 0x%x -> 0x%x"
,
p
,
p
->
m_column
,
tAttrInfo
));
p
->
m_column
=
tAttrInfo
;
p
=
p
->
next
();
}
}
for
(
i
=
0
;
i
<
2
;
i
++
)
{
NdbRecAttr
*
p
=
theFirstDataAttrs
[
i
];
while
(
p
)
{
int
no
=
p
->
getColumn
()
->
getColumnNo
();
NdbColumnImpl
*
tAttrInfo
=
at
->
getColumn
(
no
);
DBUG_PRINT
(
"info"
,
(
"rec_attr: 0x%x "
"switching column impl 0x%x -> 0x%x"
,
p
,
p
->
m_column
,
tAttrInfo
));
p
->
m_column
=
tAttrInfo
;
p
=
p
->
next
();
}
}
if
(
tmp_table_impl
)
delete
tmp_table_impl
;
}
if
(
unlikely
(
operation
>=
NdbDictionary
::
Event
::
_TE_FIRST_NON_DATA_EVENT
))
...
...
@@ -1979,7 +2015,7 @@ split_concatenated_pk(const NdbTableImpl* t, Uint32* ah_buffer,
ah_buffer
[
n
++
]
=
ah
.
m_value
;
sz
+=
ah
.
getDataSize
();
}
assert
(
n
==
t
->
m_noOfKeys
&&
sz
=
=
pk_sz
);
assert
(
n
==
t
->
m_noOfKeys
&&
sz
<
=
pk_sz
);
}
int
...
...
storage/ndb/src/ndbapi/NdbOperationSearch.cpp
View file @
8bd2c37d
...
...
@@ -472,7 +472,8 @@ void
NdbOperation
::
reorderKEYINFO
()
{
Uint32
data
[
4000
];
getKeyFromTCREQ
(
data
,
4000
);
Uint32
size
=
4000
;
getKeyFromTCREQ
(
data
,
size
);
Uint32
pos
=
1
;
Uint32
k
;
for
(
k
=
0
;
k
<
m_accessTable
->
m_noOfKeys
;
k
++
)
{
...
...
@@ -501,7 +502,7 @@ NdbOperation::reorderKEYINFO()
}
int
NdbOperation
::
getKeyFromTCREQ
(
Uint32
*
data
,
unsigned
size
)
NdbOperation
::
getKeyFromTCREQ
(
Uint32
*
data
,
Uint32
&
size
)
{
assert
(
size
>=
theTupKeyLen
&&
theTupKeyLen
>
0
);
size
=
theTupKeyLen
;
...
...
storage/ndb/src/ndbapi/NdbRecAttr.cpp
View file @
8bd2c37d
...
...
@@ -199,7 +199,7 @@ NdbOut& operator<<(NdbOut& out, const NdbRecAttr &r)
out
<<
hex
<<
"H'"
<<
r
.
u_32_value
()
<<
dec
;
break
;
case
NdbDictionary
:
:
Column
::
Unsigned
:
out
<<
r
.
u_32_value
(
);
out
<<
*
((
Uint32
*
)
r
.
aRef
()
+
j
);
break
;
case
NdbDictionary
:
:
Column
::
Smallunsigned
:
out
<<
r
.
u_short_value
();
...
...
storage/ndb/src/ndbapi/NdbScanOperation.cpp
View file @
8bd2c37d
...
...
@@ -912,13 +912,20 @@ NdbScanOperation::doSendScan(int aProcessorId)
* the scan process.
****************************************************************************/
int
NdbScanOperation
::
getKeyFromKEYINFO20
(
Uint32
*
data
,
unsigned
size
)
NdbScanOperation
::
getKeyFromKEYINFO20
(
Uint32
*
data
,
Uint32
&
size
)
{
NdbRecAttr
*
tRecAttr
=
m_curr_row
;
if
(
tRecAttr
)
{
const
Uint32
*
src
=
(
Uint32
*
)
tRecAttr
->
aRef
();
memcpy
(
data
,
src
,
4
*
size
);
assert
(
tRecAttr
->
get_size_in_bytes
()
>
0
);
assert
(
tRecAttr
->
get_size_in_bytes
()
<
65536
);
const
Uint32
len
=
(
tRecAttr
->
get_size_in_bytes
()
+
3
)
/
4
-
1
;
assert
(
size
>=
len
);
memcpy
(
data
,
src
,
4
*
len
);
size
=
len
;
return
0
;
}
return
-
1
;
...
...
storage/ndb/src/ndbapi/ndberror.c
View file @
8bd2c37d
...
...
@@ -599,7 +599,8 @@ ErrorBundle ErrorCodes[] = {
{
4336
,
DMEC
,
AE
,
"Auto-increment value set below current value"
},
{
4271
,
DMEC
,
AE
,
"Invalid index object, not retrieved via getIndex()"
},
{
4272
,
DMEC
,
AE
,
"Table definition has undefined column"
},
{
4273
,
DMEC
,
IE
,
"No blob table in dict cache"
}
{
4273
,
DMEC
,
IE
,
"No blob table in dict cache"
},
{
4274
,
DMEC
,
IE
,
"Corrupted main table PK in blob operation"
}
};
static
...
...
storage/ndb/test/ndbapi/testBlobs.cpp
View file @
8bd2c37d
...
...
@@ -223,7 +223,7 @@ dropTable()
{
NdbDictionary
::
Table
tab
(
g_opt
.
m_tname
);
if
(
g_dic
->
getTable
(
g_opt
.
m_tname
)
!=
0
)
CHK
(
g_dic
->
dropTable
(
tab
)
==
0
);
CHK
(
g_dic
->
dropTable
(
g_opt
.
m_tname
)
==
0
);
return
0
;
}
...
...
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