persistentstorage/sqlite3api/TEST/TclScript/ptrchng.test
changeset 0 08ec8eefde2f
equal deleted inserted replaced
-1:000000000000 0:08ec8eefde2f
       
     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