~ubuntu-branches/ubuntu/precise/mysql-5.1/precise

« back to all changes in this revision

Viewing changes to mysql-test/r/func_rollback.result

  • Committer: Bazaar Package Importer
  • Author(s): Norbert Tretkowski
  • Date: 2010-03-17 14:56:02 UTC
  • Revision ID: james.westby@ubuntu.com-20100317145602-x7e30l1b2sb5s6w6
Tags: upstream-5.1.45
ImportĀ upstreamĀ versionĀ 5.1.45

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
DROP TABLE IF EXISTS t1_select;
 
2
DROP TABLE IF EXISTS t1_aux;
 
3
DROP TABLE IF EXISTS t1_not_null;
 
4
DROP VIEW IF EXISTS v1_not_null;
 
5
DROP VIEW IF EXISTS v1_func;
 
6
DROP TABLE IF EXISTS t1_fail;
 
7
DROP FUNCTION IF EXISTS f1_simple_insert;
 
8
DROP FUNCTION IF EXISTS f1_two_inserts;
 
9
DROP FUNCTION IF EXISTS f1_insert_select;
 
10
SET SESSION AUTOCOMMIT=0;
 
11
SET SESSION sql_mode = '';
 
12
CREATE TABLE t1_select (f1 BIGINT, f2 BIGINT) ENGINE = MEMORY;
 
13
INSERT INTO t1_select(f1,f2) VALUES (1,-1),(2,NULL),(3,0),(4,1),(5,2);
 
14
SELECT * FROM t1_select;
 
15
f1      f2
 
16
1       -1
 
17
2       NULL
 
18
3       0
 
19
4       1
 
20
5       2
 
21
CREATE TABLE t1_not_null (f1 BIGINT, f2 BIGINT NOT NULL)
 
22
ENGINE = <transactional_engine>;
 
23
SELECT * FROM t1_not_null;
 
24
f1      f2
 
25
CREATE TABLE t1_aux (f1 BIGINT, f2 BIGINT)
 
26
ENGINE = <transactional_engine>;
 
27
SELECT * FROM t1_aux;
 
28
f1      f2
 
29
COMMIT;
 
30
CREATE FUNCTION f1_simple_insert(my_f1 INTEGER) RETURNS INTEGER
 
31
BEGIN
 
32
INSERT INTO t1_not_null SET f1 = 10, f2 = my_f1;
 
33
RETURN 1;
 
34
END//
 
35
 
 
36
# One f1_simple_insert execution per row, no NOT NULL violation
 
37
SELECT f1_simple_insert(1);
 
38
f1_simple_insert(1)
 
39
1
 
40
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
41
f1      f2
 
42
10      1
 
43
ROLLBACK;
 
44
SELECT * FROM t1_not_null;
 
45
f1      f2
 
46
SELECT f1_simple_insert(1) FROM t1_select;
 
47
f1_simple_insert(1)
 
48
1
 
49
1
 
50
1
 
51
1
 
52
1
 
53
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
54
f1      f2
 
55
10      1
 
56
10      1
 
57
10      1
 
58
10      1
 
59
10      1
 
60
ROLLBACK;
 
61
SELECT * FROM t1_not_null;
 
62
f1      f2
 
63
 
 
64
# One f1_simple_insert execution per row, NOT NULL violation when the
 
65
# SELECT processes the first row.
 
66
SELECT f1_simple_insert(NULL);
 
67
ERROR 23000: Column 'f2' cannot be null
 
68
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
69
f1      f2
 
70
ROLLBACK;
 
71
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
72
f1      f2
 
73
SELECT f1_simple_insert(NULL) FROM t1_select;
 
74
ERROR 23000: Column 'f2' cannot be null
 
75
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
76
f1      f2
 
77
ROLLBACK;
 
78
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
79
f1      f2
 
80
SELECT 1 FROM (SELECT 1 AS f1,1 AS f2 UNION ALL SELECT 1,NULL) AS t1 WHERE f1_simple_insert(NULL) = 1;
 
81
ERROR 23000: Column 'f2' cannot be null
 
82
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
83
f1      f2
 
84
ROLLBACK;
 
85
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
86
f1      f2
 
87
 
 
88
# One f1_simple_insert execution per row, NOT NULL violation when the
 
89
# SELECT processes the non first row
 
90
SELECT f1_simple_insert(f2) FROM (SELECT 1 AS f1,1 AS f2 UNION ALL SELECT 1,NULL) AS t1;
 
91
ERROR 23000: Column 'f2' cannot be null
 
92
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
93
f1      f2
 
94
ROLLBACK;
 
95
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
96
f1      f2
 
97
SELECT f1_simple_insert(f2) FROM t1_select;
 
98
ERROR 23000: Column 'f2' cannot be null
 
99
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
100
f1      f2
 
101
ROLLBACK;
 
102
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
103
f1      f2
 
104
 
 
105
# Two f1_simple_insert executions per row, NOT NULL violation when the
 
106
# SELECT processes the first row.
 
107
SELECT f1_simple_insert(1),f1_simple_insert(NULL);
 
108
ERROR 23000: Column 'f2' cannot be null
 
109
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
110
f1      f2
 
111
ROLLBACK;
 
112
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
113
f1      f2
 
114
SELECT f1_simple_insert(NULL),f1_simple_insert(1);
 
115
ERROR 23000: Column 'f2' cannot be null
 
116
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
117
f1      f2
 
118
ROLLBACK;
 
119
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
120
f1      f2
 
121
 
 
122
# Two f1_simple_insert executions per row, NOT NULL violation when the
 
123
# SELECT processes the non first row
 
124
SELECT f1_simple_insert(f1),f1_simple_insert(f2) FROM (SELECT 1 AS f1,1 AS f2 UNION ALL SELECT 1,NULL) AS t1;
 
125
ERROR 23000: Column 'f2' cannot be null
 
126
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
127
f1      f2
 
128
ROLLBACK;
 
129
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
130
f1      f2
 
131
SELECT f1_simple_insert(f2),f1_simple_insert(f1) FROM (SELECT 1 AS f1,1 AS f2 UNION ALL SELECT 1,NULL) AS t1;
 
132
ERROR 23000: Column 'f2' cannot be null
 
133
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
134
f1      f2
 
135
ROLLBACK;
 
136
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
137
f1      f2
 
138
SELECT f1_simple_insert(f1),f1_simple_insert(f2) FROM t1_select;
 
139
ERROR 23000: Column 'f2' cannot be null
 
140
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
141
f1      f2
 
142
ROLLBACK;
 
143
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
144
f1      f2
 
145
SELECT f1_simple_insert(f2),f1_simple_insert(f1) FROM t1_select;
 
146
ERROR 23000: Column 'f2' cannot be null
 
147
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
148
f1      f2
 
149
ROLLBACK;
 
150
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
151
f1      f2
 
152
SELECT 1 FROM (SELECT 1 AS f1,1 AS f2 UNION ALL SELECT 1,NULL) AS t1
 
153
WHERE 1 = f1_simple_insert(f2) AND 1 = f1_simple_insert(f1);
 
154
ERROR 23000: Column 'f2' cannot be null
 
155
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
156
f1      f2
 
157
ROLLBACK;
 
158
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
159
f1      f2
 
160
 
 
161
# Nested functions, the inner fails
 
162
SELECT f1_simple_insert(f1_simple_insert(NULL)) FROM t1_select;
 
163
ERROR 23000: Column 'f2' cannot be null
 
164
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
165
f1      f2
 
166
ROLLBACK;
 
167
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
168
f1      f2
 
169
 
 
170
# Nested functions, the outer fails
 
171
SELECT f1_simple_insert(f1_simple_insert(1) + NULL) FROM t1_select;
 
172
ERROR 23000: Column 'f2' cannot be null
 
173
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
174
f1      f2
 
175
ROLLBACK;
 
176
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
177
f1      f2
 
178
DROP FUNCTION f1_simple_insert;
 
179
CREATE FUNCTION f1_insert_select(my_f1 INTEGER) RETURNS INTEGER
 
180
BEGIN
 
181
INSERT INTO t1_not_null SELECT * FROM t1_select WHERE f1 = my_f1;
 
182
RETURN 1;
 
183
END;
 
184
 
 
185
# f1_insert_select(2), tries to INSERT SELECT one row containing NULL
 
186
# The fact that
 
187
# - SELECT f1_insert_select(2);     gives any result set    and
 
188
# - t1_not_null gets a row inserted
 
189
# is covered by the manual.
 
190
SELECT f1_insert_select(2);
 
191
f1_insert_select(2)
 
192
1
 
193
Warnings:
 
194
Warning 1048    Column 'f2' cannot be null
 
195
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
196
f1      f2
 
197
2       0
 
198
ROLLBACK;
 
199
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
200
f1      f2
 
201
DROP FUNCTION f1_insert_select;
 
202
SET SESSION sql_mode = 'traditional';
 
203
CREATE FUNCTION f1_insert_select(my_f1 INTEGER) RETURNS INTEGER
 
204
BEGIN
 
205
INSERT INTO t1_not_null SELECT * FROM t1_select WHERE f1 = my_f1;
 
206
RETURN 1;
 
207
END;
 
208
SELECT f1_insert_select(2);
 
209
ERROR 23000: Column 'f2' cannot be null
 
210
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
211
f1      f2
 
212
ROLLBACK;
 
213
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
214
f1      f2
 
215
DROP FUNCTION f1_insert_select;
 
216
SET SESSION sql_mode = '';
 
217
 
 
218
# Function tries to
 
219
#    1. INSERT statement: Insert one row with NULL -> NOT NULL violation
 
220
#    2. INSERT statement: Insert one row without NULL
 
221
CREATE FUNCTION f1_two_inserts() RETURNS INTEGER
 
222
BEGIN
 
223
INSERT INTO t1_not_null SET f1 = 10, f2 = NULL;
 
224
INSERT INTO t1_not_null SET f1 = 10, f2 = 10;
 
225
RETURN 1;
 
226
END//
 
227
SELECT f1_two_inserts();
 
228
ERROR 23000: Column 'f2' cannot be null
 
229
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
230
f1      f2
 
231
ROLLBACK;
 
232
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
233
f1      f2
 
234
DROP FUNCTION f1_two_inserts;
 
235
 
 
236
# Function tries to
 
237
#    1. INSERT statement: Insert one row without NULL
 
238
#    2. INSERT statement: Insert one row with NULL -> NOT NULL violation
 
239
CREATE FUNCTION f1_two_inserts() RETURNS INTEGER
 
240
BEGIN
 
241
INSERT INTO t1_not_null SET f1 = 10, f2 = 10;
 
242
INSERT INTO t1_not_null SET f1 = 10, f2 = NULL;
 
243
RETURN 1;
 
244
END//
 
245
SELECT f1_two_inserts();
 
246
ERROR 23000: Column 'f2' cannot be null
 
247
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
248
f1      f2
 
249
ROLLBACK;
 
250
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
251
f1      f2
 
252
 
 
253
# Function tries to
 
254
#    INSERT statement: Insert two rows
 
255
#                      first row without NULL
 
256
#                      second row with NULL -> NOT NULL violation
 
257
#       -> NOT NULL violation
 
258
CREATE FUNCTION f1_insert_with_two_rows() RETURNS INTEGER
 
259
BEGIN
 
260
INSERT INTO t1_not_null(f1,f2) VALUES (10,10),(10,NULL);
 
261
RETURN 1;
 
262
END;
 
263
# The fact that
 
264
# - SELECT f1_insert_with_two_rows();     gives any result set    and
 
265
# - t1_not_null gets a row inserted
 
266
# is covered by the manual.
 
267
SELECT f1_insert_with_two_rows();
 
268
f1_insert_with_two_rows()
 
269
1
 
270
Warnings:
 
271
Warning 1048    Column 'f2' cannot be null
 
272
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
273
f1      f2
 
274
10      0
 
275
10      10
 
276
ROLLBACK;
 
277
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
278
f1      f2
 
279
DROP FUNCTION f1_insert_with_two_rows;
 
280
SET SESSION sql_mode = 'traditional';
 
281
CREATE FUNCTION f1_insert_with_two_rows() RETURNS INTEGER
 
282
BEGIN
 
283
INSERT INTO t1_not_null(f1,f2) VALUES (10,10),(10,NULL);
 
284
RETURN 1;
 
285
END;
 
286
SELECT f1_insert_with_two_rows();
 
287
ERROR 23000: Column 'f2' cannot be null
 
288
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
289
f1      f2
 
290
ROLLBACK;
 
291
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
292
f1      f2
 
293
SET SESSION sql_mode = '';
 
294
 
 
295
# FUNCTION in Correlated Subquery
 
296
SELECT 1 FROM t1_select t1
 
297
WHERE 1 = (SELECT f1_insert_with_two_rows() FROM t1_select t2
 
298
WHERE t2.f1 = t1.f1);
 
299
ERROR 23000: Column 'f2' cannot be null
 
300
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
301
f1      f2
 
302
ROLLBACK;
 
303
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
304
f1      f2
 
305
 
 
306
# FUNCTION in JOIN
 
307
SELECT 1 FROM t1_select t1, t1_select t2
 
308
WHERE t1.f1 = t2.f1 AND t2.f1 = f1_insert_with_two_rows();
 
309
ERROR 23000: Column 'f2' cannot be null
 
310
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
311
f1      f2
 
312
ROLLBACK;
 
313
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
314
f1      f2
 
315
SELECT STRAIGHT_JOIN * FROM t1_select t2 RIGHT JOIN t1_select t1
 
316
ON t1.f1 = t1.f1 WHERE 1 = f1_insert_with_two_rows();
 
317
ERROR 23000: Column 'f2' cannot be null
 
318
DROP FUNCTION f1_insert_with_two_rows;
 
319
 
 
320
# FUNCTION in UNION
 
321
SELECT 1
 
322
UNION ALL
 
323
SELECT f1_two_inserts();
 
324
ERROR 23000: Column 'f2' cannot be null
 
325
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
326
f1      f2
 
327
ROLLBACK;
 
328
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
329
f1      f2
 
330
 
 
331
# FUNCTION in INSERT
 
332
INSERT INTO t1_aux SET f1 = 1, f2 = f1_two_inserts();
 
333
ERROR 23000: Column 'f2' cannot be null
 
334
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
335
f1      f2
 
336
ROLLBACK;
 
337
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
338
f1      f2
 
339
INSERT INTO t1_aux SELECT 1, f1_two_inserts();
 
340
ERROR 23000: Column 'f2' cannot be null
 
341
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
342
f1      f2
 
343
ROLLBACK;
 
344
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
345
f1      f2
 
346
SELECT * FROM t1_aux ORDER BY f1,f2;
 
347
f1      f2
 
348
INSERT INTO t1_aux VALUES(1,f1_two_inserts());
 
349
ERROR 23000: Column 'f2' cannot be null
 
350
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
351
f1      f2
 
352
SELECT * FROM t1_aux ORDER BY f1,f2;
 
353
f1      f2
 
354
 
 
355
# FUNCTION in DELETE
 
356
INSERT INTO t1_aux VALUES (1,1);
 
357
COMMIT;
 
358
DELETE FROM t1_aux WHERE f1 = f1_two_inserts();
 
359
ERROR 23000: Column 'f2' cannot be null
 
360
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
361
f1      f2
 
362
ROLLBACK;
 
363
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
364
f1      f2
 
365
SELECT * FROM t1_aux ORDER BY f1,f2;
 
366
f1      f2
 
367
1       1
 
368
 
 
369
# FUNCTION in UPDATE SET
 
370
UPDATE t1_aux SET f2 = f1_two_inserts() + 1;
 
371
ERROR 23000: Column 'f2' cannot be null
 
372
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
373
f1      f2
 
374
ROLLBACK;
 
375
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
376
f1      f2
 
377
SELECT * FROM t1_aux ORDER BY f1,f2;
 
378
f1      f2
 
379
1       1
 
380
 
 
381
# FUNCTION in VIEW definition
 
382
CREATE VIEW v1_func AS SELECT f1_two_inserts() FROM t1_select;
 
383
SELECT * FROM v1_func;
 
384
ERROR 23000: Column 'f2' cannot be null
 
385
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
386
f1      f2
 
387
ROLLBACK;
 
388
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
389
f1      f2
 
390
DROP VIEW v1_func;
 
391
 
 
392
# FUNCTION in CREATE TABLE ... AS SELECT
 
393
CREATE TABLE t1_fail AS SELECT f1_two_inserts() FROM t1_select;
 
394
ERROR 23000: Column 'f2' cannot be null
 
395
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
396
f1      f2
 
397
CREATE TABLE t1_fail AS SELECT * FROM t1_select WHERE 1 = f1_two_inserts();
 
398
ERROR 23000: Column 'f2' cannot be null
 
399
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
400
f1      f2
 
401
 
 
402
# FUNCTION in ORDER BY
 
403
SELECT * FROM t1_select ORDER BY f1,f1_two_inserts();
 
404
ERROR 23000: Column 'f2' cannot be null
 
405
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
406
f1      f2
 
407
 
 
408
# FUNCTION in aggregate function
 
409
SELECT AVG(f1_two_inserts()) FROM t1_select;
 
410
ERROR 23000: Column 'f2' cannot be null
 
411
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
412
f1      f2
 
413
 
 
414
# FUNCTION in HAVING
 
415
SELECT 1 FROM t1_select HAVING AVG(f1) = f1_two_inserts() + 2;
 
416
ERROR 23000: Column 'f2' cannot be null
 
417
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
418
f1      f2
 
419
DROP FUNCTION f1_two_inserts;
 
420
 
 
421
# FUNCTION modifies Updatable VIEW
 
422
CREATE VIEW v1_not_null AS SELECT f1,f2 FROM t1_not_null WITH CHECK OPTION;
 
423
CREATE FUNCTION f1_two_inserts_v1() RETURNS INTEGER
 
424
BEGIN
 
425
INSERT INTO v1_not_null SET f1 = 10, f2 = 10;
 
426
INSERT INTO v1_not_null SET f1 = 10, f2 = NULL;
 
427
RETURN 1;
 
428
END//
 
429
SELECT f1_two_inserts_v1();
 
430
ERROR 23000: Column 'f2' cannot be null
 
431
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
432
f1      f2
 
433
ROLLBACK;
 
434
SELECT * FROM t1_not_null ORDER BY f1,f2;
 
435
f1      f2
 
436
DROP FUNCTION f1_two_inserts_v1;
 
437
DROP VIEW v1_not_null;
 
438
 
 
439
# FUNCTION causes FOREIGN KEY constraint violation
 
440
CREATE TABLE t1_parent (f1 BIGINT, f2 BIGINT, PRIMARY KEY(f1))
 
441
ENGINE = InnoDB;
 
442
INSERT INTO t1_parent VALUES (1,1);
 
443
CREATE TABLE t1_child (f1 BIGINT, f2 BIGINT, PRIMARY KEY(f1),
 
444
FOREIGN KEY (f1) REFERENCES t1_parent(f1))
 
445
ENGINE = InnoDB;
 
446
CREATE FUNCTION f1_two_inserts() RETURNS INTEGER
 
447
BEGIN
 
448
INSERT INTO t1_child SET f1 = 1, f2 = 1;
 
449
INSERT INTO t1_child SET f1 = 2, f2 = 2;
 
450
RETURN 1;
 
451
END//
 
452
SELECT f1_two_inserts();
 
453
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test`.`t1_child`, CONSTRAINT `t1_child_ibfk_1` FOREIGN KEY (`f1`) REFERENCES `t1_parent` (`f1`))
 
454
SELECT * FROM t1_child;
 
455
f1      f2
 
456
DROP TABLE t1_child;
 
457
DROP TABLE t1_parent;
 
458
DROP FUNCTION f1_two_inserts;
 
459
DROP TABLE t1_select;
 
460
DROP TABLE t1_aux;
 
461
DROP TABLE t1_not_null;