Home | History | Annotate | Download | only in test
      1 # 2007 April 27
      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.
     12 #
     13 # The focus of the tests in this file are to verify that the
     14 # underlying TEXT or BLOB representation of an sqlite3_value
     15 # changes appropriately when APIs from the following set are
     16 # called:
     17 #
     18 #     sqlite3_value_text()
     19 #     sqlite3_value_text16()
     20 #     sqlite3_value_blob()
     21 #     sqlite3_value_bytes()
     22 #     sqlite3_value_bytes16()
     23 #
     24 # $Id: ptrchng.test,v 1.5 2008/07/12 14:52:20 drh Exp $
     25 
     26 set testdir [file dirname $argv0]
     27 source $testdir/tester.tcl
     28 
     29 ifcapable !bloblit {
     30   finish_test
     31   return
     32 }
     33 
     34 # Register the "pointer_change" SQL function.
     35 #
     36 sqlite3_create_function db
     37 
     38 do_test ptrchng-1.1 {
     39   execsql {
     40     CREATE TABLE t1(x INTEGER PRIMARY KEY, y BLOB);
     41     INSERT INTO t1 VALUES(1, 'abc');
     42     INSERT INTO t1 VALUES(2, 
     43        'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234356789');
     44     INSERT INTO t1 VALUES(3, x'626c6f62');
     45     INSERT INTO t1 VALUES(4,
     46  x'000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324'
     47     );
     48     SELECT count(*) FROM t1;
     49   }
     50 } {4}
     51 
     52 # For the short entries that fit in the Mem.zBuf[], the pointer should
     53 # never change regardless of what type conversions occur.
     54 #
     55 # UPDATE: No longer true, as Mem.zBuf[] has been removed.
     56 #
     57 do_test ptrchng-2.1 {
     58   execsql {
     59     SELECT pointer_change(y, 'text', 'noop', 'blob') FROM t1 WHERE x=1
     60   }
     61 } {0}
     62 do_test ptrchng-2.2 {
     63   execsql {
     64     SELECT pointer_change(y, 'blob', 'noop', 'text') FROM t1 WHERE x=1
     65   }
     66 } {0}
     67 ifcapable utf16 {
     68   do_test ptrchng-2.3 {
     69     execsql {
     70       SELECT pointer_change(y, 'text', 'noop', 'text16') FROM t1 WHERE x=1
     71     }
     72   } {1}
     73   do_test ptrchng-2.4 {
     74     execsql {
     75       SELECT pointer_change(y, 'blob', 'noop', 'text16') FROM t1 WHERE x=1
     76     }
     77   } {1}
     78   do_test ptrchng-2.5 {
     79     execsql {
     80       SELECT pointer_change(y, 'text16', 'noop', 'blob') FROM t1 WHERE x=1
     81     }
     82   } {0}
     83   do_test ptrchng-2.6 {
     84     execsql {
     85       SELECT pointer_change(y, 'text16', 'noop', 'text') FROM t1 WHERE x=1
     86     }
     87   } {1}
     88 }
     89 do_test ptrchng-2.11 {
     90   execsql {
     91     SELECT pointer_change(y, 'text', 'noop', 'blob') FROM t1 WHERE x=3
     92   }
     93 } {0}
     94 do_test ptrchng-2.12 {
     95   execsql {
     96     SELECT pointer_change(y, 'blob', 'noop', 'text') FROM t1 WHERE x=3
     97   }
     98 } {0}
     99 ifcapable utf16 {
    100   do_test ptrchng-2.13 {
    101     execsql {
    102       SELECT pointer_change(y, 'text', 'noop', 'text16') FROM t1 WHERE x=3
    103     }
    104   } {1}
    105   do_test ptrchng-2.14 {
    106     execsql {
    107       SELECT pointer_change(y, 'blob', 'noop', 'text16') FROM t1 WHERE x=3
    108     }
    109   } {1}
    110   do_test ptrchng-2.15 {
    111     execsql {
    112       SELECT pointer_change(y, 'text16', 'noop', 'blob') FROM t1 WHERE x=3
    113     }
    114   } {0}
    115   do_test ptrchng-2.16 {
    116     execsql {
    117       SELECT pointer_change(y, 'text16', 'noop', 'text') FROM t1 WHERE x=3
    118     }
    119   } {1}
    120 }
    121 
    122 # For the long entries that do not fit in the Mem.zBuf[], the pointer
    123 # should change sometimes.
    124 #
    125 do_test ptrchng-3.1 {
    126   execsql {
    127     SELECT pointer_change(y, 'text', 'noop', 'blob') FROM t1 WHERE x=2
    128   }
    129 } {0}
    130 do_test ptrchng-3.2 {
    131   execsql {
    132     SELECT pointer_change(y, 'blob', 'noop', 'text') FROM t1 WHERE x=2
    133   }
    134 } {0}
    135 ifcapable utf16 {
    136   do_test ptrchng-3.3 {
    137     execsql {
    138       SELECT pointer_change(y, 'text', 'noop', 'text16') FROM t1 WHERE x=2
    139     }
    140   } {1}
    141   do_test ptrchng-3.4 {
    142     execsql {
    143       SELECT pointer_change(y, 'blob', 'noop', 'text16') FROM t1 WHERE x=2
    144     }
    145   } {1}
    146   do_test ptrchng-3.5 {
    147     execsql {
    148       SELECT pointer_change(y, 'text16', 'noop', 'blob') FROM t1 WHERE x=2
    149     }
    150   } {0}
    151   do_test ptrchng-3.6 {
    152     execsql {
    153       SELECT pointer_change(y, 'text16', 'noop', 'text') FROM t1 WHERE x=2
    154     }
    155   } {1}
    156 }
    157 do_test ptrchng-3.11 {
    158   execsql {
    159     SELECT pointer_change(y, 'text', 'noop', 'blob') FROM t1 WHERE x=4
    160   }
    161 } {0}
    162 do_test ptrchng-3.12 {
    163   execsql {
    164     SELECT pointer_change(y, 'blob', 'noop', 'text') FROM t1 WHERE x=4
    165   }
    166 } {0}
    167 ifcapable utf16 {
    168   do_test ptrchng-3.13 {
    169     execsql {
    170       SELECT pointer_change(y, 'text', 'noop', 'text16') FROM t1 WHERE x=4
    171     }
    172   } {1}
    173   do_test ptrchng-3.14 {
    174     execsql {
    175       SELECT pointer_change(y, 'blob', 'noop', 'text16') FROM t1 WHERE x=4
    176     }
    177   } {1}
    178   do_test ptrchng-3.15 {
    179     execsql {
    180       SELECT pointer_change(y, 'text16', 'noop', 'blob') FROM t1 WHERE x=4
    181     }
    182   } {0}
    183   do_test ptrchng-3.16 {
    184     execsql {
    185       SELECT pointer_change(y, 'text16', 'noop', 'text') FROM t1 WHERE x=4
    186     }
    187   } {1}
    188 }
    189 
    190 # A call to _bytes() should never reformat a _text() or _blob().
    191 #
    192 do_test ptrchng-4.1 {
    193   execsql {
    194     SELECT pointer_change(y, 'text', 'bytes', 'text') FROM t1
    195   }
    196 } {0 0 0 0}
    197 do_test ptrchng-4.2 {
    198   execsql {
    199     SELECT pointer_change(y, 'blob', 'bytes', 'blob') FROM t1
    200   }
    201 } {0 0 0 0}
    202 
    203 # A call to _blob() should never trigger a reformat
    204 #
    205 do_test ptrchng-5.1 {
    206   execsql {
    207     SELECT pointer_change(y, 'text', 'bytes', 'blob') FROM t1
    208   }
    209 } {0 0 0 0}
    210 ifcapable utf16 {
    211   do_test ptrchng-5.2 {
    212     execsql {
    213       SELECT pointer_change(y, 'text16', 'noop', 'blob') FROM t1
    214     }
    215   } {0 0 0 0}
    216   do_test ptrchng-5.3 {
    217     execsql {
    218       SELECT pointer_change(y, 'text16', 'bytes16', 'blob') FROM t1
    219     }
    220   } {0 0 0 0}
    221 }
    222 
    223 finish_test
    224