xref: /PHP-8.0/ext/mysqli/tests/bug76386.phpt (revision 97d192b4)
1--TEST--
2Prepared Statement formatter truncates fractional seconds from date/time column (bug #76386)
3--SKIPIF--
4<?php
5require_once('skipif.inc');
6require_once('skipifconnectfailure.inc');
7require_once("connect.inc");
8
9if (!$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket))
10    die("skip Cannot connect to check required version");
11
12/* Fractional seconds are supported with servers >= 5.6.4. */
13if (mysqli_get_server_version($link) < 50604) {
14    die(sprintf("skip Server doesn't support fractional seconds in timestamp (%s)", mysqli_get_server_version($link)));
15}
16mysqli_close($link);
17?>
18--FILE--
19<?php
20require_once('connect.inc');
21// test part 1 - TIMESTAMP(n)
22$link = new mysqli($host, $user, $passwd, $db, $port, $socket);
23$link->query('DROP TABLE IF EXISTS ts_test;');
24$link->query(
25    'CREATE TABLE ts_test (id bigint unsigned auto_increment primary key, ' .
26    'ts timestamp default current_timestamp(), ts2 timestamp(2) default ' .
27    'current_timestamp(2), ts2b timestamp(2) default "2018-01-01 03:04:05.06", ' .
28    'ts4 timestamp(4) default current_timestamp(4), ts4b timestamp(4) default ' .
29    '"2018-01-01 03:04:05.0070", ts6 timestamp(6) default current_timestamp(6), ts6b ' .
30    'timestamp(6) default "2018-01-01 03:04:05.008000") character set utf8 collate ' .
31    'utf8_general_ci;'
32);
33$link->query(
34    'INSERT INTO ts_test (ts, ts2, ts4, ts6) VALUES ("2018-01-01 11:22:33", ' .
35    '"2018-02-02 11:22:33.77", "2018-03-03 11:22:33.8888", ' .
36    '"2018-04-04 11:22:33.999999");'
37);
38$stmt = $link->prepare('SELECT * FROM ts_test;'); // must be statement
39if ($stmt) {
40    $stmt->execute();
41    $tsid = $ts = $ts2 = $ts2b = $ts4 = $ts4b = $ts6 = $ts6b = null;
42    $stmt->bind_result($tsid, $ts, $ts2, $ts2b, $ts4, $ts4b, $ts6, $ts6b);
43    $stmt->fetch();
44    var_dump($ts, $ts2, $ts2b, $ts4, $ts4b, $ts6, $ts6b);
45    $stmt->free_result();
46} else {
47    echo('[FIRST][FAIL] mysqli::prepare returned false: ' . $link->error . PHP_EOL);
48}
49$link->close();
50
51// test part 2 - TIME(n)
52$link = new mysqli($host, $user, $passwd, $db, $port, $socket);
53$link->query('DROP TABLE IF EXISTS t_test;');
54$link->query(
55    'CREATE TABLE t_test (id bigint unsigned auto_increment primary key, ' .
56    't time default "11:00:00", t2 time(2) default "11:00:00.22", t4 ' .
57    'time(4) default "11:00:00.4444", t6 time(6) default "11:00:00.006054") ' .
58    'character set utf8 collate utf8_general_ci;'
59);
60$link->query(
61    'INSERT INTO t_test (t, t2, t4, t6) VALUES ("21:22:33", "21:22:33.44", ' .
62    '"21:22:33.5555", "21:22:33.676767");'
63);
64$link->query('INSERT INTO t_test VALUES ();');
65
66$stmt = $link->prepare('SELECT * FROM t_test;');
67if ($stmt) {
68    $stmt->execute();
69    $tid = $t = $t2 = $t3 = $t4 = null;
70    $stmt->bind_result($tid, $t, $t2, $t4, $t6);
71    while ($stmt->fetch()) {
72        var_dump($t, $t2, $t4, $t6);
73    }
74    $stmt->free_result();
75} else {
76    echo('[SECOND][FAIL] mysqli::prepare returned false: ' . $link->error . PHP_EOL);
77}
78$link->close();
79?>
80--EXPECT--
81string(19) "2018-01-01 11:22:33"
82string(22) "2018-02-02 11:22:33.77"
83string(22) "2018-01-01 03:04:05.06"
84string(24) "2018-03-03 11:22:33.8888"
85string(24) "2018-01-01 03:04:05.0070"
86string(26) "2018-04-04 11:22:33.999999"
87string(26) "2018-01-01 03:04:05.008000"
88string(8) "21:22:33"
89string(11) "21:22:33.44"
90string(13) "21:22:33.5555"
91string(15) "21:22:33.676767"
92string(8) "11:00:00"
93string(11) "11:00:00.22"
94string(13) "11:00:00.4444"
95string(15) "11:00:00.006054"
96--CLEAN--
97<?php
98require_once('connect.inc');
99$link = new mysqli($host, $user, $passwd, $db, $port, $socket);
100$link->query('DROP TABLE ts_test;');
101$link->query('DROP TABLE t_test;');
102$link->close();
103?>
104