Annotation of embedaddon/sqlite3/test/cast.test, revision 1.1

1.1     ! misho       1: # 2005 June 25
        !             2: #
        !             3: # The author disclaims copyright to this source code.  In place of
        !             4: # a legal notice, here is a blessing:
        !             5: #
        !             6: #    May you do good and not evil.
        !             7: #    May you find forgiveness for yourself and forgive others.
        !             8: #    May you share freely, never taking more than you give.
        !             9: #
        !            10: #***********************************************************************
        !            11: # This file implements regression tests for SQLite library.  The
        !            12: # focus of this file is testing the CAST operator.
        !            13: #
        !            14: # $Id: cast.test,v 1.10 2008/11/06 15:33:04 drh Exp $
        !            15: 
        !            16: set testdir [file dirname $argv0]
        !            17: source $testdir/tester.tcl
        !            18: 
        !            19: # Only run these tests if the build includes the CAST operator
        !            20: ifcapable !cast {
        !            21:   finish_test
        !            22:   return
        !            23: }
        !            24: 
        !            25: # Tests for the CAST( AS blob), CAST( AS text) and CAST( AS numeric) built-ins
        !            26: #
        !            27: ifcapable bloblit {
        !            28:   do_test cast-1.1 {
        !            29:     execsql {SELECT x'616263'}
        !            30:   } abc
        !            31:   do_test cast-1.2 {
        !            32:     execsql {SELECT typeof(x'616263')}
        !            33:   } blob
        !            34:   do_test cast-1.3 {
        !            35:     execsql {SELECT CAST(x'616263' AS text)}
        !            36:   } abc
        !            37:   do_test cast-1.4 {
        !            38:     execsql {SELECT typeof(CAST(x'616263' AS text))}
        !            39:   } text
        !            40:   do_test cast-1.5 {
        !            41:     execsql {SELECT CAST(x'616263' AS numeric)}
        !            42:   } 0
        !            43:   do_test cast-1.6 {
        !            44:     execsql {SELECT typeof(CAST(x'616263' AS numeric))}
        !            45:   } integer
        !            46:   do_test cast-1.7 {
        !            47:     execsql {SELECT CAST(x'616263' AS blob)}
        !            48:   } abc
        !            49:   do_test cast-1.8 {
        !            50:     execsql {SELECT typeof(CAST(x'616263' AS blob))}
        !            51:   } blob
        !            52:   do_test cast-1.9 {
        !            53:     execsql {SELECT CAST(x'616263' AS integer)}
        !            54:   } 0
        !            55:   do_test cast-1.10 {
        !            56:     execsql {SELECT typeof(CAST(x'616263' AS integer))}
        !            57:   } integer
        !            58: }
        !            59: do_test cast-1.11 {
        !            60:   execsql {SELECT null}
        !            61: } {{}}
        !            62: do_test cast-1.12 {
        !            63:   execsql {SELECT typeof(NULL)}
        !            64: } null
        !            65: do_test cast-1.13 {
        !            66:   execsql {SELECT CAST(NULL AS text)}
        !            67: } {{}}
        !            68: do_test cast-1.14 {
        !            69:   execsql {SELECT typeof(CAST(NULL AS text))}
        !            70: } null
        !            71: do_test cast-1.15 {
        !            72:   execsql {SELECT CAST(NULL AS numeric)}
        !            73: } {{}}
        !            74: do_test cast-1.16 {
        !            75:   execsql {SELECT typeof(CAST(NULL AS numeric))}
        !            76: } null
        !            77: do_test cast-1.17 {
        !            78:   execsql {SELECT CAST(NULL AS blob)}
        !            79: } {{}}
        !            80: do_test cast-1.18 {
        !            81:   execsql {SELECT typeof(CAST(NULL AS blob))}
        !            82: } null
        !            83: do_test cast-1.19 {
        !            84:   execsql {SELECT CAST(NULL AS integer)}
        !            85: } {{}}
        !            86: do_test cast-1.20 {
        !            87:   execsql {SELECT typeof(CAST(NULL AS integer))}
        !            88: } null
        !            89: do_test cast-1.21 {
        !            90:   execsql {SELECT 123}
        !            91: } {123}
        !            92: do_test cast-1.22 {
        !            93:   execsql {SELECT typeof(123)}
        !            94: } integer
        !            95: do_test cast-1.23 {
        !            96:   execsql {SELECT CAST(123 AS text)}
        !            97: } {123}
        !            98: do_test cast-1.24 {
        !            99:   execsql {SELECT typeof(CAST(123 AS text))}
        !           100: } text
        !           101: do_test cast-1.25 {
        !           102:   execsql {SELECT CAST(123 AS numeric)}
        !           103: } 123
        !           104: do_test cast-1.26 {
        !           105:   execsql {SELECT typeof(CAST(123 AS numeric))}
        !           106: } integer
        !           107: do_test cast-1.27 {
        !           108:   execsql {SELECT CAST(123 AS blob)}
        !           109: } {123}
        !           110: do_test cast-1.28 {
        !           111:   execsql {SELECT typeof(CAST(123 AS blob))}
        !           112: } blob
        !           113: do_test cast-1.29 {
        !           114:   execsql {SELECT CAST(123 AS integer)}
        !           115: } {123}
        !           116: do_test cast-1.30 {
        !           117:   execsql {SELECT typeof(CAST(123 AS integer))}
        !           118: } integer
        !           119: do_test cast-1.31 {
        !           120:   execsql {SELECT 123.456}
        !           121: } {123.456}
        !           122: do_test cast-1.32 {
        !           123:   execsql {SELECT typeof(123.456)}
        !           124: } real
        !           125: do_test cast-1.33 {
        !           126:   execsql {SELECT CAST(123.456 AS text)}
        !           127: } {123.456}
        !           128: do_test cast-1.34 {
        !           129:   execsql {SELECT typeof(CAST(123.456 AS text))}
        !           130: } text
        !           131: do_test cast-1.35 {
        !           132:   execsql {SELECT CAST(123.456 AS numeric)}
        !           133: } 123.456
        !           134: do_test cast-1.36 {
        !           135:   execsql {SELECT typeof(CAST(123.456 AS numeric))}
        !           136: } real
        !           137: do_test cast-1.37 {
        !           138:   execsql {SELECT CAST(123.456 AS blob)}
        !           139: } {123.456}
        !           140: do_test cast-1.38 {
        !           141:   execsql {SELECT typeof(CAST(123.456 AS blob))}
        !           142: } blob
        !           143: do_test cast-1.39 {
        !           144:   execsql {SELECT CAST(123.456 AS integer)}
        !           145: } {123}
        !           146: do_test cast-1.38 {
        !           147:   execsql {SELECT typeof(CAST(123.456 AS integer))}
        !           148: } integer
        !           149: do_test cast-1.41 {
        !           150:   execsql {SELECT '123abc'}
        !           151: } {123abc}
        !           152: do_test cast-1.42 {
        !           153:   execsql {SELECT typeof('123abc')}
        !           154: } text
        !           155: do_test cast-1.43 {
        !           156:   execsql {SELECT CAST('123abc' AS text)}
        !           157: } {123abc}
        !           158: do_test cast-1.44 {
        !           159:   execsql {SELECT typeof(CAST('123abc' AS text))}
        !           160: } text
        !           161: do_test cast-1.45 {
        !           162:   execsql {SELECT CAST('123abc' AS numeric)}
        !           163: } 123
        !           164: do_test cast-1.46 {
        !           165:   execsql {SELECT typeof(CAST('123abc' AS numeric))}
        !           166: } integer
        !           167: do_test cast-1.47 {
        !           168:   execsql {SELECT CAST('123abc' AS blob)}
        !           169: } {123abc}
        !           170: do_test cast-1.48 {
        !           171:   execsql {SELECT typeof(CAST('123abc' AS blob))}
        !           172: } blob
        !           173: do_test cast-1.49 {
        !           174:   execsql {SELECT CAST('123abc' AS integer)}
        !           175: } 123
        !           176: do_test cast-1.50 {
        !           177:   execsql {SELECT typeof(CAST('123abc' AS integer))}
        !           178: } integer
        !           179: do_test cast-1.51 {
        !           180:   execsql {SELECT CAST('123.5abc' AS numeric)}
        !           181: } 123.5
        !           182: do_test cast-1.53 {
        !           183:   execsql {SELECT CAST('123.5abc' AS integer)}
        !           184: } 123
        !           185: 
        !           186: do_test case-1.60 {
        !           187:   execsql {SELECT CAST(null AS REAL)}
        !           188: } {{}}
        !           189: do_test case-1.61 {
        !           190:   execsql {SELECT typeof(CAST(null AS REAL))}
        !           191: } {null}
        !           192: do_test case-1.62 {
        !           193:   execsql {SELECT CAST(1 AS REAL)}
        !           194: } {1.0}
        !           195: do_test case-1.63 {
        !           196:   execsql {SELECT typeof(CAST(1 AS REAL))}
        !           197: } {real}
        !           198: do_test case-1.64 {
        !           199:   execsql {SELECT CAST('1' AS REAL)}
        !           200: } {1.0}
        !           201: do_test case-1.65 {
        !           202:   execsql {SELECT typeof(CAST('1' AS REAL))}
        !           203: } {real}
        !           204: do_test case-1.66 {
        !           205:   execsql {SELECT CAST('abc' AS REAL)}
        !           206: } {0.0}
        !           207: do_test case-1.67 {
        !           208:   execsql {SELECT typeof(CAST('abc' AS REAL))}
        !           209: } {real}
        !           210: do_test case-1.68 {
        !           211:   execsql {SELECT CAST(x'31' AS REAL)}
        !           212: } {1.0}
        !           213: do_test case-1.69 {
        !           214:   execsql {SELECT typeof(CAST(x'31' AS REAL))}
        !           215: } {real}
        !           216: 
        !           217: 
        !           218: # Ticket #1662.  Ignore leading spaces in numbers when casting.
        !           219: #
        !           220: do_test cast-2.1 {
        !           221:   execsql {SELECT CAST('   123' AS integer)}
        !           222: } 123
        !           223: do_test cast-2.2 {
        !           224:   execsql {SELECT CAST('   -123.456' AS real)}
        !           225: } -123.456
        !           226: 
        !           227: # ticket #2364.  Use full percision integers if possible when casting
        !           228: # to numeric.  Do not fallback to real (and the corresponding 48-bit
        !           229: # mantissa) unless absolutely necessary.
        !           230: #
        !           231: do_test cast-3.1 {
        !           232:   execsql {SELECT CAST(9223372036854774800 AS integer)}
        !           233: } 9223372036854774800
        !           234: do_test cast-3.2 {
        !           235:   execsql {SELECT CAST(9223372036854774800 AS numeric)}
        !           236: } 9223372036854774800
        !           237: do_realnum_test cast-3.3 {
        !           238:   execsql {SELECT CAST(9223372036854774800 AS real)}
        !           239: } 9.22337203685477e+18
        !           240: do_test cast-3.4 {
        !           241:   execsql {SELECT CAST(CAST(9223372036854774800 AS real) AS integer)}
        !           242: } 9223372036854774784
        !           243: do_test cast-3.5 {
        !           244:   execsql {SELECT CAST(-9223372036854774800 AS integer)}
        !           245: } -9223372036854774800
        !           246: do_test cast-3.6 {
        !           247:   execsql {SELECT CAST(-9223372036854774800 AS numeric)}
        !           248: } -9223372036854774800
        !           249: do_realnum_test cast-3.7 {
        !           250:   execsql {SELECT CAST(-9223372036854774800 AS real)}
        !           251: } -9.22337203685477e+18
        !           252: do_test cast-3.8 {
        !           253:   execsql {SELECT CAST(CAST(-9223372036854774800 AS real) AS integer)}
        !           254: } -9223372036854774784
        !           255: do_test cast-3.11 {
        !           256:   execsql {SELECT CAST('9223372036854774800' AS integer)}
        !           257: } 9223372036854774800
        !           258: do_test cast-3.12 {
        !           259:   execsql {SELECT CAST('9223372036854774800' AS numeric)}
        !           260: } 9223372036854774800
        !           261: do_realnum_test cast-3.13 {
        !           262:   execsql {SELECT CAST('9223372036854774800' AS real)}
        !           263: } 9.22337203685477e+18
        !           264: ifcapable long_double {
        !           265:   do_test cast-3.14 {
        !           266:     execsql {SELECT CAST(CAST('9223372036854774800' AS real) AS integer)}
        !           267:   } 9223372036854774784
        !           268: }
        !           269: do_test cast-3.15 {
        !           270:   execsql {SELECT CAST('-9223372036854774800' AS integer)}
        !           271: } -9223372036854774800
        !           272: do_test cast-3.16 {
        !           273:   execsql {SELECT CAST('-9223372036854774800' AS numeric)}
        !           274: } -9223372036854774800
        !           275: do_realnum_test cast-3.17 {
        !           276:   execsql {SELECT CAST('-9223372036854774800' AS real)}
        !           277: } -9.22337203685477e+18
        !           278: ifcapable long_double {
        !           279:   do_test cast-3.18 {
        !           280:     execsql {SELECT CAST(CAST('-9223372036854774800' AS real) AS integer)}
        !           281:   } -9223372036854774784
        !           282: }
        !           283: if {[db eval {PRAGMA encoding}]=="UTF-8"} {
        !           284:   do_test cast-3.21 {
        !           285:     execsql {SELECT CAST(x'39323233333732303336383534373734383030' AS integer)}
        !           286:   } 9223372036854774800
        !           287:   do_test cast-3.22 {
        !           288:     execsql {SELECT CAST(x'39323233333732303336383534373734383030' AS numeric)}
        !           289:   } 9223372036854774800
        !           290:   do_realnum_test cast-3.23 {
        !           291:     execsql {SELECT CAST(x'39323233333732303336383534373734383030' AS real)}
        !           292:   } 9.22337203685477e+18
        !           293:   ifcapable long_double {
        !           294:     do_test cast-3.24 {
        !           295:       execsql {
        !           296:         SELECT CAST(CAST(x'39323233333732303336383534373734383030' AS real)
        !           297:                     AS integer)
        !           298:       }
        !           299:     } 9223372036854774784
        !           300:   }
        !           301: }
        !           302: do_test case-3.31 {
        !           303:   execsql {SELECT CAST(NULL AS numeric)}
        !           304: } {{}}
        !           305: 
        !           306: # Test to see if it is possible to trick SQLite into reading past 
        !           307: # the end of a blob when converting it to a number.
        !           308: do_test cast-3.32.1 {
        !           309:   set blob "1234567890"
        !           310:   set DB [sqlite3_connection_pointer db]
        !           311:   set ::STMT [sqlite3_prepare $DB {SELECT CAST(? AS real)} -1 TAIL]
        !           312:   sqlite3_bind_blob -static $::STMT 1 $blob 5
        !           313:   sqlite3_step $::STMT
        !           314: } {SQLITE_ROW}
        !           315: do_test cast-3.32.2 {
        !           316:   sqlite3_column_int $::STMT 0
        !           317: } {12345}
        !           318: do_test cast-3.32.3 {
        !           319:   sqlite3_finalize $::STMT
        !           320: } {SQLITE_OK}
        !           321: 
        !           322: 
        !           323: do_test cast-4.1 {
        !           324:   db eval {
        !           325:     CREATE TABLE t1(a);
        !           326:     INSERT INTO t1 VALUES('abc');
        !           327:     SELECT a, CAST(a AS integer) FROM t1;
        !           328:   }
        !           329: } {abc 0}
        !           330: do_test cast-4.2 {
        !           331:   db eval {
        !           332:     SELECT CAST(a AS integer), a FROM t1;
        !           333:   }
        !           334: } {0 abc}
        !           335: do_test cast-4.3 {
        !           336:   db eval {
        !           337:     SELECT a, CAST(a AS integer), a FROM t1;
        !           338:   }
        !           339: } {abc 0 abc}
        !           340: do_test cast-4.4 {
        !           341:   db eval {
        !           342:     SELECT CAST(a AS integer), a, CAST(a AS real), a FROM t1;
        !           343:   }
        !           344: } {0 abc 0.0 abc}
        !           345: 
        !           346: finish_test

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>