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
c67971a8
Commit
c67971a8
authored
Apr 30, 2017
by
Alexander Barkov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
MDEV-12649 Add Type_handler::Item_save_in_value
parent
7a19c59c
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
101 additions
and
48 deletions
+101
-48
sql/item.cc
sql/item.cc
+1
-1
sql/item.h
sql/item.h
+2
-47
sql/sql_type.cc
sql/sql_type.cc
+87
-0
sql/sql_type.h
sql/sql_type.h
+11
-0
No files found.
sql/item.cc
View file @
c67971a8
...
...
@@ -3787,7 +3787,7 @@ bool Item_param::set_from_item(THD *thd, Item *item)
}
}
struct
st_value
tmp
;
if
(
!
item
->
s
tore
(
&
tmp
,
0
))
if
(
!
item
->
s
ave_in_value
(
&
tmp
))
{
unsigned_flag
=
item
->
unsigned_flag
;
switch
(
item
->
cmp_type
())
{
...
...
sql/item.h
View file @
c67971a8
...
...
@@ -676,54 +676,9 @@ class Item: public Value_source,
*/
virtual
inline
void
quick_fix_field
()
{
fixed
=
1
;
}
bool
s
tore
(
struct
st_value
*
value
,
ulonglong
fuzzydat
e
)
bool
s
ave_in_value
(
struct
st_value
*
valu
e
)
{
switch
(
cmp_type
())
{
case
INT_RESULT
:
{
value
->
m_type
=
unsigned_flag
?
DYN_COL_UINT
:
DYN_COL_INT
;
value
->
value
.
m_longlong
=
val_int
();
break
;
}
case
REAL_RESULT
:
{
value
->
m_type
=
DYN_COL_DOUBLE
;
value
->
value
.
m_double
=
val_real
();
break
;
}
case
DECIMAL_RESULT
:
{
value
->
m_type
=
DYN_COL_DECIMAL
;
my_decimal
*
dec
=
val_decimal
(
&
value
->
m_decimal
);
if
(
dec
!=
&
value
->
m_decimal
&&
!
null_value
)
my_decimal2decimal
(
dec
,
&
value
->
m_decimal
);
break
;
}
case
STRING_RESULT
:
{
value
->
m_type
=
DYN_COL_STRING
;
String
*
str
=
val_str
(
&
value
->
m_string
);
if
(
str
!=
&
value
->
m_string
&&
!
null_value
)
value
->
m_string
.
set
(
str
->
ptr
(),
str
->
length
(),
str
->
charset
());
break
;
}
case
TIME_RESULT
:
{
value
->
m_type
=
DYN_COL_DATETIME
;
get_date
(
&
value
->
value
.
m_time
,
fuzzydate
);
break
;
}
case
ROW_RESULT
:
DBUG_ASSERT
(
false
);
null_value
=
true
;
break
;
}
if
(
null_value
)
{
value
->
m_type
=
DYN_COL_NULL
;
return
true
;
}
return
false
;
return
type_handler
()
->
Item_save_in_value
(
this
,
value
);
}
/* Function returns 1 on overflow and -1 on fatal errors */
...
...
sql/sql_type.cc
View file @
c67971a8
...
...
@@ -3808,4 +3808,91 @@ Type_handler_olddecimal::type_handler_for_union(const Item *item) const
}
/***************************************************************************/
bool
Type_handler
::
check_null
(
const
Item
*
item
,
st_value
*
value
)
const
{
if
(
item
->
null_value
)
{
value
->
m_type
=
DYN_COL_NULL
;
return
true
;
}
return
false
;
}
bool
Type_handler_null
::
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
{
value
->
m_type
=
DYN_COL_NULL
;
return
true
;
}
bool
Type_handler_row
::
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
{
DBUG_ASSERT
(
0
);
value
->
m_type
=
DYN_COL_NULL
;
return
true
;
}
bool
Type_handler_int_result
::
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
{
value
->
m_type
=
item
->
unsigned_flag
?
DYN_COL_UINT
:
DYN_COL_INT
;
value
->
value
.
m_longlong
=
item
->
val_int
();
return
check_null
(
item
,
value
);
}
bool
Type_handler_real_result
::
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
{
value
->
m_type
=
DYN_COL_DOUBLE
;
value
->
value
.
m_double
=
item
->
val_real
();
return
check_null
(
item
,
value
);
}
bool
Type_handler_decimal_result
::
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
{
value
->
m_type
=
DYN_COL_DECIMAL
;
my_decimal
*
dec
=
item
->
val_decimal
(
&
value
->
m_decimal
);
if
(
dec
!=
&
value
->
m_decimal
&&
!
item
->
null_value
)
my_decimal2decimal
(
dec
,
&
value
->
m_decimal
);
return
check_null
(
item
,
value
);
}
bool
Type_handler_string_result
::
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
{
value
->
m_type
=
DYN_COL_STRING
;
String
*
str
=
item
->
val_str
(
&
value
->
m_string
);
if
(
str
!=
&
value
->
m_string
&&
!
item
->
null_value
)
value
->
m_string
.
set
(
str
->
ptr
(),
str
->
length
(),
str
->
charset
());
return
check_null
(
item
,
value
);
}
bool
Type_handler_temporal_with_date
::
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
{
value
->
m_type
=
DYN_COL_DATETIME
;
item
->
get_date
(
&
value
->
value
.
m_time
,
sql_mode_for_dates
(
current_thd
));
return
check_null
(
item
,
value
);
}
bool
Type_handler_time_common
::
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
{
value
->
m_type
=
DYN_COL_DATETIME
;
item
->
get_time
(
&
value
->
value
.
m_time
);
return
check_null
(
item
,
value
);
}
/***************************************************************************/
sql/sql_type.h
View file @
c67971a8
...
...
@@ -63,6 +63,7 @@ class in_vector;
class
Type_std_attributes
;
class
Sort_param
;
class
Arg_comparator
;
struct
st_value
;
struct
TABLE
;
struct
SORT_FIELD_ATTR
;
...
...
@@ -403,6 +404,7 @@ class Type_handler
Item_func_or_sum_illegal_param
(
const
char
*
name
)
const
;
bool
Item_func_or_sum_illegal_param
(
const
Item_func_or_sum
*
)
const
;
bool
check_null
(
const
Item
*
item
,
st_value
*
value
)
const
;
public:
static
const
Type_handler
*
blob_type_handler
(
uint
max_octet_length
);
static
const
Type_handler
*
string_type_handler
(
uint
max_octet_length
);
...
...
@@ -537,6 +539,7 @@ class Type_handler
SORT_FIELD_ATTR
*
attr
)
const
=
0
;
virtual
uint32
max_display_length
(
const
Item
*
item
)
const
=
0
;
virtual
bool
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
=
0
;
virtual
int
Item_save_in_field
(
Item
*
item
,
Field
*
field
,
bool
no_conversions
)
const
=
0
;
...
...
@@ -752,6 +755,7 @@ class Type_handler_row: public Type_handler
DBUG_ASSERT
(
0
);
return
0
;
}
bool
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
;
int
Item_save_in_field
(
Item
*
item
,
Field
*
field
,
bool
no_conversions
)
const
{
DBUG_ASSERT
(
0
);
...
...
@@ -960,6 +964,7 @@ class Type_handler_real_result: public Type_handler_numeric
void
sortlength
(
THD
*
thd
,
const
Type_std_attributes
*
item
,
SORT_FIELD_ATTR
*
attr
)
const
;
bool
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
;
int
Item_save_in_field
(
Item
*
item
,
Field
*
field
,
bool
no_conversions
)
const
;
Item_cache
*
Item_get_cache
(
THD
*
thd
,
const
Item
*
item
)
const
;
bool
set_comparator_func
(
Arg_comparator
*
cmp
)
const
;
...
...
@@ -1019,6 +1024,7 @@ class Type_handler_decimal_result: public Type_handler_numeric
const
Type_std_attributes
*
item
,
SORT_FIELD_ATTR
*
attr
)
const
;
uint32
max_display_length
(
const
Item
*
item
)
const
;
bool
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
;
int
Item_save_in_field
(
Item
*
item
,
Field
*
field
,
bool
no_conversions
)
const
;
Item_cache
*
Item_get_cache
(
THD
*
thd
,
const
Item
*
item
)
const
;
bool
set_comparator_func
(
Arg_comparator
*
cmp
)
const
;
...
...
@@ -1074,6 +1080,7 @@ class Type_handler_int_result: public Type_handler_numeric
void
sortlength
(
THD
*
thd
,
const
Type_std_attributes
*
item
,
SORT_FIELD_ATTR
*
attr
)
const
;
bool
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
;
int
Item_save_in_field
(
Item
*
item
,
Field
*
field
,
bool
no_conversions
)
const
;
Item_cache
*
Item_get_cache
(
THD
*
thd
,
const
Item
*
item
)
const
;
bool
set_comparator_func
(
Arg_comparator
*
cmp
)
const
;
...
...
@@ -1202,6 +1209,7 @@ class Type_handler_string_result: public Type_handler
{
return
Item_temporal_precision
(
item
,
false
);
}
bool
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
;
int
Item_save_in_field
(
Item
*
item
,
Field
*
field
,
bool
no_conversions
)
const
;
String
*
print_item_value
(
THD
*
thd
,
Item
*
item
,
String
*
str
)
const
{
...
...
@@ -1459,6 +1467,7 @@ class Type_handler_time_common: public Type_handler_temporal_result
return
Item_divisor_precision_increment_with_seconds
(
item
);
}
const
Type_handler
*
type_handler_for_comparison
()
const
;
bool
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
;
int
Item_save_in_field
(
Item
*
item
,
Field
*
field
,
bool
no_conversions
)
const
;
String
*
print_item_value
(
THD
*
thd
,
Item
*
item
,
String
*
str
)
const
;
bool
Item_hybrid_func_fix_attributes
(
THD
*
thd
,
Item_hybrid_func
*
func
,
...
...
@@ -1500,6 +1509,7 @@ class Type_handler_temporal_with_date: public Type_handler_temporal_result
public:
virtual
~
Type_handler_temporal_with_date
()
{}
const
Type_handler
*
type_handler_for_comparison
()
const
;
bool
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
;
int
Item_save_in_field
(
Item
*
item
,
Field
*
field
,
bool
no_conversions
)
const
;
cmp_item
*
make_cmp_item
(
THD
*
thd
,
CHARSET_INFO
*
cs
)
const
;
in_vector
*
make_in_vector
(
THD
*
,
const
Item_func_in
*
,
uint
nargs
)
const
;
...
...
@@ -1698,6 +1708,7 @@ class Type_handler_null: public Type_handler_string_result
const
Type_handler
*
type_handler_for_tmp_table
(
const
Item
*
item
)
const
;
const
Type_handler
*
type_handler_for_union
(
const
Item
*
)
const
;
uint32
max_display_length
(
const
Item
*
item
)
const
{
return
0
;
}
bool
Item_save_in_value
(
Item
*
item
,
st_value
*
value
)
const
;
Field
*
make_conversion_table_field
(
TABLE
*
,
uint
metadata
,
const
Field
*
target
)
const
;
Field
*
make_table_field
(
const
LEX_CSTRING
*
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