Merge trunk into this branch.
[sqlite.git] / test / join9.test
blobe547d4ce7084beb5e63a2f388157f40012f18aa4
1 # 2022-04-16
3 # The author disclaims copyright to this source code.  In place of
4 # a legal notice, here is a blessing:
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.
10 #***********************************************************************
11 # This file implements regression tests for SQLite library.
13 # This file implements tests for RIGHT and FULL OUTER JOINs.
15 set testdir [file dirname $argv0]
16 source $testdir/tester.tcl
18 foreach {id schema} {
19   1 {
20     CREATE TABLE t3(id INTEGER PRIMARY KEY, w TEXT);
21     CREATE TABLE t4(id INTEGER PRIMARY KEY, x TEXT);
22     CREATE TABLE t5(id INTEGER PRIMARY KEY, y TEXT);
23     CREATE TABLE t6(id INTEGER PRIMARY KEY, z INT);
24     CREATE VIEW dual(dummy) AS VALUES('x');
25     INSERT INTO t3(id,w) VALUES(2,'two'),(3,'three'),(6,'six'),(7,'seven');
26     INSERT INTO t4(id,x) VALUES(2,'alice'),(4,'bob'),(6,'cindy'),(8,'dave');
27     INSERT INTO t5(id,y) VALUES(1,'red'),(2,'orange'),(3,'yellow'),(4,'green'),
28                                (5,'blue');
29     INSERT INTO t6(id,z) VALUES(3,333),(4,444),(5,555),(0,1000),(9,999);
30   }
31   2 {
32     CREATE TABLE t3(id INT PRIMARY KEY, w TEXT) WITHOUT ROWID;
33     CREATE TABLE t4(id INT PRIMARY KEY, x TEXT) WITHOUT ROWID;
34     CREATE TABLE t5(id INT PRIMARY KEY, y TEXT) WITHOUT ROWID;
35     CREATE TABLE t6(id INT PRIMARY KEY, z INT) WITHOUT ROWID;
36     CREATE TABLE dual(dummy TEXT);
37     INSERT INTO dual(dummy) VALUES('x');
38     INSERT INTO t3(id,w) VALUES(2,'two'),(3,'three'),(6,'six'),(7,'seven');
39     INSERT INTO t4(id,x) VALUES(2,'alice'),(4,'bob'),(6,'cindy'),(8,'dave');
40     INSERT INTO t5(id,y) VALUES(1,'red'),(2,'orange'),(3,'yellow'),(4,'green'),
41                                (5,'blue');
42     INSERT INTO t6(id,z) VALUES(3,333),(4,444),(5,555),(0,1000),(9,999);
43   }
44   3 {
45     CREATE TABLE t3x(id INTEGER PRIMARY KEY, w TEXT);
46     CREATE TABLE t4x(id INTEGER PRIMARY KEY, x TEXT);
47     CREATE TABLE t5x(id INTEGER PRIMARY KEY, y TEXT);
48     CREATE TABLE t6x(id INTEGER PRIMARY KEY, z INT);
49     CREATE VIEW dual(dummy) AS VALUES('x');
50     INSERT INTO t3x(id,w) VALUES(2,'two'),(3,'three'),(6,'six'),(7,'seven');
51     INSERT INTO t4x(id,x) VALUES(2,'alice'),(4,'bob'),(6,'cindy'),(8,'dave');
52     INSERT INTO t5x(id,y) VALUES(1,'red'),(2,'orange'),(3,'yellow'),(4,'green'),
53                                (5,'blue');
54     INSERT INTO t6x(id,z) VALUES(3,333),(4,444),(5,555),(0,1000),(9,999);
55     CREATE VIEW t3 AS SELECT * FROM t3x LIMIT 1000;
56     CREATE VIEW t4 AS SELECT * FROM t4x LIMIT 1000;
57     CREATE VIEW t5 AS SELECT * FROM t5x LIMIT 1000;
58     CREATE VIEW t6 AS SELECT * FROM t6x LIMIT 1000;
59   }
60   4 {
61     CREATE TABLE t3a(id INTEGER PRIMARY KEY, w TEXT);
62     CREATE TABLE t3b(id INTEGER PRIMARY KEY, w TEXT);
63     CREATE TABLE t4a(id INTEGER PRIMARY KEY, x TEXT);
64     CREATE TABLE t4b(id INTEGER PRIMARY KEY, x TEXT);
65     CREATE TABLE t5a(id INTEGER PRIMARY KEY, y TEXT);
66     CREATE TABLE t5b(id INTEGER PRIMARY KEY, y TEXT);
67     CREATE TABLE t6a(id INTEGER PRIMARY KEY, z INT);
68     CREATE TABLE t6b(id INTEGER PRIMARY KEY, z INT);
69     CREATE VIEW dual(dummy) AS VALUES('x');
70     INSERT INTO t3a(id,w) VALUES(2,'two'),(3,'three');
71     INSERT INTO t3b(id,w) VALUES(6,'six'),(7,'seven');
72     INSERT INTO t4a(id,x) VALUES(2,'alice'),(4,'bob');
73     INSERT INTO t4b(id,x) VALUES(6,'cindy'),(8,'dave');
74     INSERT INTO t5a(id,y) VALUES(1,'red'),(2,'orange'),(3,'yellow');
75     INSERT INTO t5b(id,y) VALUES(4,'green'),(5,'blue');
76     INSERT INTO t6a(id,z) VALUES(3,333),(4,444);
77     INSERT INTO t6b(id,z) VALUES(5,555),(0,1000),(9,999);
78     CREATE VIEW t3 AS SELECT * FROM t3a UNION ALL SELECT * FROM t3b;
79     CREATE VIEW t4 AS SELECT * FROM t4a UNION ALL SELECT * FROM t4b;
80     CREATE VIEW t5 AS SELECT * FROM t5a UNION ALL SELECT * FROM t5b;
81     CREATE VIEW t6 AS SELECT * FROM t6a UNION ALL SELECT * FROM t6b;
82   }
83   5 {
84     CREATE TABLE t3a(id INTEGER PRIMARY KEY, w TEXT) WITHOUT ROWID;
85     CREATE TABLE t3b(id INTEGER PRIMARY KEY, w TEXT);
86     CREATE TABLE t4a(id INTEGER PRIMARY KEY, x TEXT) WITHOUT ROWID;
87     CREATE TABLE t4b(id INTEGER PRIMARY KEY, x TEXT) WITHOUT ROWID;
88     CREATE TABLE t5a(id INTEGER PRIMARY KEY, y TEXT);
89     CREATE TABLE t5b(id INTEGER PRIMARY KEY, y TEXT) WITHOUT ROWID;
90     CREATE TABLE t6a(id INTEGER PRIMARY KEY, z INT);
91     CREATE TABLE t6b(id INTEGER PRIMARY KEY, z INT);
92     CREATE VIEW dual(dummy) AS VALUES('x');
93     INSERT INTO t3a(id,w) VALUES(2,'two'),(3,'three');
94     INSERT INTO t3b(id,w) VALUES(6,'six'),(7,'seven');
95     INSERT INTO t4a(id,x) VALUES(2,'alice'),(4,'bob');
96     INSERT INTO t4b(id,x) VALUES(6,'cindy'),(8,'dave');
97     INSERT INTO t5a(id,y) VALUES(1,'red'),(2,'orange'),(3,'yellow');
98     INSERT INTO t5b(id,y) VALUES(4,'green'),(5,'blue');
99     INSERT INTO t6a(id,z) VALUES(3,333),(4,444);
100     INSERT INTO t6b(id,z) VALUES(5,555),(0,1000),(9,999);
101     CREATE VIEW t3 AS SELECT * FROM t3a UNION ALL SELECT * FROM t3b;
102     CREATE VIEW t4 AS SELECT * FROM t4a UNION ALL SELECT * FROM t4b LIMIT 50;
103     CREATE VIEW t5 AS SELECT * FROM t5a UNION ALL SELECT * FROM t5b LIMIT 100;
104     CREATE VIEW t6 AS SELECT * FROM t6a UNION ALL SELECT * FROM t6b;
105   }
106 } {
107   reset_db
108   db nullvalue -
109   do_execsql_test join9-$id.setup $schema {}
111   # Verifid by PG-14 for case 1
112   do_execsql_test join9-$id.100 {
113     SELECT *, t4.id, t5.id, t6.id
114       FROM t4 NATURAL LEFT JOIN t5 NATURAL LEFT JOIN t6
115      ORDER BY 1;
116   } {
117     2   alice  orange  -    2   2   - 
118     4   bob    green   444  4   4   4 
119     6   cindy  -       -    6   -   - 
120     8   dave   -       -    8   -   - 
121   }
123   do_execsql_test join9-$id.101 {
124     SELECT *, t4.id, t5.id, t6.id
125       FROM t4 NATURAL LEFT JOIN t5 NATURAL LEFT JOIN t6
126      ORDER BY id;
127   } {
128     2   alice  orange  -    2   2   - 
129     4   bob    green   444  4   4   4 
130     6   cindy  -       -    6   -   - 
131     8   dave   -       -    8   -   - 
132   }
133   do_execsql_test join9-$id.102 {
134     SELECT *, t4.id, t5.id, t6.id
135       FROM t4 LEFT JOIN t5 USING(id) LEFT JOIN t6 USING(id)
136      ORDER BY id;
137   } {
138     2   alice  orange  -    2   2   - 
139     4   bob    green   444  4   4   4 
140     6   cindy  -       -    6   -   - 
141     8   dave   -       -    8   -   - 
142   }
144   # Verifid by PG-14 using case 1
145   do_execsql_test join9-$id.200 {
146     SELECT id, x, y, z, t4.id, t5.id, t6.id
147       FROM t5 NATURAL RIGHT JOIN t4 NATURAL LEFT JOIN t6
148      ORDER BY 1;
149   } {
150     2   alice  orange  -    2   2   - 
151     4   bob    green   444  4   4   4 
152     6   cindy  -       -    6   -   - 
153     8   dave   -       -    8   -   - 
154   }
156   do_execsql_test join9-$id.201 {
157     SELECT id, x, y, z, t4.id, t5.id, t6.id
158       FROM t5 NATURAL RIGHT JOIN t4 NATURAL LEFT JOIN t6
159      ORDER BY id;
160   } {
161     2   alice  orange  -    2   2   - 
162     4   bob    green   444  4   4   4 
163     6   cindy  -       -    6   -   - 
164     8   dave   -       -    8   -   - 
165   }
167   # Verified by PG-14 using case 1
168   do_execsql_test join9-$id.300 {
169     SELECT *, t4.id, t5.id, t6.id
170       FROM t4 NATURAL RIGHT JOIN t5 NATURAL RIGHT JOIN t6
171      ORDER BY 1;
172   } {
173     0   -    -       1000  -   -   0 
174     3   -    yellow  333   -   3   3 
175     4   bob  green   444   4   4   4 
176     5   -    blue    555   -   5   5 
177     9   -    -       999   -   -   9 
178   }
180   do_execsql_test join9-$id.301 {
181     SELECT *, t4.id, t5.id, t6.id
182       FROM t4 NATURAL RIGHT JOIN t5 NATURAL RIGHT JOIN t6
183      ORDER BY id;
184   } {
185     0   -    -       1000  -   -   0 
186     3   -    yellow  333   -   3   3 
187     4   bob  green   444   4   4   4 
188     5   -    blue    555   -   5   5 
189     9   -    -       999   -   -   9 
190   }
192   # Verified by PG-14 for case 1
193   do_execsql_test join9-$id.400 {
194     SELECT *, t4.id, t5.id, t6.id
195       FROM t4 NATURAL FULL JOIN t5 NATURAL FULL JOIN t6
196      ORDER BY 1;
197   } {
198     0    -      -       1000  -   -   0 
199     1    -      red     -     -   1   - 
200     2    alice  orange  -     2   2   - 
201     3    -      yellow  333   -   3   3 
202     4    bob    green   444   4   4   4 
203     5    -      blue    555   -   5   5 
204     6    cindy  -       -     6   -   - 
205     8    dave   -       -     8   -   - 
206     9    -      -       999   -   -   9 
207   }
209   do_execsql_test join9-$id.401 {
210     SELECT *, t4.id, t5.id, t6.id
211       FROM t4 NATURAL FULL JOIN t5 NATURAL FULL JOIN t6
212      ORDER BY id;
213   } {
214     0    -      -       1000  -   -   0 
215     1    -      red     -     -   1   - 
216     2    alice  orange  -     2   2   - 
217     3    -      yellow  333   -   3   3 
218     4    bob    green   444   4   4   4 
219     5    -      blue    555   -   5   5 
220     6    cindy  -       -     6   -   - 
221     8    dave   -       -     8   -   - 
222     9    -      -       999   -   -   9 
223   }
224   do_execsql_test join9-$id.402 {
225     SELECT id, x, y, z, t4.id, t5.id, t6.id
226       FROM t4 NATURAL FULL JOIN t6 NATURAL FULL JOIN t5
227      ORDER BY id;
228   } {
229     0    -      -       1000  -   -   0 
230     1    -      red     -     -   1   - 
231     2    alice  orange  -     2   2   - 
232     3    -      yellow  333   -   3   3 
233     4    bob    green   444   4   4   4 
234     5    -      blue    555   -   5   5 
235     6    cindy  -       -     6   -   - 
236     8    dave   -       -     8   -   - 
237     9    -      -       999   -   -   9 
238   }
239   do_execsql_test join9-$id.403 {
240     SELECT id, x, y, z, t4.id, t5.id, t6.id
241       FROM t5 NATURAL FULL JOIN t4 NATURAL FULL JOIN t6
242      ORDER BY id;
243   } {
244     0    -      -       1000  -   -   0 
245     1    -      red     -     -   1   - 
246     2    alice  orange  -     2   2   - 
247     3    -      yellow  333   -   3   3 
248     4    bob    green   444   4   4   4 
249     5    -      blue    555   -   5   5 
250     6    cindy  -       -     6   -   - 
251     8    dave   -       -     8   -   - 
252     9    -      -       999   -   -   9 
253   }
254   do_execsql_test join9-$id.404 {
255     SELECT id, x, y, z, t4.id, t5.id, t6.id
256       FROM t5 NATURAL FULL JOIN t6 NATURAL FULL JOIN t4
257      ORDER BY id;
258   } {
259     0    -      -       1000  -   -   0 
260     1    -      red     -     -   1   - 
261     2    alice  orange  -     2   2   - 
262     3    -      yellow  333   -   3   3 
263     4    bob    green   444   4   4   4 
264     5    -      blue    555   -   5   5 
265     6    cindy  -       -     6   -   - 
266     8    dave   -       -     8   -   - 
267     9    -      -       999   -   -   9 
268   }
269   do_execsql_test join9-$id.405 {
270     SELECT id, x, y, z, t4.id, t5.id, t6.id
271       FROM t6 NATURAL FULL JOIN t4 NATURAL FULL JOIN t5
272      ORDER BY id;
273   } {
274     0    -      -       1000  -   -   0 
275     1    -      red     -     -   1   - 
276     2    alice  orange  -     2   2   - 
277     3    -      yellow  333   -   3   3 
278     4    bob    green   444   4   4   4 
279     5    -      blue    555   -   5   5 
280     6    cindy  -       -     6   -   - 
281     8    dave   -       -     8   -   - 
282     9    -      -       999   -   -   9 
283   }
284   do_execsql_test join9-$id.406 {
285     SELECT id, x, y, z, t4.id, t5.id, t6.id
286       FROM t6 NATURAL FULL JOIN t5 NATURAL FULL JOIN t4
287      ORDER BY id;
288   } {
289     0    -      -       1000  -   -   0 
290     1    -      red     -     -   1   - 
291     2    alice  orange  -     2   2   - 
292     3    -      yellow  333   -   3   3 
293     4    bob    green   444   4   4   4 
294     5    -      blue    555   -   5   5 
295     6    cindy  -       -     6   -   - 
296     8    dave   -       -     8   -   - 
297     9    -      -       999   -   -   9 
298   }
300   # Verified by PG-14 using case 1
301   do_execsql_test join9-$id.500 {
302     SELECT id, w, x, y, z
303       FROM t3 FULL JOIN t4 USING(id)
304               NATURAL FULL JOIN t5
305               FULL JOIN t6 USING(id)
306       ORDER BY 1;
307   } {
308     0   -      -      -       1000
309     1   -      -      red     -   
310     2   two    alice  orange  -   
311     3   three  -      yellow  333 
312     4   -      bob    green   444 
313     5   -      -      blue    555 
314     6   six    cindy  -       -   
315     7   seven  -      -       -   
316     8   -      dave   -       -   
317     9   -      -      -       999 
318   }
320   # Verified by PG-14 using case 1
321   do_execsql_test join9-$id.600 {
322     SELECT id, w, x, y, z
323        FROM t3 JOIN dual AS d1 ON true
324                FULL JOIN t4 USING(id)
325                JOIN dual AS d2 ON true
326                NATURAL FULL JOIN t5
327                JOIN dual AS d3 ON true
328                FULL JOIN t6 USING(id)
329                CROSS JOIN dual AS d4
330       ORDER BY 1;
331   } {
332     0   -      -      -       1000
333     1   -      -      red     -   
334     2   two    alice  orange  -   
335     3   three  -      yellow  333 
336     4   -      bob    green   444 
337     5   -      -      blue    555 
338     6   six    cindy  -       -   
339     7   seven  -      -       -   
340     8   -      dave   -       -   
341     9   -      -      -       999 
342   }
344   # Verified by PG-14 using case 1
345   do_execsql_test join9-$id.700 {
346     SELECT id, w, x, y, z
347        FROM t3 JOIN dual AS d1 ON true
348                FULL JOIN t4 USING(id)
349                JOIN dual AS d2 ON true
350                NATURAL FULL JOIN t5
351                JOIN dual AS d3 ON true
352                FULL JOIN t6 USING(id)
353                CROSS JOIN dual AS d4
354       WHERE x<>'bob' OR x IS NULL
355       ORDER BY 1;
356   } {
357     0   -      -      -       1000
358     1   -      -      red     -   
359     2   two    alice  orange  -   
360     3   three  -      yellow  333 
361     5   -      -      blue    555 
362     6   six    cindy  -       -   
363     7   seven  -      -       -   
364     8   -      dave   -       -   
365     9   -      -      -       999 
366   }
368   # Verified by PG-14 using case 1
369   do_execsql_test join9-$id.800 {
370     WITH t7(id,a) AS MATERIALIZED (SELECT * FROM t4 WHERE false)
371     SELECT *
372       FROM t7 
373            JOIN t7 AS t7b USING(id)
374            FULL JOIN t3 USING(id);
375   } {
376     2   -  -  two  
377     3   -  -  three
378     6   -  -  six  
379     7   -  -  seven
380   }
382   # Verified by PG-14
383   do_execsql_test join9-$id.900 {
384     SELECT *
385       FROM (t3 NATURAL FULL JOIN t4)
386            NATURAL FULL JOIN
387            (t5 NATURAL FULL JOIN t6)
388     ORDER BY 1;
389   } {
390     0   -      -      -       1000
391     1   -      -      red     -   
392     2   two    alice  orange  -   
393     3   three  -      yellow  333 
394     4   -      bob    green   444 
395     5   -      -      blue    555 
396     6   six    cindy  -       -   
397     7   seven  -      -       -   
398     8   -      dave   -       -   
399     9   -      -      -       999 
400   }
401   do_execsql_test join9-$id.910 {
402     SELECT *
403       FROM t3 NATURAL FULL JOIN 
404            (t4 NATURAL FULL JOIN
405             (t5 NATURAL FULL JOIN t6))
406     ORDER BY 1;
407   } {
408     0   -      -      -       1000
409     1   -      -      red     -   
410     2   two    alice  orange  -   
411     3   three  -      yellow  333 
412     4   -      bob    green   444 
413     5   -      -      blue    555 
414     6   six    cindy  -       -   
415     7   seven  -      -       -   
416     8   -      dave   -       -   
417     9   -      -      -       999 
418   }
419   do_execsql_test join9-$id.920 {
420     SELECT *
421       FROM t3 FULL JOIN (
422                 t4 FULL JOIN (
423                     t5 FULL JOIN t6 USING (id)
424                 ) USING(id)
425            ) USING(id)
426     ORDER BY 1;
427   } {
428     0   -      -      -       1000
429     1   -      -      red     -   
430     2   two    alice  orange  -   
431     3   three  -      yellow  333 
432     4   -      bob    green   444 
433     5   -      -      blue    555 
434     6   six    cindy  -       -   
435     7   seven  -      -       -   
436     8   -      dave   -       -   
437     9   -      -      -       999 
438   }
439   do_execsql_test join9-$id.920 {
440     SELECT *
441       FROM t3 FULL JOIN (
442                 t4 FULL JOIN (
443                     t5 FULL JOIN t6 USING (id)
444                 ) USING(id)
445            ) USING(id)
446     ORDER BY 1;
447   } {
448     0   -      -      -       1000
449     1   -      -      red     -   
450     2   two    alice  orange  -   
451     3   three  -      yellow  333 
452     4   -      bob    green   444 
453     5   -      -      blue    555 
454     6   six    cindy  -       -   
455     7   seven  -      -       -   
456     8   -      dave   -       -   
457     9   -      -      -       999 
458   }
460   # Verified by PG-14
461   do_execsql_test join9-$id.930 {
462     SELECT *
463       FROM t3 FULL JOIN (
464                t4 FULL JOIN (
465                    t5 FULL JOIN t6 USING(id)
466                ) USING(id)
467            ) AS j1 ON j1.id=t3.id
468      ORDER BY coalesce(t3.id,j1.id);
469   } {
470     -   -      0   -      -       1000
471     -   -      1   -      red     -   
472     2   two    2   alice  orange  -   
473     3   three  3   -      yellow  333 
474     -   -      4   bob    green   444 
475     -   -      5   -      blue    555 
476     6   six    6   cindy  -       -   
477     7   seven  -   -      -       -   
478     -   -      8   dave   -       -   
479     -   -      9   -      -       999 
480   }
482   # Verified by PG-14
483   do_execsql_test join9-$id.940 {
484     SELECT *
485       FROM t3 FULL JOIN (
486                 t4 RIGHT JOIN (
487                     t5 FULL JOIN t6 USING(id)
488                 ) USING(id)
489            ) AS j1 ON j1.id=t3.id
490      ORDER BY coalesce(t3.id,j1.id);
491   } {
492     -   -      0   -      -       1000
493     -   -      1   -      red     -   
494     2   two    2   alice  orange  -   
495     3   three  3   -      yellow  333 
496     -   -      4   bob    green   444 
497     -   -      5   -      blue    555 
498     6   six    -   -      -       -   
499     7   seven  -   -      -       -   
500     -   -      9   -      -       999 
501   }
503   # Verified by PG-14
504   do_execsql_test join9-$id.950 {
505     SELECT *
506       FROM t3 FULL JOIN (
507                 t4 LEFT JOIN (
508                     t5 FULL JOIN t6 USING(id)
509                 ) USING(id)
510            ) AS j1 ON j1.id=t3.id
511      ORDER BY coalesce(t3.id,j1.id);
512   } {
513     2   two    2   alice  orange  -  
514     3   three  -   -      -       -  
515     -   -      4   bob    green   444
516     6   six    6   cindy  -       -  
517     7   seven  -   -      -       -  
518     -   -      8   dave   -       -  
519   }
521   # Restriction (27) in the query flattener
522   # Verified by PG-14
523   do_execsql_test join9-$id.1000 {
524     WITH t56(id,y,z) AS (SELECT * FROM t5 FULL JOIN t6 USING(id) LIMIT 50)
525     SELECT id,x,y,z FROM t4 JOIN t56 USING(id)
526     ORDER BY 1;
527   } {
528     2   alice  orange  -  
529     4   bob    green   444
530   }
532   # Verified by PG-14
533   do_execsql_test join9-$id.1010 {
534     SELECT id,x,y,z
535       FROM t4 INNER JOIN (t5 FULL JOIN t6 USING(id)) USING(id)
536      ORDER BY 1;
537   } {
538     2   alice  orange  -  
539     4   bob    green   444
540   }
542   # Verified by PG-14
543   do_execsql_test join9-$id.1020 {
544     SELECT id,x,y,z
545       FROM t4 FULL JOIN t5 USING(id) INNER JOIN t6 USING(id)
546      ORDER BY 1;
547   } {
548     3   -    yellow  333
549     4   bob  green   444
550     5   -    blue    555
551   }
553   # Verified by PG-14
554   do_execsql_test join9-$id.1030 {
555     WITH t45(id,x,y) AS (SELECT * FROM t4 FULL JOIN t5 USING(id) LIMIT 50)
556     SELECT id,x,y,z FROM t45 JOIN t6 USING(id)
557     ORDER BY 1;
558   } {
559     3   -    yellow  333
560     4   bob  green   444
561     5   -    blue    555
562   }
565 finish_test