xref: /sqlite-3.40.0/test/cast.test (revision 5fdb9a35)
1df0bddaeSdrh# 2005 June 25
2487e262fSdrh#
3487e262fSdrh# The author disclaims copyright to this source code.  In place of
4487e262fSdrh# a legal notice, here is a blessing:
5487e262fSdrh#
6487e262fSdrh#    May you do good and not evil.
7487e262fSdrh#    May you find forgiveness for yourself and forgive others.
8487e262fSdrh#    May you share freely, never taking more than you give.
9487e262fSdrh#
10487e262fSdrh#***********************************************************************
11487e262fSdrh# This file implements regression tests for SQLite library.  The
12487e262fSdrh# focus of this file is testing the CAST operator.
13487e262fSdrh#
141735fa88Sdrh# $Id: cast.test,v 1.10 2008/11/06 15:33:04 drh Exp $
15487e262fSdrh
16487e262fSdrhset testdir [file dirname $argv0]
17487e262fSdrhsource $testdir/tester.tcl
18487e262fSdrh
19487e262fSdrh# Only run these tests if the build includes the CAST operator
20487e262fSdrhifcapable !cast {
21487e262fSdrh  finish_test
22487e262fSdrh  return
23487e262fSdrh}
24487e262fSdrh
25487e262fSdrh# Tests for the CAST( AS blob), CAST( AS text) and CAST( AS numeric) built-ins
26487e262fSdrh#
27ff890793Sdanielk1977ifcapable bloblit {
28487e262fSdrh  do_test cast-1.1 {
29487e262fSdrh    execsql {SELECT x'616263'}
30487e262fSdrh  } abc
31487e262fSdrh  do_test cast-1.2 {
32487e262fSdrh    execsql {SELECT typeof(x'616263')}
33487e262fSdrh  } blob
34487e262fSdrh  do_test cast-1.3 {
35487e262fSdrh    execsql {SELECT CAST(x'616263' AS text)}
36487e262fSdrh  } abc
37487e262fSdrh  do_test cast-1.4 {
38487e262fSdrh    execsql {SELECT typeof(CAST(x'616263' AS text))}
39487e262fSdrh  } text
40487e262fSdrh  do_test cast-1.5 {
41487e262fSdrh    execsql {SELECT CAST(x'616263' AS numeric)}
428df447f0Sdrh  } 0
43487e262fSdrh  do_test cast-1.6 {
44487e262fSdrh    execsql {SELECT typeof(CAST(x'616263' AS numeric))}
458df447f0Sdrh  } integer
46487e262fSdrh  do_test cast-1.7 {
47487e262fSdrh    execsql {SELECT CAST(x'616263' AS blob)}
48487e262fSdrh  } abc
49487e262fSdrh  do_test cast-1.8 {
50487e262fSdrh    execsql {SELECT typeof(CAST(x'616263' AS blob))}
51487e262fSdrh  } blob
52487e262fSdrh  do_test cast-1.9 {
53487e262fSdrh    execsql {SELECT CAST(x'616263' AS integer)}
54487e262fSdrh  } 0
55487e262fSdrh  do_test cast-1.10 {
56487e262fSdrh    execsql {SELECT typeof(CAST(x'616263' AS integer))}
57487e262fSdrh  } integer
58ff890793Sdanielk1977}
59487e262fSdrhdo_test cast-1.11 {
60487e262fSdrh  execsql {SELECT null}
61487e262fSdrh} {{}}
62487e262fSdrhdo_test cast-1.12 {
63487e262fSdrh  execsql {SELECT typeof(NULL)}
64487e262fSdrh} null
65487e262fSdrhdo_test cast-1.13 {
66487e262fSdrh  execsql {SELECT CAST(NULL AS text)}
67487e262fSdrh} {{}}
68487e262fSdrhdo_test cast-1.14 {
69487e262fSdrh  execsql {SELECT typeof(CAST(NULL AS text))}
70487e262fSdrh} null
71487e262fSdrhdo_test cast-1.15 {
72487e262fSdrh  execsql {SELECT CAST(NULL AS numeric)}
73487e262fSdrh} {{}}
74487e262fSdrhdo_test cast-1.16 {
75487e262fSdrh  execsql {SELECT typeof(CAST(NULL AS numeric))}
76487e262fSdrh} null
77487e262fSdrhdo_test cast-1.17 {
78487e262fSdrh  execsql {SELECT CAST(NULL AS blob)}
79487e262fSdrh} {{}}
80487e262fSdrhdo_test cast-1.18 {
81487e262fSdrh  execsql {SELECT typeof(CAST(NULL AS blob))}
82487e262fSdrh} null
83487e262fSdrhdo_test cast-1.19 {
84487e262fSdrh  execsql {SELECT CAST(NULL AS integer)}
85487e262fSdrh} {{}}
86487e262fSdrhdo_test cast-1.20 {
87487e262fSdrh  execsql {SELECT typeof(CAST(NULL AS integer))}
88487e262fSdrh} null
89487e262fSdrhdo_test cast-1.21 {
90487e262fSdrh  execsql {SELECT 123}
91487e262fSdrh} {123}
92487e262fSdrhdo_test cast-1.22 {
93487e262fSdrh  execsql {SELECT typeof(123)}
94487e262fSdrh} integer
95487e262fSdrhdo_test cast-1.23 {
96487e262fSdrh  execsql {SELECT CAST(123 AS text)}
97487e262fSdrh} {123}
98487e262fSdrhdo_test cast-1.24 {
99487e262fSdrh  execsql {SELECT typeof(CAST(123 AS text))}
100487e262fSdrh} text
101487e262fSdrhdo_test cast-1.25 {
102487e262fSdrh  execsql {SELECT CAST(123 AS numeric)}
103487e262fSdrh} 123
104487e262fSdrhdo_test cast-1.26 {
105487e262fSdrh  execsql {SELECT typeof(CAST(123 AS numeric))}
106487e262fSdrh} integer
107487e262fSdrhdo_test cast-1.27 {
108487e262fSdrh  execsql {SELECT CAST(123 AS blob)}
109487e262fSdrh} {123}
110487e262fSdrhdo_test cast-1.28 {
111487e262fSdrh  execsql {SELECT typeof(CAST(123 AS blob))}
112487e262fSdrh} blob
113487e262fSdrhdo_test cast-1.29 {
114487e262fSdrh  execsql {SELECT CAST(123 AS integer)}
115487e262fSdrh} {123}
116487e262fSdrhdo_test cast-1.30 {
117487e262fSdrh  execsql {SELECT typeof(CAST(123 AS integer))}
118487e262fSdrh} integer
119487e262fSdrhdo_test cast-1.31 {
120487e262fSdrh  execsql {SELECT 123.456}
121487e262fSdrh} {123.456}
122487e262fSdrhdo_test cast-1.32 {
123487e262fSdrh  execsql {SELECT typeof(123.456)}
124487e262fSdrh} real
125487e262fSdrhdo_test cast-1.33 {
126487e262fSdrh  execsql {SELECT CAST(123.456 AS text)}
127487e262fSdrh} {123.456}
128487e262fSdrhdo_test cast-1.34 {
129487e262fSdrh  execsql {SELECT typeof(CAST(123.456 AS text))}
130487e262fSdrh} text
131487e262fSdrhdo_test cast-1.35 {
132487e262fSdrh  execsql {SELECT CAST(123.456 AS numeric)}
133487e262fSdrh} 123.456
134487e262fSdrhdo_test cast-1.36 {
135487e262fSdrh  execsql {SELECT typeof(CAST(123.456 AS numeric))}
136487e262fSdrh} real
137487e262fSdrhdo_test cast-1.37 {
138487e262fSdrh  execsql {SELECT CAST(123.456 AS blob)}
139487e262fSdrh} {123.456}
140487e262fSdrhdo_test cast-1.38 {
141487e262fSdrh  execsql {SELECT typeof(CAST(123.456 AS blob))}
142487e262fSdrh} blob
143487e262fSdrhdo_test cast-1.39 {
144487e262fSdrh  execsql {SELECT CAST(123.456 AS integer)}
145487e262fSdrh} {123}
146487e262fSdrhdo_test cast-1.38 {
147487e262fSdrh  execsql {SELECT typeof(CAST(123.456 AS integer))}
148487e262fSdrh} integer
149487e262fSdrhdo_test cast-1.41 {
150487e262fSdrh  execsql {SELECT '123abc'}
151487e262fSdrh} {123abc}
152487e262fSdrhdo_test cast-1.42 {
153487e262fSdrh  execsql {SELECT typeof('123abc')}
154487e262fSdrh} text
155487e262fSdrhdo_test cast-1.43 {
156487e262fSdrh  execsql {SELECT CAST('123abc' AS text)}
157487e262fSdrh} {123abc}
158487e262fSdrhdo_test cast-1.44 {
159487e262fSdrh  execsql {SELECT typeof(CAST('123abc' AS text))}
160487e262fSdrh} text
161487e262fSdrhdo_test cast-1.45 {
162487e262fSdrh  execsql {SELECT CAST('123abc' AS numeric)}
1638df447f0Sdrh} 123
164487e262fSdrhdo_test cast-1.46 {
165487e262fSdrh  execsql {SELECT typeof(CAST('123abc' AS numeric))}
1668df447f0Sdrh} integer
167487e262fSdrhdo_test cast-1.47 {
168487e262fSdrh  execsql {SELECT CAST('123abc' AS blob)}
169487e262fSdrh} {123abc}
170487e262fSdrhdo_test cast-1.48 {
171487e262fSdrh  execsql {SELECT typeof(CAST('123abc' AS blob))}
172487e262fSdrh} blob
173487e262fSdrhdo_test cast-1.49 {
174487e262fSdrh  execsql {SELECT CAST('123abc' AS integer)}
175487e262fSdrh} 123
176487e262fSdrhdo_test cast-1.50 {
177487e262fSdrh  execsql {SELECT typeof(CAST('123abc' AS integer))}
178487e262fSdrh} integer
179487e262fSdrhdo_test cast-1.51 {
180487e262fSdrh  execsql {SELECT CAST('123.5abc' AS numeric)}
181487e262fSdrh} 123.5
182487e262fSdrhdo_test cast-1.53 {
183487e262fSdrh  execsql {SELECT CAST('123.5abc' AS integer)}
184487e262fSdrh} 123
185487e262fSdrh
18613d04020Sdrhdo_test cast-1.60 {
18791fd4d46Sdrh  execsql {SELECT CAST(null AS REAL)}
18891fd4d46Sdrh} {{}}
18913d04020Sdrhdo_test cast-1.61 {
19091fd4d46Sdrh  execsql {SELECT typeof(CAST(null AS REAL))}
19191fd4d46Sdrh} {null}
19213d04020Sdrhdo_test cast-1.62 {
19391fd4d46Sdrh  execsql {SELECT CAST(1 AS REAL)}
19491fd4d46Sdrh} {1.0}
19513d04020Sdrhdo_test cast-1.63 {
19691fd4d46Sdrh  execsql {SELECT typeof(CAST(1 AS REAL))}
19791fd4d46Sdrh} {real}
19813d04020Sdrhdo_test cast-1.64 {
19991fd4d46Sdrh  execsql {SELECT CAST('1' AS REAL)}
20091fd4d46Sdrh} {1.0}
20113d04020Sdrhdo_test cast-1.65 {
20291fd4d46Sdrh  execsql {SELECT typeof(CAST('1' AS REAL))}
20391fd4d46Sdrh} {real}
20413d04020Sdrhdo_test cast-1.66 {
20591fd4d46Sdrh  execsql {SELECT CAST('abc' AS REAL)}
20691fd4d46Sdrh} {0.0}
20713d04020Sdrhdo_test cast-1.67 {
20891fd4d46Sdrh  execsql {SELECT typeof(CAST('abc' AS REAL))}
20991fd4d46Sdrh} {real}
21013d04020Sdrhdo_test cast-1.68 {
21191fd4d46Sdrh  execsql {SELECT CAST(x'31' AS REAL)}
21291fd4d46Sdrh} {1.0}
21313d04020Sdrhdo_test cast-1.69 {
21491fd4d46Sdrh  execsql {SELECT typeof(CAST(x'31' AS REAL))}
21591fd4d46Sdrh} {real}
21691fd4d46Sdrh
21791fd4d46Sdrh
21857bacb22Sdrh# Ticket #1662.  Ignore leading spaces in numbers when casting.
21957bacb22Sdrh#
22057bacb22Sdrhdo_test cast-2.1 {
22157bacb22Sdrh  execsql {SELECT CAST('   123' AS integer)}
22257bacb22Sdrh} 123
22357bacb22Sdrhdo_test cast-2.2 {
22457bacb22Sdrh  execsql {SELECT CAST('   -123.456' AS real)}
22557bacb22Sdrh} -123.456
22657bacb22Sdrh
227cd7b46dbSdrh# ticket #2364.  Use full percision integers if possible when casting
228cd7b46dbSdrh# to numeric.  Do not fallback to real (and the corresponding 48-bit
229cd7b46dbSdrh# mantissa) unless absolutely necessary.
230cd7b46dbSdrh#
231cd7b46dbSdrhdo_test cast-3.1 {
232cd7b46dbSdrh  execsql {SELECT CAST(9223372036854774800 AS integer)}
233cd7b46dbSdrh} 9223372036854774800
234cd7b46dbSdrhdo_test cast-3.2 {
235cd7b46dbSdrh  execsql {SELECT CAST(9223372036854774800 AS numeric)}
236cd7b46dbSdrh} 9223372036854774800
23733f5379cSdando_realnum_test cast-3.3 {
238cd7b46dbSdrh  execsql {SELECT CAST(9223372036854774800 AS real)}
239cd7b46dbSdrh} 9.22337203685477e+18
240cd7b46dbSdrhdo_test cast-3.4 {
241cd7b46dbSdrh  execsql {SELECT CAST(CAST(9223372036854774800 AS real) AS integer)}
242cd7b46dbSdrh} 9223372036854774784
243cd7b46dbSdrhdo_test cast-3.5 {
244cd7b46dbSdrh  execsql {SELECT CAST(-9223372036854774800 AS integer)}
245cd7b46dbSdrh} -9223372036854774800
246cd7b46dbSdrhdo_test cast-3.6 {
247cd7b46dbSdrh  execsql {SELECT CAST(-9223372036854774800 AS numeric)}
248cd7b46dbSdrh} -9223372036854774800
24933f5379cSdando_realnum_test cast-3.7 {
250cd7b46dbSdrh  execsql {SELECT CAST(-9223372036854774800 AS real)}
251cd7b46dbSdrh} -9.22337203685477e+18
252cd7b46dbSdrhdo_test cast-3.8 {
253cd7b46dbSdrh  execsql {SELECT CAST(CAST(-9223372036854774800 AS real) AS integer)}
254cd7b46dbSdrh} -9223372036854774784
255cd7b46dbSdrhdo_test cast-3.11 {
256cd7b46dbSdrh  execsql {SELECT CAST('9223372036854774800' AS integer)}
257cd7b46dbSdrh} 9223372036854774800
258cd7b46dbSdrhdo_test cast-3.12 {
259cd7b46dbSdrh  execsql {SELECT CAST('9223372036854774800' AS numeric)}
260cd7b46dbSdrh} 9223372036854774800
26133f5379cSdando_realnum_test cast-3.13 {
262cd7b46dbSdrh  execsql {SELECT CAST('9223372036854774800' AS real)}
263cd7b46dbSdrh} 9.22337203685477e+18
264a7fba4b0Sdrhifcapable long_double {
265cd7b46dbSdrh  do_test cast-3.14 {
266cd7b46dbSdrh    execsql {SELECT CAST(CAST('9223372036854774800' AS real) AS integer)}
267cd7b46dbSdrh  } 9223372036854774784
268a7fba4b0Sdrh}
269cd7b46dbSdrhdo_test cast-3.15 {
270cd7b46dbSdrh  execsql {SELECT CAST('-9223372036854774800' AS integer)}
271cd7b46dbSdrh} -9223372036854774800
272cd7b46dbSdrhdo_test cast-3.16 {
273cd7b46dbSdrh  execsql {SELECT CAST('-9223372036854774800' AS numeric)}
274cd7b46dbSdrh} -9223372036854774800
27533f5379cSdando_realnum_test cast-3.17 {
276cd7b46dbSdrh  execsql {SELECT CAST('-9223372036854774800' AS real)}
277cd7b46dbSdrh} -9.22337203685477e+18
278a7fba4b0Sdrhifcapable long_double {
279cd7b46dbSdrh  do_test cast-3.18 {
280cd7b46dbSdrh    execsql {SELECT CAST(CAST('-9223372036854774800' AS real) AS integer)}
281cd7b46dbSdrh  } -9223372036854774784
282a7fba4b0Sdrh}
283cd7b46dbSdrhif {[db eval {PRAGMA encoding}]=="UTF-8"} {
284cd7b46dbSdrh  do_test cast-3.21 {
285cd7b46dbSdrh    execsql {SELECT CAST(x'39323233333732303336383534373734383030' AS integer)}
286cd7b46dbSdrh  } 9223372036854774800
287cd7b46dbSdrh  do_test cast-3.22 {
288cd7b46dbSdrh    execsql {SELECT CAST(x'39323233333732303336383534373734383030' AS numeric)}
289cd7b46dbSdrh  } 9223372036854774800
29033f5379cSdan  do_realnum_test cast-3.23 {
291cd7b46dbSdrh    execsql {SELECT CAST(x'39323233333732303336383534373734383030' AS real)}
292cd7b46dbSdrh  } 9.22337203685477e+18
293a7fba4b0Sdrh  ifcapable long_double {
294cd7b46dbSdrh    do_test cast-3.24 {
295a7fba4b0Sdrh      execsql {
296a7fba4b0Sdrh        SELECT CAST(CAST(x'39323233333732303336383534373734383030' AS real)
297a7fba4b0Sdrh                    AS integer)
298a7fba4b0Sdrh      }
299cd7b46dbSdrh    } 9223372036854774784
300cd7b46dbSdrh  }
301a7fba4b0Sdrh}
30213d04020Sdrhdo_test cast-3.31 {
303cd7b46dbSdrh  execsql {SELECT CAST(NULL AS numeric)}
304cd7b46dbSdrh} {{}}
305cd7b46dbSdrh
3065b159dc3Sdanielk1977# Test to see if it is possible to trick SQLite into reading past
3075b159dc3Sdanielk1977# the end of a blob when converting it to a number.
3085b159dc3Sdanielk1977do_test cast-3.32.1 {
3095b159dc3Sdanielk1977  set blob "1234567890"
3105b159dc3Sdanielk1977  set DB [sqlite3_connection_pointer db]
3115b159dc3Sdanielk1977  set ::STMT [sqlite3_prepare $DB {SELECT CAST(? AS real)} -1 TAIL]
3125b159dc3Sdanielk1977  sqlite3_bind_blob -static $::STMT 1 $blob 5
3135b159dc3Sdanielk1977  sqlite3_step $::STMT
3145b159dc3Sdanielk1977} {SQLITE_ROW}
3155b159dc3Sdanielk1977do_test cast-3.32.2 {
3165b159dc3Sdanielk1977  sqlite3_column_int $::STMT 0
3175b159dc3Sdanielk1977} {12345}
3185b159dc3Sdanielk1977do_test cast-3.32.3 {
3195b159dc3Sdanielk1977  sqlite3_finalize $::STMT
3205b159dc3Sdanielk1977} {SQLITE_OK}
32157bacb22Sdrh
3221735fa88Sdrh
3231735fa88Sdrhdo_test cast-4.1 {
3241735fa88Sdrh  db eval {
3251735fa88Sdrh    CREATE TABLE t1(a);
3261735fa88Sdrh    INSERT INTO t1 VALUES('abc');
3271735fa88Sdrh    SELECT a, CAST(a AS integer) FROM t1;
3281735fa88Sdrh  }
3291735fa88Sdrh} {abc 0}
3301735fa88Sdrhdo_test cast-4.2 {
3311735fa88Sdrh  db eval {
3321735fa88Sdrh    SELECT CAST(a AS integer), a FROM t1;
3331735fa88Sdrh  }
3341735fa88Sdrh} {0 abc}
3351735fa88Sdrhdo_test cast-4.3 {
3361735fa88Sdrh  db eval {
3371735fa88Sdrh    SELECT a, CAST(a AS integer), a FROM t1;
3381735fa88Sdrh  }
3391735fa88Sdrh} {abc 0 abc}
3401735fa88Sdrhdo_test cast-4.4 {
3411735fa88Sdrh  db eval {
3421735fa88Sdrh    SELECT CAST(a AS integer), a, CAST(a AS real), a FROM t1;
3431735fa88Sdrh  }
3441735fa88Sdrh} {0 abc 0.0 abc}
3451735fa88Sdrh
3464eb57cefSdrh# Added 2018-01-26
3474eb57cefSdrh#
3484eb57cefSdrh# EVIDENCE-OF: R-48741-32454 If the prefix integer is greater than
3494eb57cefSdrh# +9223372036854775807 then the result of the cast is exactly
3504eb57cefSdrh# +9223372036854775807.
3514eb57cefSdrhdo_execsql_test cast-5.1 {
3524eb57cefSdrh  SELECT CAST('9223372036854775808' AS integer);
3534eb57cefSdrh  SELECT CAST('  +000009223372036854775808' AS integer);
3544eb57cefSdrh  SELECT CAST('12345678901234567890123' AS INTEGER);
3554eb57cefSdrh} {9223372036854775807 9223372036854775807 9223372036854775807}
3564eb57cefSdrh
3574eb57cefSdrh# EVIDENCE-OF: R-06028-16857 Similarly, if the prefix integer is less
3584eb57cefSdrh# than -9223372036854775808 then the result of the cast is exactly
3594eb57cefSdrh# -9223372036854775808.
3604eb57cefSdrhdo_execsql_test cast-5.2 {
3614eb57cefSdrh  SELECT CAST('-9223372036854775808' AS integer);
3624eb57cefSdrh  SELECT CAST('-9223372036854775809' AS integer);
3634eb57cefSdrh  SELECT CAST('-12345678901234567890123' AS INTEGER);
3644eb57cefSdrh} {-9223372036854775808 -9223372036854775808 -9223372036854775808}
3654eb57cefSdrh
3664eb57cefSdrh# EVIDENCE-OF: R-33990-33527 When casting to INTEGER, if the text looks
3674eb57cefSdrh# like a floating point value with an exponent, the exponent will be
3684eb57cefSdrh# ignored because it is no part of the integer prefix.
3694eb57cefSdrh# EVIDENCE-OF: R-24225-46995 For example, "(CAST '123e+5' AS INTEGER)"
3704eb57cefSdrh# results in 123, not in 12300000.
37113d04020Sdrhdo_execsql_test cast-5.3 {
3724eb57cefSdrh  SELECT CAST('123e+5' AS INTEGER);
3734eb57cefSdrh  SELECT CAST('123e+5' AS NUMERIC);
374c285ded2Sdrh  SELECT CAST('123e+5' AS REAL);
375c285ded2Sdrh} {123 12300000 12300000.0}
3764eb57cefSdrh
3774eb57cefSdrh
3784eb57cefSdrh# The following does not have anything to do with the CAST operator,
3794eb57cefSdrh# but it does deal with affinity transformations.
3804eb57cefSdrh#
38113d04020Sdrhdo_execsql_test cast-6.1 {
3824eb57cefSdrh  DROP TABLE IF EXISTS t1;
3834eb57cefSdrh  CREATE TABLE t1(a NUMERIC);
3844eb57cefSdrh  INSERT INTO t1 VALUES
3854eb57cefSdrh     ('9000000000000000001'),
3864eb57cefSdrh     ('9000000000000000001 '),
3874eb57cefSdrh     (' 9000000000000000001'),
3884eb57cefSdrh     (' 9000000000000000001 ');
3894eb57cefSdrh  SELECT * FROM t1;
3904eb57cefSdrh} {9000000000000000001 9000000000000000001 9000000000000000001 9000000000000000001}
3914eb57cefSdrh
3929a278229Sdrh# 2019-06-07
3939a278229Sdrh# https://www.sqlite.org/src/info/4c2d7639f076aa7c
39413d04020Sdrhdo_execsql_test cast-7.1 {
3959a278229Sdrh  SELECT CAST('-' AS NUMERIC);
3969a278229Sdrh} {0}
39713d04020Sdrhdo_execsql_test cast-7.2 {
3989a278229Sdrh  SELECT CAST('-0' AS NUMERIC);
3999a278229Sdrh} {0}
40013d04020Sdrhdo_execsql_test cast-7.3 {
4019a278229Sdrh  SELECT CAST('+' AS NUMERIC);
4029a278229Sdrh} {0}
40313d04020Sdrhdo_execsql_test cast-7.4 {
4049a278229Sdrh  SELECT CAST('/' AS NUMERIC);
4059a278229Sdrh} {0}
4069a278229Sdrh
4079a278229Sdrh# 2019-06-07
4089a278229Sdrh# https://www.sqlite.org/src/info/e8bedb2a184001bb
40913d04020Sdrhdo_execsql_test cast-7.10 {
4109a278229Sdrh  SELECT '' - 2851427734582196970;
4119a278229Sdrh} {-2851427734582196970}
41213d04020Sdrhdo_execsql_test cast-7.11 {
4139a278229Sdrh  SELECT 0 - 2851427734582196970;
4149a278229Sdrh} {-2851427734582196970}
41513d04020Sdrhdo_execsql_test cast-7.12 {
4169a278229Sdrh  SELECT '' - 1;
4179a278229Sdrh} {-1}
4189a278229Sdrh
419c285ded2Sdrh# 2019-06-10
420c285ded2Sdrh# https://www.sqlite.org/src/info/dd6bffbfb6e61db9
421c285ded2Sdrh#
4220ce974d1Sdrh# EVIDENCE-OF: R-55084-10555 Casting a TEXT or BLOB value into NUMERIC
4230ce974d1Sdrh# yields either an INTEGER or a REAL result.
424c285ded2Sdrh#
425c285ded2Sdrhdo_execsql_test cast-7.20 {
426c285ded2Sdrh  DROP TABLE IF EXISTS t0;
427c285ded2Sdrh  CREATE TABLE t0 (c0 TEXT);
428c285ded2Sdrh  INSERT INTO t0(c0) VALUES ('1.0');
429c285ded2Sdrh  SELECT CAST(c0 AS NUMERIC) FROM t0;
430c285ded2Sdrh} {1}
431c285ded2Sdrh
432378a7d35Sdrh# 2019-06-10
433378a7d35Sdrh# https://sqlite.org/src/info/27de823723a41df45af3
434378a7d35Sdrh#
435378a7d35Sdrhdo_execsql_test cast-7.30 {
436378a7d35Sdrh  SELECT -'.';
437378a7d35Sdrh} 0
438378a7d35Sdrhdo_execsql_test cast-7.31 {
439378a7d35Sdrh  SELECT '.'+0;
440378a7d35Sdrh} 0
441378a7d35Sdrhdo_execsql_test cast-7.32 {
442378a7d35Sdrh  SELECT CAST('.' AS numeric);
443378a7d35Sdrh} 0
444378a7d35Sdrhdo_execsql_test cast-7.33 {
445378a7d35Sdrh  SELECT -CAST('.' AS numeric);
446378a7d35Sdrh} 0
447378a7d35Sdrh
44813d04020Sdrh# 2019-06-12
44913d04020Sdrh# https://www.sqlite.org/src/info/674385aeba91c774
45013d04020Sdrh#
45113d04020Sdrhdo_execsql_test cast-7.40 {
45213d04020Sdrh  SELECT CAST('-0.0' AS numeric);
45313d04020Sdrh} 0
45413d04020Sdrhdo_execsql_test cast-7.41 {
45513d04020Sdrh  SELECT CAST('0.0' AS numeric);
45613d04020Sdrh} 0
45713d04020Sdrhdo_execsql_test cast-7.42 {
45813d04020Sdrh  SELECT CAST('+0.0' AS numeric);
45913d04020Sdrh} 0
46013d04020Sdrhdo_execsql_test cast-7.43 {
46113d04020Sdrh  SELECT CAST('-1.0' AS numeric);
46213d04020Sdrh} -1
46313d04020Sdrh
4649f3e6fadSdanifcapable utf16 {
4659f3e6fadSdan  reset_db
4669f3e6fadSdan  execsql { PRAGMA encoding='utf16' }
4679f3e6fadSdan
4689f3e6fadSdan  do_execsql_test cast-8.1 {
4699f3e6fadSdan    SELECT quote(X'310032003300')==quote(substr(X'310032003300', 1))
4709f3e6fadSdan  } 1
4719f3e6fadSdan  do_execsql_test cast-8.2 {
4729f3e6fadSdan    SELECT CAST(X'310032003300' AS TEXT)
4739f3e6fadSdan         ==CAST(substr(X'310032003300', 1) AS TEXT)
4749f3e6fadSdan  } 1
4759f3e6fadSdan}
47613d04020Sdrh
477a344ad47Sdanreset_db
478a344ad47Sdando_execsql_test cast-9.0 {
479a344ad47Sdan  CREATE TABLE t0(c0);
480a344ad47Sdan  INSERT INTO t0(c0) VALUES (0);
481a344ad47Sdan  CREATE VIEW v1(c0, c1) AS
482a344ad47Sdan    SELECT CAST(0.0 AS NUMERIC), COUNT(*) OVER () FROM t0;
483a344ad47Sdan  SELECT v1.c0 FROM v1, t0 WHERE v1.c0=0;
484*5fdb9a35Sdrh} {0}
485a344ad47Sdan
486378a7d35Sdrh
487487e262fSdrhfinish_test
488