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
ef82f93d
Commit
ef82f93d
authored
Apr 24, 2006
by
unknown
Browse files
Options
Browse Files
Download
Plain Diff
Merge bk-internal.mysql.com:/home/bk/mysql-5.0-runtime
into mysql.com:/home/dlenev/mysql-5.0-bg11081
parents
8e28ab1f
dfbf6521
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
98 additions
and
32 deletions
+98
-32
mysql-test/r/timezone2.result
mysql-test/r/timezone2.result
+15
-0
mysql-test/t/timezone2.test
mysql-test/t/timezone2.test
+20
-0
sql/tztime.cc
sql/tztime.cc
+52
-30
sql/tztime.h
sql/tztime.h
+11
-2
No files found.
mysql-test/r/timezone2.result
View file @
ef82f93d
drop table if exists t1, t2;
drop table if exists t1, t2;
drop function if exists f1;
create table t1 (ts timestamp);
create table t1 (ts timestamp);
set time_zone='+00:00';
set time_zone='+00:00';
select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp());
select unix_timestamp(utc_timestamp())-unix_timestamp(current_timestamp());
...
@@ -268,3 +269,17 @@ select * from t1;
...
@@ -268,3 +269,17 @@ select * from t1;
convert_tz(NULL, NULL, NULL)
convert_tz(NULL, NULL, NULL)
NULL
NULL
drop table t1;
drop table t1;
create table t1 (ldt datetime, udt datetime);
create function f1(i datetime) returns datetime
return convert_tz(i, 'UTC', 'Europe/Moscow');
create trigger t1_bi before insert on t1 for each row
set new.udt:= convert_tz(new.ldt, 'Europe/Moscow', 'UTC');
insert into t1 (ldt) values ('2006-04-19 16:30:00');
select * from t1;
ldt udt
2006-04-19 16:30:00 2006-04-19 12:30:00
select ldt, f1(udt) as ldt2 from t1;
ldt ldt2
2006-04-19 16:30:00 2006-04-19 16:30:00
drop table t1;
drop function f1;
mysql-test/t/timezone2.test
View file @
ef82f93d
...
@@ -3,6 +3,7 @@
...
@@ -3,6 +3,7 @@
# Preparing playground
# Preparing playground
--
disable_warnings
--
disable_warnings
drop
table
if
exists
t1
,
t2
;
drop
table
if
exists
t1
,
t2
;
drop
function
if
exists
f1
;
--
enable_warnings
--
enable_warnings
...
@@ -222,3 +223,22 @@ select * from t1;
...
@@ -222,3 +223,22 @@ select * from t1;
drop
table
t1
;
drop
table
t1
;
# End of 4.1 tests
# End of 4.1 tests
#
# Test for bug #11081 "Using a CONVERT_TZ function in a stored function
# or trigger fails".
#
create
table
t1
(
ldt
datetime
,
udt
datetime
);
create
function
f1
(
i
datetime
)
returns
datetime
return
convert_tz
(
i
,
'UTC'
,
'Europe/Moscow'
);
create
trigger
t1_bi
before
insert
on
t1
for
each
row
set
new
.
udt
:=
convert_tz
(
new
.
ldt
,
'Europe/Moscow'
,
'UTC'
);
# This should work without errors
insert
into
t1
(
ldt
)
values
(
'2006-04-19 16:30:00'
);
select
*
from
t1
;
# This should work without errors as well
select
ldt
,
f1
(
udt
)
as
ldt2
from
t1
;
drop
table
t1
;
drop
function
f1
;
# End of 5.0 tests
sql/tztime.cc
View file @
ef82f93d
...
@@ -1370,11 +1370,30 @@ static LS_INFO *tz_lsis= 0;
...
@@ -1370,11 +1370,30 @@ static LS_INFO *tz_lsis= 0;
static
bool
time_zone_tables_exist
=
1
;
static
bool
time_zone_tables_exist
=
1
;
typedef
struct
st_tz_names_entry
:
public
Sql_alloc
/*
Names of tables (with their lengths) that are needed
for dynamical loading of time zone descriptions.
*/
static
const
LEX_STRING
tz_tables_names
[
MY_TZ_TABLES_COUNT
]
=
{
{(
char
*
)
STRING_WITH_LEN
(
"time_zone_name"
)},
{(
char
*
)
STRING_WITH_LEN
(
"time_zone"
)},
{(
char
*
)
STRING_WITH_LEN
(
"time_zone_transition_type"
)},
{(
char
*
)
STRING_WITH_LEN
(
"time_zone_transition"
)}
};
/* Name of database to which those tables belong. */
static
const
LEX_STRING
tz_tables_db_name
=
{(
char
*
)
STRING_WITH_LEN
(
"mysql"
)};
class
Tz_names_entry
:
public
Sql_alloc
{
{
public:
String
name
;
String
name
;
Time_zone
*
tz
;
Time_zone
*
tz
;
}
TZ_NAMES_ENTRY
;
};
/*
/*
...
@@ -1382,7 +1401,7 @@ typedef struct st_tz_names_entry: public Sql_alloc
...
@@ -1382,7 +1401,7 @@ typedef struct st_tz_names_entry: public Sql_alloc
they should obey C calling conventions.
they should obey C calling conventions.
*/
*/
extern
"C"
byte
*
my_tz_names_get_key
(
T
Z_NAMES_ENTRY
*
entry
,
uint
*
length
,
extern
"C"
byte
*
my_tz_names_get_key
(
T
z_names_entry
*
entry
,
uint
*
length
,
my_bool
not_used
__attribute__
((
unused
)))
my_bool
not_used
__attribute__
((
unused
)))
{
{
*
length
=
entry
->
name
.
length
();
*
length
=
entry
->
name
.
length
();
...
@@ -1403,7 +1422,8 @@ extern "C" byte* my_offset_tzs_get_key(Time_zone_offset *entry, uint *length,
...
@@ -1403,7 +1422,8 @@ extern "C" byte* my_offset_tzs_get_key(Time_zone_offset *entry, uint *length,
SYNOPSIS
SYNOPSIS
tz_init_table_list()
tz_init_table_list()
tz_tabs - pointer to preallocated array of 4 TABLE_LIST objects
tz_tabs - pointer to preallocated array of MY_TZ_TABLES_COUNT
TABLE_LIST objects
global_next_ptr - pointer to variable which points to global_next member
global_next_ptr - pointer to variable which points to global_next member
of last element of global table list (or list root
of last element of global table list (or list root
then list is empty) (in/out).
then list is empty) (in/out).
...
@@ -1418,27 +1438,27 @@ extern "C" byte* my_offset_tzs_get_key(Time_zone_offset *entry, uint *length,
...
@@ -1418,27 +1438,27 @@ extern "C" byte* my_offset_tzs_get_key(Time_zone_offset *entry, uint *length,
static
void
static
void
tz_init_table_list
(
TABLE_LIST
*
tz_tabs
,
TABLE_LIST
***
global_next_ptr
)
tz_init_table_list
(
TABLE_LIST
*
tz_tabs
,
TABLE_LIST
***
global_next_ptr
)
{
{
bzero
(
tz_tabs
,
sizeof
(
TABLE_LIST
)
*
4
);
bzero
(
tz_tabs
,
sizeof
(
TABLE_LIST
)
*
MY_TZ_TABLES_COUNT
);
tz_tabs
[
0
].
alias
=
tz_tabs
[
0
].
table_name
=
(
char
*
)
"time_zone_name"
;
tz_tabs
[
1
].
alias
=
tz_tabs
[
1
].
table_name
=
(
char
*
)
"time_zone"
;
for
(
int
i
=
0
;
i
<
MY_TZ_TABLES_COUNT
;
i
++
)
tz_tabs
[
2
].
alias
=
tz_tabs
[
2
].
table_name
=
(
char
*
)
"time_zone_transition_type"
;
{
tz_tabs
[
3
].
alias
=
tz_tabs
[
3
].
table_name
=
(
char
*
)
"time_zone_transition"
;
tz_tabs
[
i
].
alias
=
tz_tabs
[
i
].
table_name
=
tz_tables_names
[
i
].
str
;
tz_tabs
[
0
].
next_global
=
tz_tabs
[
0
].
next_local
=
tz_tabs
+
1
;
tz_tabs
[
i
].
table_name_length
=
tz_tables_names
[
i
].
length
;
tz_tabs
[
1
].
next_global
=
tz_tabs
[
1
].
next_local
=
tz_tabs
+
2
;
tz_tabs
[
i
].
db
=
tz_tables_db_name
.
str
;
tz_tabs
[
2
].
next_global
=
tz_tabs
[
2
].
next_local
=
tz_tabs
+
3
;
tz_tabs
[
i
].
db_length
=
tz_tables_db_name
.
length
;
tz_tabs
[
0
].
lock_type
=
tz_tabs
[
1
].
lock_type
=
tz_tabs
[
2
].
lock_type
=
tz_tabs
[
i
].
lock_type
=
TL_READ
;
tz_tabs
[
3
].
lock_type
=
TL_READ
;
tz_tabs
[
0
].
db
=
tz_tabs
[
1
].
db
=
tz_tabs
[
2
].
db
=
tz_tabs
[
3
].
db
=
(
char
*
)
"mysql"
;
if
(
i
!=
MY_TZ_TABLES_COUNT
-
1
)
tz_tabs
[
i
].
next_global
=
tz_tabs
[
i
].
next_local
=
&
tz_tabs
[
i
+
1
];
if
(
i
!=
0
)
tz_tabs
[
i
].
prev_global
=
&
tz_tabs
[
i
-
1
].
next_global
;
}
/* Link into global list */
/* Link into global list */
tz_tabs
[
0
].
prev_global
=
*
global_next_ptr
;
tz_tabs
[
0
].
prev_global
=
*
global_next_ptr
;
tz_tabs
[
1
].
prev_global
=
&
tz_tabs
[
0
].
next_global
;
tz_tabs
[
2
].
prev_global
=
&
tz_tabs
[
1
].
next_global
;
tz_tabs
[
3
].
prev_global
=
&
tz_tabs
[
2
].
next_global
;
**
global_next_ptr
=
tz_tabs
;
**
global_next_ptr
=
tz_tabs
;
/* Update last-global-pointer to point to pointer in last table */
/* Update last-global-pointer to point to pointer in last table */
*
global_next_ptr
=
&
tz_tabs
[
3
].
next_global
;
*
global_next_ptr
=
&
tz_tabs
[
MY_TZ_TABLES_COUNT
-
1
].
next_global
;
}
}
...
@@ -1467,7 +1487,8 @@ TABLE_LIST fake_time_zone_tables_list;
...
@@ -1467,7 +1487,8 @@ TABLE_LIST fake_time_zone_tables_list;
NOTE
NOTE
my_tz_check_n_skip_implicit_tables() function depends on fact that
my_tz_check_n_skip_implicit_tables() function depends on fact that
elements of list created are allocated as TABLE_LIST[4] array.
elements of list created are allocated as TABLE_LIST[MY_TZ_TABLES_COUNT]
array.
RETURN VALUES
RETURN VALUES
Returns pointer to first TABLE_LIST object, (could be 0 if time zone
Returns pointer to first TABLE_LIST object, (could be 0 if time zone
...
@@ -1483,7 +1504,8 @@ my_tz_get_table_list(THD *thd, TABLE_LIST ***global_next_ptr)
...
@@ -1483,7 +1504,8 @@ my_tz_get_table_list(THD *thd, TABLE_LIST ***global_next_ptr)
if
(
!
time_zone_tables_exist
)
if
(
!
time_zone_tables_exist
)
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
if
(
!
(
tz_tabs
=
(
TABLE_LIST
*
)
thd
->
alloc
(
sizeof
(
TABLE_LIST
)
*
4
)))
if
(
!
(
tz_tabs
=
(
TABLE_LIST
*
)
thd
->
alloc
(
sizeof
(
TABLE_LIST
)
*
MY_TZ_TABLES_COUNT
)))
DBUG_RETURN
(
&
fake_time_zone_tables_list
);
DBUG_RETURN
(
&
fake_time_zone_tables_list
);
tz_init_table_list
(
tz_tabs
,
global_next_ptr
);
tz_init_table_list
(
tz_tabs
,
global_next_ptr
);
...
@@ -1522,9 +1544,9 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap)
...
@@ -1522,9 +1544,9 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap)
{
{
THD
*
thd
;
THD
*
thd
;
TABLE_LIST
*
tables
=
0
;
TABLE_LIST
*
tables
=
0
;
TABLE_LIST
tables_buff
[
5
],
**
last_global_next_ptr
;
TABLE_LIST
tables_buff
[
1
+
MY_TZ_TABLES_COUNT
],
**
last_global_next_ptr
;
TABLE
*
table
;
TABLE
*
table
;
T
Z_NAMES_ENTRY
*
tmp_tzname
;
T
z_names_entry
*
tmp_tzname
;
my_bool
return_val
=
1
;
my_bool
return_val
=
1
;
int
res
;
int
res
;
DBUG_ENTER
(
"my_tz_init"
);
DBUG_ENTER
(
"my_tz_init"
);
...
@@ -1556,7 +1578,7 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap)
...
@@ -1556,7 +1578,7 @@ my_tz_init(THD *org_thd, const char *default_tzname, my_bool bootstrap)
tz_inited
=
1
;
tz_inited
=
1
;
/* Add 'SYSTEM' time zone to tz_names hash */
/* Add 'SYSTEM' time zone to tz_names hash */
if
(
!
(
tmp_tzname
=
new
(
&
tz_storage
)
T
Z_NAMES_ENTRY
()))
if
(
!
(
tmp_tzname
=
new
(
&
tz_storage
)
T
z_names_entry
()))
{
{
sql_print_error
(
"Fatal error: OOM while initializing time zones"
);
sql_print_error
(
"Fatal error: OOM while initializing time zones"
);
goto
end_with_cleanup
;
goto
end_with_cleanup
;
...
@@ -1752,7 +1774,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
...
@@ -1752,7 +1774,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
{
{
TABLE
*
table
=
0
;
TABLE
*
table
=
0
;
TIME_ZONE_INFO
*
tz_info
;
TIME_ZONE_INFO
*
tz_info
;
T
Z_NAMES_ENTRY
*
tmp_tzname
;
T
z_names_entry
*
tmp_tzname
;
Time_zone
*
return_val
=
0
;
Time_zone
*
return_val
=
0
;
int
res
;
int
res
;
uint
tzid
,
ttid
;
uint
tzid
,
ttid
;
...
@@ -2027,7 +2049,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
...
@@ -2027,7 +2049,7 @@ tz_load_from_open_tables(const String *tz_name, TABLE_LIST *tz_tables)
}
}
if
(
!
(
tmp_tzname
=
new
(
&
tz_storage
)
T
Z_NAMES_ENTRY
())
||
if
(
!
(
tmp_tzname
=
new
(
&
tz_storage
)
T
z_names_entry
())
||
!
(
tmp_tzname
->
tz
=
new
(
&
tz_storage
)
Time_zone_db
(
tz_info
,
!
(
tmp_tzname
->
tz
=
new
(
&
tz_storage
)
Time_zone_db
(
tz_info
,
&
(
tmp_tzname
->
name
)))
||
&
(
tmp_tzname
->
name
)))
||
(
tmp_tzname
->
name
.
set
(
tz_name_buff
,
tz_name
->
length
(),
(
tmp_tzname
->
name
.
set
(
tz_name_buff
,
tz_name
->
length
(),
...
@@ -2174,7 +2196,7 @@ str_to_offset(const char *str, uint length, long *offset)
...
@@ -2174,7 +2196,7 @@ str_to_offset(const char *str, uint length, long *offset)
Time_zone
*
Time_zone
*
my_tz_find
(
const
String
*
name
,
TABLE_LIST
*
tz_tables
)
my_tz_find
(
const
String
*
name
,
TABLE_LIST
*
tz_tables
)
{
{
T
Z_NAMES_ENTRY
*
tmp_tzname
;
T
z_names_entry
*
tmp_tzname
;
Time_zone
*
result_tz
=
0
;
Time_zone
*
result_tz
=
0
;
long
offset
;
long
offset
;
...
@@ -2210,7 +2232,7 @@ my_tz_find(const String * name, TABLE_LIST *tz_tables)
...
@@ -2210,7 +2232,7 @@ my_tz_find(const String * name, TABLE_LIST *tz_tables)
else
else
{
{
result_tz
=
0
;
result_tz
=
0
;
if
((
tmp_tzname
=
(
T
Z_NAMES_ENTRY
*
)
hash_search
(
&
tz_names
,
if
((
tmp_tzname
=
(
T
z_names_entry
*
)
hash_search
(
&
tz_names
,
(
const
byte
*
)
name
->
ptr
(),
(
const
byte
*
)
name
->
ptr
(),
name
->
length
())))
name
->
length
())))
result_tz
=
tmp_tzname
->
tz
;
result_tz
=
tmp_tzname
->
tz
;
...
@@ -2262,7 +2284,7 @@ Time_zone *my_tz_find_with_opening_tz_tables(THD *thd, const String *name)
...
@@ -2262,7 +2284,7 @@ Time_zone *my_tz_find_with_opening_tz_tables(THD *thd, const String *name)
our time zone tables. Note that if we don't have tz tables on this
our time zone tables. Note that if we don't have tz tables on this
slave, we don't even try.
slave, we don't even try.
*/
*/
TABLE_LIST
tables
[
4
];
TABLE_LIST
tables
[
MY_TZ_TABLES_COUNT
];
TABLE_LIST
*
dummy
;
TABLE_LIST
*
dummy
;
TABLE_LIST
**
dummyp
=
&
dummy
;
TABLE_LIST
**
dummyp
=
&
dummy
;
tz_init_table_list
(
tables
,
&
dummyp
);
tz_init_table_list
(
tables
,
&
dummyp
);
...
...
sql/tztime.h
View file @
ef82f93d
...
@@ -68,6 +68,15 @@ extern void my_tz_free();
...
@@ -68,6 +68,15 @@ extern void my_tz_free();
extern
TABLE_LIST
fake_time_zone_tables_list
;
extern
TABLE_LIST
fake_time_zone_tables_list
;
/*
Number of elements in table list produced by my_tz_get_table_list()
(this table list contains tables which are needed for dynamical loading
of time zone descriptions). Actually it is imlementation detail that
should not be used anywhere outside of tztime.h and tztime.cc.
*/
static
const
int
MY_TZ_TABLES_COUNT
=
4
;
/*
/*
Check if we have pointer to the begining of list of implicitly used time
Check if we have pointer to the begining of list of implicitly used time
zone tables, set SELECT_ACL for them and fast-forward to its end.
zone tables, set SELECT_ACL for them and fast-forward to its end.
...
@@ -90,9 +99,9 @@ inline bool my_tz_check_n_skip_implicit_tables(TABLE_LIST **table,
...
@@ -90,9 +99,9 @@ inline bool my_tz_check_n_skip_implicit_tables(TABLE_LIST **table,
{
{
if
(
*
table
==
tz_tables
)
if
(
*
table
==
tz_tables
)
{
{
for
(
int
i
=
0
;
i
<
4
;
i
++
)
for
(
int
i
=
0
;
i
<
MY_TZ_TABLES_COUNT
;
i
++
)
(
*
table
)[
i
].
grant
.
privilege
=
SELECT_ACL
;
(
*
table
)[
i
].
grant
.
privilege
=
SELECT_ACL
;
(
*
table
)
+=
3
;
(
*
table
)
+=
MY_TZ_TABLES_COUNT
-
1
;
return
TRUE
;
return
TRUE
;
}
}
return
FALSE
;
return
FALSE
;
...
...
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