1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
|
test_run = require('test_run').new()
---
...
engine = test_run:get_cfg('engine')
---
...
_ = box.space._session_settings:update('sql_default_engine', {{'=', 2, engine}})
---
...
-- gh-3735: make sure that integer overflows errors are
-- handled during VDBE execution.
-- gh-3810: range of integer is extended up to 2^64 - 1.
--
box.execute('SELECT (2147483647 * 2147483647 * 2147483647);')
---
- null
- 'Failed to execute SQL statement: integer is overflowed'
...
box.execute('SELECT (-9223372036854775808 / -1);')
---
- metadata:
- name: COLUMN_1
type: integer
rows:
- [9223372036854775808]
...
box.execute('SELECT (-9223372036854775808 - 1);')
---
- null
- 'Failed to execute SQL statement: integer is overflowed'
...
box.execute('SELECT (9223372036854775807 + 1);')
---
- metadata:
- name: COLUMN_1
type: integer
rows:
- [9223372036854775808]
...
box.execute('SELECT (9223372036854775807 + 9223372036854775807 + 2);')
---
- null
- 'Failed to execute SQL statement: integer is overflowed'
...
box.execute('SELECT 18446744073709551615 * 2;')
---
- null
- 'Failed to execute SQL statement: integer is overflowed'
...
box.execute('SELECT (-9223372036854775807 * (-2));')
---
- metadata:
- name: COLUMN_1
type: integer
rows:
- [18446744073709551614]
...
-- Literals are checked right after parsing.
--
box.execute('SELECT 9223372036854775808;')
---
- metadata:
- name: COLUMN_1
type: integer
rows:
- [9223372036854775808]
...
box.execute('SELECT -9223372036854775809;')
---
- null
- Integer literal -9223372036854775809 exceeds the supported range [-9223372036854775808,
18446744073709551615]
...
box.execute('SELECT 9223372036854775808 - 1;')
---
- metadata:
- name: COLUMN_1
type: integer
rows:
- [9223372036854775807]
...
box.execute('SELECT 18446744073709551615;')
---
- metadata:
- name: COLUMN_1
type: integer
rows:
- [18446744073709551615]
...
box.execute('SELECT 18446744073709551616;')
---
- null
- Integer literal 18446744073709551616 exceeds the supported range [-9223372036854775808,
18446744073709551615]
...
-- Test that CAST may also leads to overflow.
--
box.execute('SELECT CAST(\'9223372036854775808\' AS INTEGER);')
---
- metadata:
- name: COLUMN_1
type: integer
rows:
- [9223372036854775808]
...
box.execute('SELECT CAST(\'18446744073709551616\' AS INTEGER);')
---
- null
- 'Type mismatch: can not convert 18446744073709551616 to integer'
...
-- Due to inexact represantation of large integers in terms of
-- floating point numbers, numerics with value < UINT64_MAX
-- have UINT64_MAX + 1 value in integer representation:
-- float 18446744073709551600 -> int (18446744073709551616),
-- with error due to conversion = 16.
--
box.execute('SELECT CAST(18446744073709551600. AS INTEGER);')
---
- null
- 'Type mismatch: can not convert 1.84467440737096e+19 to integer'
...
-- gh-3810: make sure that if space contains integers in range
-- [INT64_MAX, UINT64_MAX], they are handled inside SQL in a
-- proper way, which now means that an error is raised.
--
box.execute('CREATE TABLE t (id INT PRIMARY KEY);')
---
- row_count: 1
...
box.space.T:insert({9223372036854775809})
---
- [9223372036854775808]
...
box.space.T:insert({18446744073709551615ULL})
---
- [18446744073709551615]
...
box.execute('SELECT * FROM t;')
---
- metadata:
- name: ID
type: integer
rows:
- [9223372036854775808]
- [18446744073709551615]
...
box.space.T:drop()
---
...
-- Make sure that integers stored in NUMBER field are converted
-- to floating point properly.
--
box.execute("CREATE TABLE t(id INT PRIMARY KEY, a NUMBER);")
---
- row_count: 1
...
box.space.T:insert({1, 18446744073709551615ULL})
---
- [1, 18446744073709551615]
...
box.space.T:insert({2, -1})
---
- [2, -1]
...
box.execute("SELECT * FROM t;")
---
- metadata:
- name: ID
type: integer
- name: A
type: number
rows:
- [1, 18446744073709551615]
- [2, -1]
...
box.space.T:drop()
---
...
|