xref: /sqlite-3.40.0/test/ptrchng.test (revision e8f52c50)
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
26set testdir [file dirname $argv0]
27source $testdir/tester.tcl
28
29ifcapable !bloblit {
30  finish_test
31  return
32}
33
34# Register the "pointer_change" SQL function.
35#
36sqlite3_create_function db
37
38do_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#
57do_test ptrchng-2.1 {
58  execsql {
59    SELECT pointer_change(y, 'text', 'noop', 'blob') FROM t1 WHERE x=1
60  }
61} {0}
62do_test ptrchng-2.2 {
63  execsql {
64    SELECT pointer_change(y, 'blob', 'noop', 'text') FROM t1 WHERE x=1
65  }
66} {0}
67ifcapable 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}
89do_test ptrchng-2.11 {
90  execsql {
91    SELECT pointer_change(y, 'text', 'noop', 'blob') FROM t1 WHERE x=3
92  }
93} {0}
94do_test ptrchng-2.12 {
95  execsql {
96    SELECT pointer_change(y, 'blob', 'noop', 'text') FROM t1 WHERE x=3
97  }
98} {0}
99ifcapable 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#
125do_test ptrchng-3.1 {
126  execsql {
127    SELECT pointer_change(y, 'text', 'noop', 'blob') FROM t1 WHERE x=2
128  }
129} {0}
130do_test ptrchng-3.2 {
131  execsql {
132    SELECT pointer_change(y, 'blob', 'noop', 'text') FROM t1 WHERE x=2
133  }
134} {0}
135ifcapable 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}
157do_test ptrchng-3.11 {
158  execsql {
159    SELECT pointer_change(y, 'text', 'noop', 'blob') FROM t1 WHERE x=4
160  }
161} {0}
162do_test ptrchng-3.12 {
163  execsql {
164    SELECT pointer_change(y, 'blob', 'noop', 'text') FROM t1 WHERE x=4
165  }
166} {0}
167ifcapable 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#
192do_test ptrchng-4.1 {
193  execsql {
194    SELECT pointer_change(y, 'text', 'bytes', 'text') FROM t1
195  }
196} {0 0 0 0}
197do_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#
205do_test ptrchng-5.1 {
206  execsql {
207    SELECT pointer_change(y, 'text', 'bytes', 'blob') FROM t1
208  }
209} {0 0 0 0}
210ifcapable 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
223finish_test
224