Skip to content

Commit

Permalink
MDEV-19629: format_pico_time implementation
Browse files Browse the repository at this point in the history
  • Loading branch information
ahmedibrahim404 authored and an3l committed Mar 27, 2023
1 parent 31487f4 commit d9808f7
Show file tree
Hide file tree
Showing 8 changed files with 548 additions and 2 deletions.
2 changes: 1 addition & 1 deletion libmysqld/CMakeLists.txt
Expand Up @@ -64,7 +64,7 @@ SET(SQL_EMBEDDED_SOURCES emb_qcache.cc libmysqld.c lib_sql.cc
../sql/item.cc ../sql/item_create.cc ../sql/item_func.cc
../sql/item_geofunc.cc ../sql/item_row.cc ../sql/item_strfunc.cc
../sql/item_subselect.cc ../sql/item_sum.cc ../sql/item_timefunc.cc
../sql/item_xmlfunc.cc ../sql/item_jsonfunc.cc
../sql/item_xmlfunc.cc ../sql/item_jsonfunc.cc ../sql/item_pfsfunc.cc
../sql/key.cc ../sql/lock.cc ../sql/log.cc
../sql/log_event.cc ../sql/log_event_server.cc
../sql/mf_iocache.cc ../sql/my_decimal.cc
Expand Down
213 changes: 213 additions & 0 deletions mysql-test/suite/perfschema/r/pfs_functions.result
@@ -0,0 +1,213 @@
# MDEV-19629: Implement MySQL 8.0 native functions: format_bytes(), format_pico_time() and ps_thread_id()
#
# Tests for the Performance Schema native function format_pico_time()
#

SELECT format_pico_time(NULL);
format_pico_time(NULL)
NULL

SELECT format_pico_time(0);
format_pico_time(0)
0 ps

SELECT format_pico_time(1);
format_pico_time(1)
1 ps

SELECT format_pico_time(999);
format_pico_time(999)
999 ps

SELECT format_pico_time(1000);
format_pico_time(1000)
1.00 ns

SELECT format_pico_time(1001);
format_pico_time(1001)
1.00 ns

SELECT format_pico_time(999999);
format_pico_time(999999)
1000.00 ns

SELECT format_pico_time(1000000);
format_pico_time(1000000)
1.00 us

SELECT format_pico_time(1000001);
format_pico_time(1000001)
1.00 us

SELECT format_pico_time(1010000);
format_pico_time(1010000)
1.01 us

SELECT format_pico_time(987654321);
format_pico_time(987654321)
987.65 us

SELECT format_pico_time(1000000000);
format_pico_time(1000000000)
1.00 ms

SELECT format_pico_time(999876000000);
format_pico_time(999876000000)
999.88 ms

SELECT format_pico_time(999999999999);
format_pico_time(999999999999)
1000.00 ms

SELECT format_pico_time(1000000000000);
format_pico_time(1000000000000)
1.00 s

SELECT format_pico_time(59000000000000);
format_pico_time(59000000000000)
59.00 s

SELECT format_pico_time(60000000000000);
format_pico_time(60000000000000)
1.00 min

SELECT format_pico_time(3549000000000000);
format_pico_time(3549000000000000)
59.15 min

SELECT format_pico_time(3599000000000000);
format_pico_time(3599000000000000)
59.98 min

SELECT format_pico_time(3600000000000000);
format_pico_time(3600000000000000)
1.00 h

SELECT format_pico_time(power(2, 63));
format_pico_time(power(2, 63))
106.75 d

SELECT format_pico_time((power(2, 63) - 1) * 2 + 1);
format_pico_time((power(2, 63) - 1) * 2 + 1)
213.50 d

SELECT format_pico_time(36000000.495523);
format_pico_time(36000000.495523)
36.00 us

SELECT format_pico_time(1000 * pow(10,12) * 86400);
format_pico_time(1000 * pow(10,12) * 86400)
1000.00 d

SELECT format_pico_time(86400000000000000000);
format_pico_time(86400000000000000000)
1000.00 d

SELECT format_pico_time(86400000000000000000+5000);
format_pico_time(86400000000000000000+5000)
1000.00 d

## Negative values are ok
SELECT format_pico_time(1010000 * -1);
format_pico_time(1010000 * -1)
-1.01 us

## Force exponent
SELECT format_pico_time(8650000000000000000099);
format_pico_time(8650000000000000000099)
1.00e+05 d

SELECT format_pico_time(-8650000000000000000099);
format_pico_time(-8650000000000000000099)
-1.00e+05 d

SELECT format_pico_time(8640000000000000000099 * 2);
format_pico_time(8640000000000000000099 * 2)
2.00e+05 d


## Text input
SELECT format_pico_time("foo");
format_pico_time("foo")
0 ps
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: 'foo'

SELECT format_pico_time("");
format_pico_time("")
0 ps
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: ''

SELECT format_pico_time("118059162071741143500099");
format_pico_time("118059162071741143500099")
1.37e+06 d

SELECT format_pico_time("-118059162071741143500099");
format_pico_time("-118059162071741143500099")
-1.37e+06 d

## Recognizes up to first non-numeric
SELECT format_pico_time("40000 * 2000");
format_pico_time("40000 * 2000")
40.00 ns
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: '40000 * 2000'

SELECT format_pico_time("40000 foo 2000");
format_pico_time("40000 foo 2000")
40.00 ns
Warnings:
Warning 1292 Truncated incorrect DOUBLE value: '40000 foo 2000'
## Aggregate functions
USE test;

CREATE TABLE timer_waits (id VARCHAR(10), wait BIGINT UNSIGNED DEFAULT NULL) DEFAULT CHARSET = utf8mb4;

INSERT INTO timer_waits VALUES ('1 sec', 1000000000000);
INSERT INTO timer_waits VALUES ('1 min', 60000000000000);
INSERT INTO timer_waits VALUES ('1 hour', 3600000000000000);
INSERT INTO timer_waits VALUES ('1 day', 86400000000000000);
INSERT INTO timer_waits VALUES ('100 days', 8640000000000000000);

SELECT id, format_pico_time(wait), wait FROM timer_waits;
id format_pico_time(wait) wait
1 sec 1.00 s 1000000000000
1 min 1.00 min 60000000000000
1 hour 1.00 h 3600000000000000
1 day 1.00 d 86400000000000000
100 days 100.00 d 8640000000000000000

SELECT sum(wait), format_pico_time(sum(wait)) FROM timer_waits;
sum(wait) format_pico_time(sum(wait))
8730061000000000000 101.04 d

SELECT avg(wait), format_pico_time(avg(wait)) FROM timer_waits;
avg(wait) format_pico_time(avg(wait))
1746012200000000000.0000 20.21 d

SELECT min(wait), format_pico_time(min(wait)) FROM timer_waits;
min(wait) format_pico_time(min(wait))
1000000000000 1.00 s

SELECT max(wait), format_pico_time(max(wait)) FROM timer_waits;
max(wait) format_pico_time(max(wait))
8640000000000000000 100.00 d

DROP TABLE timer_waits;
## Using Scientific Notation
SELECT format_pico_time(3e9);
format_pico_time(3e9)
3.00 ms

SELECT format_pico_time(4e6);
format_pico_time(4e6)
4.00 us

SELECT format_pico_time(5e3);
format_pico_time(5e3)
5.00 ns

SELECT format_pico_time(6e2);
format_pico_time(6e2)
600 ps
120 changes: 120 additions & 0 deletions mysql-test/suite/perfschema/t/pfs_functions.test
@@ -0,0 +1,120 @@
# Testcases for PFS functions are backported from MySQL

--echo # MDEV-19629: Implement MySQL 8.0 native functions: format_bytes(), format_pico_time() and ps_thread_id()
--echo #
--echo # Tests for the Performance Schema native function format_pico_time()
--echo #
--echo

SELECT format_pico_time(NULL);
--echo
SELECT format_pico_time(0);
--echo
SELECT format_pico_time(1);
--echo
SELECT format_pico_time(999);
--echo
SELECT format_pico_time(1000);
--echo
SELECT format_pico_time(1001);
--echo
SELECT format_pico_time(999999);
--echo
SELECT format_pico_time(1000000);
--echo
SELECT format_pico_time(1000001);
--echo
SELECT format_pico_time(1010000);
--echo
SELECT format_pico_time(987654321);
--echo
SELECT format_pico_time(1000000000);
--echo
SELECT format_pico_time(999876000000);
--echo
SELECT format_pico_time(999999999999);
--echo
SELECT format_pico_time(1000000000000);
--echo
SELECT format_pico_time(59000000000000);
--echo
SELECT format_pico_time(60000000000000);
--echo
SELECT format_pico_time(3549000000000000);
--echo
SELECT format_pico_time(3599000000000000);
--echo
SELECT format_pico_time(3600000000000000);
--echo
SELECT format_pico_time(power(2, 63));
--echo
SELECT format_pico_time((power(2, 63) - 1) * 2 + 1);
--echo
SELECT format_pico_time(36000000.495523);
--echo
SELECT format_pico_time(1000 * pow(10,12) * 86400);
--echo
SELECT format_pico_time(86400000000000000000);
--echo
SELECT format_pico_time(86400000000000000000+5000);

--echo
--echo ## Negative values are ok
SELECT format_pico_time(1010000 * -1);

--echo
--echo ## Force exponent
SELECT format_pico_time(8650000000000000000099);
--echo
SELECT format_pico_time(-8650000000000000000099);
--echo
SELECT format_pico_time(8640000000000000000099 * 2);
--echo

--echo
--echo ## Text input
SELECT format_pico_time("foo");
--echo
SELECT format_pico_time("");
--echo
SELECT format_pico_time("118059162071741143500099");
--echo
SELECT format_pico_time("-118059162071741143500099");
--echo
--echo ## Recognizes up to first non-numeric
SELECT format_pico_time("40000 * 2000");
--echo
SELECT format_pico_time("40000 foo 2000");

--echo ## Aggregate functions
USE test;
--echo
CREATE TABLE timer_waits (id VARCHAR(10), wait BIGINT UNSIGNED DEFAULT NULL) DEFAULT CHARSET = utf8mb4;
--echo
# Max BIGINT unsigned is 18 446 744 073 709 551 615
INSERT INTO timer_waits VALUES ('1 sec', 1000000000000);
INSERT INTO timer_waits VALUES ('1 min', 60000000000000);
INSERT INTO timer_waits VALUES ('1 hour', 3600000000000000);
INSERT INTO timer_waits VALUES ('1 day', 86400000000000000);
INSERT INTO timer_waits VALUES ('100 days', 8640000000000000000);
--echo
SELECT id, format_pico_time(wait), wait FROM timer_waits;
--echo
SELECT sum(wait), format_pico_time(sum(wait)) FROM timer_waits;
--echo
SELECT avg(wait), format_pico_time(avg(wait)) FROM timer_waits;
--echo
SELECT min(wait), format_pico_time(min(wait)) FROM timer_waits;
--echo
SELECT max(wait), format_pico_time(max(wait)) FROM timer_waits;
--echo
DROP TABLE timer_waits;

--echo ## Using Scientific Notation
SELECT format_pico_time(3e9);
--echo
SELECT format_pico_time(4e6);
--echo
SELECT format_pico_time(5e3);
--echo
SELECT format_pico_time(6e2);
2 changes: 1 addition & 1 deletion sql/CMakeLists.txt
Expand Up @@ -104,7 +104,7 @@ SET (SQL_SOURCE
handler.cc
hostname.cc init.cc item.cc item_buff.cc item_cmpfunc.cc
item_create.cc item_func.cc item_geofunc.cc item_row.cc
item_strfunc.cc item_subselect.cc item_sum.cc item_timefunc.cc
item_strfunc.cc item_subselect.cc item_sum.cc item_timefunc.cc item_pfsfunc.cc
key.cc log.cc lock.cc
log_event.cc log_event_server.cc
rpl_record.cc rpl_reporting.cc
Expand Down
1 change: 1 addition & 0 deletions sql/item.h
Expand Up @@ -6371,6 +6371,7 @@ class Item_int_with_ref :public Item_int
#include "item_jsonfunc.h"
#include "item_create.h"
#include "item_vers.h"
#include "item_pfsfunc.h"
#endif

/**
Expand Down

0 comments on commit d9808f7

Please sign in to comment.