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
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
88f811c8
Commit
88f811c8
authored
Mar 12, 2003
by
monty@mashka.mysql.fi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
NEWDATE -> DATE in anylyse() output
Changed that analyse(#) also affects strings
parent
c38125c5
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
63 additions
and
34 deletions
+63
-34
mysql-test/r/analyse.result
mysql-test/r/analyse.result
+12
-0
mysql-test/t/analyse.test
mysql-test/t/analyse.test
+3
-2
sql/sql_analyse.cc
sql/sql_analyse.cc
+48
-32
No files found.
mysql-test/r/analyse.result
View file @
88f811c8
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
t1.i 1 7 1 1 0 0 4.0000 2.2361 ENUM('1','3','5','7') NOT NULL
t1.i 1 7 1 1 0 0 4.0000 2.2361 ENUM('1','3','5','7') NOT NULL
t1.j 2 8 1 1 0 0 5.0000 2.2361 ENUM('2','4','6','8') NOT NULL
t1.j 2 8 1 1 0 0 5.0000 2.2361 ENUM('2','4','6','8') NOT NULL
t1.empty_string 0 0 4 0 0.0000 NULL ENUM('') NOT NULL
t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL
t1.d 2002-03-04 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
t1.i 1 7 1 1 0 0 4.0000 2.2361 TINYINT(1) UNSIGNED NOT NULL
t1.j 2 8 1 1 0 0 5.0000 2.2361 TINYINT(1) UNSIGNED NOT NULL
t1.empty_string 0 0 4 0 0.0000 NULL CHAR(0) NOT NULL
t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL
t1.d 2002-03-04 10 10 0 0 10.0000 NULL DATE NOT NULL
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
Field_name Min_value Max_value Min_length Max_length Empties_or_zeros Nulls Avg_value_or_avg_length Std Optimal_fieldtype
t1.i 1 7 1 1 0 0 4.0000 2.2361 ENUM('1','3','5','7') NOT NULL
t1.i 1 7 1 1 0 0 4.0000 2.2361 ENUM('1','3','5','7') NOT NULL
t1.j 2 8 1 1 0 0 5.0000 2.2361 ENUM('2','4','6','8') NOT NULL
t1.j 2 8 1 1 0 0 5.0000 2.2361 ENUM('2','4','6','8') NOT NULL
t1.empty_string 0 0 4 0 0.0000 NULL ENUM('') NOT NULL
t1.bool N Y 1 1 0 0 1.0000 NULL ENUM('N','Y') NOT NULL
t1.d 2002-03-04 10 10 0 0 10.0000 NULL ENUM('2002-03-03','2002-03-04','2002-03-05') NOT NULL
mysql-test/t/analyse.test
View file @
88f811c8
...
@@ -2,9 +2,10 @@
...
@@ -2,9 +2,10 @@
# Test of procedure analyse
# Test of procedure analyse
#
#
create
table
t1
(
i
int
,
j
int
);
create
table
t1
(
i
int
,
j
int
,
empty_string
char
(
10
),
bool
char
(
1
),
d
date
);
insert
into
t1
values
(
1
,
2
),
(
3
,
4
),
(
5
,
6
),
(
7
,
8
);
insert
into
t1
values
(
1
,
2
,
""
,
"Y"
,
"2002-03-03"
),
(
3
,
4
,
""
,
"N"
,
"2002-03-04"
),
(
5
,
6
,
""
,
"Y"
,
"2002-03-04"
),
(
7
,
8
,
""
,
"N"
,
"2002-03-05"
);
select
*
from
t1
procedure
analyse
();
select
*
from
t1
procedure
analyse
();
select
*
from
t1
procedure
analyse
(
2
);
create
table
t2
select
*
from
t1
procedure
analyse
();
create
table
t2
select
*
from
t1
procedure
analyse
();
select
*
from
t2
;
select
*
from
t2
;
drop
table
t1
,
t2
;
drop
table
t1
,
t2
;
sql/sql_analyse.cc
View file @
88f811c8
...
@@ -122,12 +122,15 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result,
...
@@ -122,12 +122,15 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result,
*
f_info
++
=
new
field_str
(
item
,
pc
);
*
f_info
++
=
new
field_str
(
item
,
pc
);
}
}
return
pc
;
return
pc
;
}
// proc_analyse_init
}
/*
Return 1 if number, else return 0
store info about found number in info
NOTE:It is expected, that elements of 'info' are all zero!
*/
// return 1 if number, else return 0
// store info about found number in info
// NOTE:It is expected, that elements of 'info' are all zero!
bool
test_if_number
(
NUM_INFO
*
info
,
const
char
*
str
,
uint
str_len
)
bool
test_if_number
(
NUM_INFO
*
info
,
const
char
*
str
,
uint
str_len
)
{
{
const
char
*
begin
,
*
end
=
str
+
str_len
;
const
char
*
begin
,
*
end
=
str
+
str_len
;
...
@@ -205,14 +208,16 @@ bool test_if_number(NUM_INFO *info, const char *str, uint str_len)
...
@@ -205,14 +208,16 @@ bool test_if_number(NUM_INFO *info, const char *str, uint str_len)
}
}
else
else
return
0
;
return
0
;
}
//test_if_number
}
// Stores the biggest and the smallest value from current 'info'
/*
// to ev_num_info
Stores the biggest and the smallest value from current 'info'
// If info contains an ulonglong number, which is bigger than
to ev_num_info
// biggest positive number able to be stored in a longlong variable
If info contains an ulonglong number, which is bigger than
// and is marked as negative, function will return 0, else 1.
biggest positive number able to be stored in a longlong variable
and is marked as negative, function will return 0, else 1.
*/
bool
get_ev_num_info
(
EV_NUM_INFO
*
ev_info
,
NUM_INFO
*
info
,
const
char
*
num
)
bool
get_ev_num_info
(
EV_NUM_INFO
*
ev_info
,
NUM_INFO
*
info
,
const
char
*
num
)
{
{
...
@@ -240,11 +245,13 @@ void free_string(String *s)
...
@@ -240,11 +245,13 @@ void free_string(String *s)
s
->
free
();
s
->
free
();
}
}
void
field_str
::
add
()
void
field_str
::
add
()
{
{
char
buff
[
MAX_FIELD_WIDTH
],
*
ptr
;
char
buff
[
MAX_FIELD_WIDTH
],
*
ptr
;
String
s
(
buff
,
sizeof
(
buff
)),
*
res
;
String
s
(
buff
,
sizeof
(
buff
)),
*
res
;
ulong
length
;
ulong
length
;
TREE_ELEMENT
*
element
;
if
(
!
(
res
=
item
->
val_str
(
&
s
)))
if
(
!
(
res
=
item
->
val_str
(
&
s
)))
{
{
...
@@ -285,7 +292,7 @@ void field_str::add()
...
@@ -285,7 +292,7 @@ void field_str::add()
if
(
!
tree_search
(
&
tree
,
(
void
*
)
&
s
))
// If not in tree
if
(
!
tree_search
(
&
tree
,
(
void
*
)
&
s
))
// If not in tree
{
{
s
.
copy
();
// slow, when SAFE_MALLOC is in use
s
.
copy
();
// slow, when SAFE_MALLOC is in use
if
(
!
tree_insert
(
&
tree
,
(
void
*
)
&
s
,
0
))
if
(
!
(
element
=
tree_insert
(
&
tree
,
(
void
*
)
&
s
,
0
)
))
{
{
room_in_tree
=
0
;
// Remove tree, out of RAM ?
room_in_tree
=
0
;
// Remove tree, out of RAM ?
delete_tree
(
&
tree
);
delete_tree
(
&
tree
);
...
@@ -293,7 +300,9 @@ void field_str::add()
...
@@ -293,7 +300,9 @@ void field_str::add()
else
else
{
{
bzero
((
char
*
)
&
s
,
sizeof
(
s
));
// Let tree handle free of this
bzero
((
char
*
)
&
s
,
sizeof
(
s
));
// Let tree handle free of this
if
((
treemem
+=
length
)
>
pc
->
max_treemem
)
if
((
treemem
+=
length
)
>
pc
->
max_treemem
||
(
element
->
count
==
1
&&
(
tree_elements
++
)
>=
pc
->
max_tree_elements
))
{
{
room_in_tree
=
0
;
// Remove tree, too big tree
room_in_tree
=
0
;
// Remove tree, too big tree
delete_tree
(
&
tree
);
delete_tree
(
&
tree
);
...
@@ -389,9 +398,11 @@ void field_real::add()
...
@@ -389,9 +398,11 @@ void field_real::add()
room_in_tree
=
0
;
// Remove tree, out of RAM ?
room_in_tree
=
0
;
// Remove tree, out of RAM ?
delete_tree
(
&
tree
);
delete_tree
(
&
tree
);
}
}
// if element->count == 1, this element can be found only once from tree
/*
// if element->count == 2, or more, this element is already in tree
if element->count == 1, this element can be found only once from tree
else
if
(
element
->
count
==
1
&&
(
tree_elements
++
)
>
pc
->
max_tree_elements
)
if element->count == 2, or more, this element is already in tree
*/
else
if
(
element
->
count
==
1
&&
(
tree_elements
++
)
>=
pc
->
max_tree_elements
)
{
{
room_in_tree
=
0
;
// Remove tree, too many elements
room_in_tree
=
0
;
// Remove tree, too many elements
delete_tree
(
&
tree
);
delete_tree
(
&
tree
);
...
@@ -420,6 +431,7 @@ void field_real::add()
...
@@ -420,6 +431,7 @@ void field_real::add()
}
}
}
// field_real::add
}
// field_real::add
void
field_longlong
::
add
()
void
field_longlong
::
add
()
{
{
char
buff
[
MAX_FIELD_WIDTH
];
char
buff
[
MAX_FIELD_WIDTH
];
...
@@ -442,9 +454,11 @@ void field_longlong::add()
...
@@ -442,9 +454,11 @@ void field_longlong::add()
room_in_tree
=
0
;
// Remove tree, out of RAM ?
room_in_tree
=
0
;
// Remove tree, out of RAM ?
delete_tree
(
&
tree
);
delete_tree
(
&
tree
);
}
}
// if element->count == 1, this element can be found only once from tree
/*
// if element->count == 2, or more, this element is already in tree
if element->count == 1, this element can be found only once from tree
else
if
(
element
->
count
==
1
&&
(
tree_elements
++
)
>
pc
->
max_tree_elements
)
if element->count == 2, or more, this element is already in tree
*/
else
if
(
element
->
count
==
1
&&
(
tree_elements
++
)
>=
pc
->
max_tree_elements
)
{
{
room_in_tree
=
0
;
// Remove tree, too many elements
room_in_tree
=
0
;
// Remove tree, too many elements
delete_tree
(
&
tree
);
delete_tree
(
&
tree
);
...
@@ -496,9 +510,11 @@ void field_ulonglong::add()
...
@@ -496,9 +510,11 @@ void field_ulonglong::add()
room_in_tree
=
0
;
// Remove tree, out of RAM ?
room_in_tree
=
0
;
// Remove tree, out of RAM ?
delete_tree
(
&
tree
);
delete_tree
(
&
tree
);
}
}
// if element->count == 1, this element can be found only once from tree
/*
// if element->count == 2, or more, this element is already in tree
if element->count == 1, this element can be found only once from tree
else
if
(
element
->
count
==
1
&&
(
tree_elements
++
)
>
pc
->
max_tree_elements
)
if element->count == 2, or more, this element is already in tree
*/
else
if
(
element
->
count
==
1
&&
(
tree_elements
++
)
>=
pc
->
max_tree_elements
)
{
{
room_in_tree
=
0
;
// Remove tree, too many elements
room_in_tree
=
0
;
// Remove tree, too many elements
delete_tree
(
&
tree
);
delete_tree
(
&
tree
);
...
@@ -578,14 +594,16 @@ bool analyse::end_of_records()
...
@@ -578,14 +594,16 @@ bool analyse::end_of_records()
func_items
[
8
]
->
null_value
=
1
;
func_items
[
8
]
->
null_value
=
1
;
else
else
func_items
[
8
]
->
set
(
res
->
ptr
(),
res
->
length
());
func_items
[
8
]
->
set
(
res
->
ptr
(),
res
->
length
());
// count the dots, quotas, etc. in (ENUM("a","b","c"...))
/*
// if tree has been removed, don't suggest ENUM.
count the dots, quotas, etc. in (ENUM("a","b","c"...))
// treemem is used to measure the size of tree for strings,
If tree has been removed, don't suggest ENUM.
// tree_elements is used to count the elements in tree in case of numbers.
treemem is used to measure the size of tree for strings,
// max_treemem tells how long the string starting from ENUM("... and
tree_elements is used to count the elements
// ending to ..") shall at maximum be. If case is about numbers,
max_treemem tells how long the string starting from ENUM("... and
// max_tree_elements will tell the length of the above, now
ending to ..") shall at maximum be. If case is about numbers,
// every number is considered as length 1
max_tree_elements will tell the length of the above, now
every number is considered as length 1
*/
if
(((
*
f
)
->
treemem
||
(
*
f
)
->
tree_elements
)
&&
if
(((
*
f
)
->
treemem
||
(
*
f
)
->
tree_elements
)
&&
(
*
f
)
->
tree
.
elements_in_tree
&&
(
*
f
)
->
tree
.
elements_in_tree
&&
(((
*
f
)
->
treemem
?
max_treemem
:
max_tree_elements
)
>
(((
*
f
)
->
treemem
?
max_treemem
:
max_tree_elements
)
>
...
@@ -628,6 +646,7 @@ bool analyse::end_of_records()
...
@@ -628,6 +646,7 @@ bool analyse::end_of_records()
ans
.
append
(
"DATETIME"
,
8
);
ans
.
append
(
"DATETIME"
,
8
);
break
;
break
;
case
FIELD_TYPE_DATE
:
case
FIELD_TYPE_DATE
:
case
FIELD_TYPE_NEWDATE
:
ans
.
append
(
"DATE"
,
4
);
ans
.
append
(
"DATE"
,
4
);
break
;
break
;
case
FIELD_TYPE_SET
:
case
FIELD_TYPE_SET
:
...
@@ -639,9 +658,6 @@ bool analyse::end_of_records()
...
@@ -639,9 +658,6 @@ bool analyse::end_of_records()
case
FIELD_TYPE_TIME
:
case
FIELD_TYPE_TIME
:
ans
.
append
(
"TIME"
,
4
);
ans
.
append
(
"TIME"
,
4
);
break
;
break
;
case
FIELD_TYPE_NEWDATE
:
ans
.
append
(
"NEWDATE"
,
7
);
break
;
case
FIELD_TYPE_DECIMAL
:
case
FIELD_TYPE_DECIMAL
:
ans
.
append
(
"DECIMAL"
,
7
);
ans
.
append
(
"DECIMAL"
,
7
);
// if item is FIELD_ITEM, it _must_be_ Field_num in this case
// if item is FIELD_ITEM, it _must_be_ Field_num in this case
...
...
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