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
1684cfbc
Commit
1684cfbc
authored
May 28, 2002
by
bell@sanja.is.com.ua
Browse files
Options
Browse Files
Download
Plain Diff
merging
parents
1fb2babe
06432f9e
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
35 additions
and
21 deletions
+35
-21
heap/hp_open.c
heap/hp_open.c
+2
-2
heap/hp_write.c
heap/hp_write.c
+14
-13
include/my_tree.h
include/my_tree.h
+4
-1
mysql-test/r/derived.result
mysql-test/r/derived.result
+4
-0
mysql-test/t/derived.test
mysql-test/t/derived.test
+1
-0
mysys/tree.c
mysys/tree.c
+5
-0
sql/sql_derived.cc
sql/sql_derived.cc
+5
-5
No files found.
heap/hp_open.c
View file @
1684cfbc
...
...
@@ -99,8 +99,8 @@ HP_INFO *heap_open(const char *name, int mode, uint keys, HP_KEYDEF *keydef,
if
(
keydef
[
i
].
algorithm
==
HA_KEY_ALG_BTREE
)
{
init_tree
(
&
keyinfo
->
rb_tree
,
0
,
0
,
0
,
(
qsort_cmp2
)
keys_compare
,
1
,
NULL
,
NULL
);
init_tree
(
&
keyinfo
->
rb_tree
,
0
,
0
,
sizeof
(
byte
*
)
,
(
qsort_cmp2
)
keys_compare
,
1
,
NULL
,
NULL
);
keyinfo
->
delete_key
=
hp_rb_delete_key
;
keyinfo
->
write_key
=
hp_rb_write_key
;
nsegs
++
;
...
...
heap/hp_write.c
View file @
1684cfbc
...
...
@@ -96,22 +96,23 @@ int hp_rb_write_key(HP_INFO *info, HP_KEYDEF *keyinfo, const byte *record,
info
->
last_pos
=
NULL
;
/* For heap_rnext/heap_rprev */
custom_arg
.
keyseg
=
keyinfo
->
seg
;
custom_arg
.
key_length
=
hp_rb_make_key
(
keyinfo
,
info
->
recbuf
,
record
,
recpos
);
if
((
keyinfo
->
flag
&
HA_NOSAME
)
&&
(
!
(
keyinfo
->
flag
&
HA_NULL_PART_KEY
)
||
!
hp_if_null_in_key
(
keyinfo
,
record
)))
if
(
keyinfo
->
flag
&
HA_NOSAME
)
{
custom_arg
.
search_flag
=
SEARCH_FIND
|
SEARCH_SAME
;
if
(
tree_search_key
(
&
keyinfo
->
rb_tree
,
info
->
recbuf
,
info
->
parents
,
&
info
->
last_pos
,
0
,
&
custom_arg
))
{
my_errno
=
HA_ERR_FOUND_DUPP_KEY
;
return
1
;
}
keyinfo
->
rb_tree
.
flag
=
TREE_NO_DUPS
;
}
else
{
custom_arg
.
search_flag
=
SEARCH_SAME
;
keyinfo
->
rb_tree
.
flag
=
0
;
}
if
(
!
tree_insert
(
&
keyinfo
->
rb_tree
,
(
void
*
)
info
->
recbuf
,
custom_arg
.
key_length
,
&
custom_arg
))
{
my_errno
=
HA_ERR_FOUND_DUPP_KEY
;
return
1
;
}
custom_arg
.
search_flag
=
SEARCH_SAME
;
return
tree_insert
(
&
keyinfo
->
rb_tree
,
(
void
*
)
info
->
recbuf
,
custom_arg
.
key_length
+
sizeof
(
byte
*
),
&
custom_arg
)
?
0
:
1
;
return
0
;
}
/* Find where to place new record */
...
...
include/my_tree.h
View file @
1684cfbc
...
...
@@ -27,6 +27,8 @@ extern "C" {
#define tree_set_pointer(element,ptr) *((byte **) (element+1))=((byte*) (ptr))
#define TREE_NO_DUPS 1
typedef
enum
{
left_root_right
,
right_root_left
}
TREE_WALK
;
typedef
uint32
element_count
;
typedef
int
(
*
tree_walk_action
)(
void
*
,
element_count
,
void
*
);
...
...
@@ -55,10 +57,11 @@ typedef struct st_tree {
TREE_ELEMENT
**
parents
[
MAX_TREE_HEIGHT
];
uint
offset_to_key
,
elements_in_tree
,
size_of_element
,
memory_limit
,
allocated
;
qsort_cmp2
compare
;
void
*
custom_arg
;
void
*
custom_arg
;
MEM_ROOT
mem_root
;
my_bool
with_delete
;
tree_element_free
free
;
uint
flag
;
}
TREE
;
/* Functions on whole tree */
...
...
mysql-test/r/derived.result
View file @
1684cfbc
...
...
@@ -7,6 +7,10 @@ select t1.a,t3.y from t1,(select a as y from t2 where b='c') as t3 where t1.a
a y
3 3
3 3
select t1.a,t3.a from t1,(select * from t2 where b='c') as t3 where t1.a = t3.a;
a a
3 3
3 3
CREATE TABLE t3 (a int not null, b char (10) not null);
insert into t3 values (3,'f'),(4,'y'),(5,'z'),(6,'c');
select t1.a,t4.y from t1,(select t2.a as y from t2,(select t3.b from t3 where t3.a>3) as t5 where t2.b=t5.b) as t4 where t1.a = t4.y;
...
...
mysql-test/t/derived.test
View file @
1684cfbc
...
...
@@ -4,6 +4,7 @@ insert into t1 values(1,'a'),(2,'b'),(3,'c'),(3,'c');
CREATE
TABLE
t2
(
a
int
not
null
,
b
char
(
10
)
not
null
);
insert
into
t2
values
(
3
,
'c'
),(
4
,
'd'
),(
5
,
'f'
),(
6
,
'e'
);
select
t1
.
a
,
t3
.
y
from
t1
,(
select
a
as
y
from
t2
where
b
=
'c'
)
as
t3
where
t1
.
a
=
t3
.
y
;
select
t1
.
a
,
t3
.
a
from
t1
,(
select
*
from
t2
where
b
=
'c'
)
as
t3
where
t1
.
a
=
t3
.
a
;
CREATE
TABLE
t3
(
a
int
not
null
,
b
char
(
10
)
not
null
);
insert
into
t3
values
(
3
,
'f'
),(
4
,
'y'
),(
5
,
'z'
),(
6
,
'c'
);
select
t1
.
a
,
t4
.
y
from
t1
,(
select
t2
.
a
as
y
from
t2
,(
select
t3
.
b
from
t3
where
t3
.
a
>
3
)
as
t5
where
t2
.
b
=
t5
.
b
)
as
t4
where
t1
.
a
=
t4
.
y
;
...
...
mysys/tree.c
View file @
1684cfbc
...
...
@@ -86,6 +86,7 @@ void init_tree(TREE *tree, uint default_alloc_size, uint memory_limit,
tree
->
custom_arg
=
custom_arg
;
tree
->
null_element
.
colour
=
BLACK
;
tree
->
null_element
.
left
=
tree
->
null_element
.
right
=
0
;
tree
->
flag
=
0
;
if
(
!
free_element
&&
size
>=
0
&&
((
uint
)
size
<=
sizeof
(
void
*
)
||
((
uint
)
size
&
(
sizeof
(
void
*
)
-
1
))))
{
...
...
@@ -231,7 +232,11 @@ TREE_ELEMENT *tree_insert(TREE *tree, void *key, uint key_size,
rb_insert
(
tree
,
parent
,
element
);
/* rebalance tree */
}
else
{
if
(
tree
->
flag
&
TREE_NO_DUPS
)
return
(
NULL
);
element
->
count
++
;
}
DBUG_EXECUTE
(
"check_tree"
,
test_rb_tree
(
tree
->
root
););
return
element
;
}
...
...
sql/sql_derived.cc
View file @
1684cfbc
...
...
@@ -75,11 +75,11 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit, TABLE_LIST *t)
}
bzero
((
char
*
)
&
tmp_table_param
,
sizeof
(
tmp_table_param
));
tmp_table_param
.
field_count
=
item_list
.
elements
;
if
(
!
(
table
=
create_tmp_table
(
thd
,
&
tmp_table_param
,
sl
->
item_list
,
(
ORDER
*
)
0
,
0
,
1
,
0
,
(
sl
->
options
|
thd
->
options
|
TMP_TABLE_ALL_COLUMNS
),
unit
)))
if
(
!
(
table
=
create_tmp_table
(
thd
,
&
tmp_table_param
,
item_list
,
(
ORDER
*
)
0
,
0
,
1
,
0
,
(
sl
->
options
|
thd
->
options
|
TMP_TABLE_ALL_COLUMNS
),
unit
)))
{
res
=-
1
;
goto
exit
;
...
...
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