modernc.org/ql@v1.4.7/go1.8_test.go (about) 1 // +build go1.8 2 3 package ql // import "modernc.org/ql" 4 5 import ( 6 "context" 7 "database/sql" 8 "testing" 9 ) 10 11 func TestMultiResultSet(t *testing.T) { 12 RegisterMemDriver() 13 db, err := sql.Open("ql-mem", "") 14 if err != nil { 15 t.Fatal(err) 16 } 17 defer db.Close() 18 rows, err := db.Query(`select 1;select 2;select 3;`) 19 if err != nil { 20 t.Fatal(err) 21 } 22 defer rows.Close() 23 24 var i int 25 for rows.Next() { 26 if err := rows.Scan(&i); err != nil { 27 t.Fatal(err) 28 } 29 if i != 1 { 30 t.Fatalf("expected 1, got %d", i) 31 } 32 } 33 if !rows.NextResultSet() { 34 t.Fatal("expected more result sets", rows.Err()) 35 } 36 for rows.Next() { 37 if err := rows.Scan(&i); err != nil { 38 t.Fatal(err) 39 } 40 if i != 2 { 41 t.Fatalf("expected 2, got %d", i) 42 } 43 } 44 45 // Make sure that if we ignore a result we can still query. 46 47 rows, err = db.Query("select 4; select 5") 48 if err != nil { 49 t.Fatal(err) 50 } 51 defer rows.Close() 52 53 for rows.Next() { 54 if err := rows.Scan(&i); err != nil { 55 t.Fatal(err) 56 } 57 if i != 4 { 58 t.Fatalf("expected 4, got %d", i) 59 } 60 } 61 if !rows.NextResultSet() { 62 t.Fatal("expected more result sets", rows.Err()) 63 } 64 for rows.Next() { 65 if err := rows.Scan(&i); err != nil { 66 t.Fatal(err) 67 } 68 if i != 5 { 69 t.Fatalf("expected 5, got %d", i) 70 } 71 } 72 if rows.NextResultSet() { 73 t.Fatal("unexpected result set") 74 } 75 } 76 77 func TestNamedArgs(t *testing.T) { 78 RegisterMemDriver() 79 db, err := sql.Open("ql-mem", "") 80 if err != nil { 81 t.Fatal(err) 82 } 83 defer db.Close() 84 85 rows, err := db.QueryContext( 86 context.Background(), 87 `select $two;select $one;select $three;`, 88 sql.Named("one", 2), 89 sql.Named("two", 1), 90 sql.Named("three", 3), 91 ) 92 if err != nil { 93 t.Fatal(err) 94 } 95 defer rows.Close() 96 97 var i int 98 for rows.Next() { 99 if err := rows.Scan(&i); err != nil { 100 t.Fatal(err) 101 } 102 if i != 1 { 103 t.Fatalf("expected 1, got %d", i) 104 } 105 } 106 if !rows.NextResultSet() { 107 t.Fatal("expected more result sets", rows.Err()) 108 } 109 for rows.Next() { 110 if err := rows.Scan(&i); err != nil { 111 t.Fatal(err) 112 } 113 if i != 2 { 114 t.Fatalf("expected 2, got %d", i) 115 } 116 } 117 samples := []struct { 118 src, exp string 119 }{ 120 { 121 `select $one;select $two;select $three;`, 122 `select $1 ; select $2 ; select $3 ;`, 123 }, 124 { 125 `select * from foo where t=$1`, 126 `select * from foo where t = $1`, 127 }, 128 { 129 `select * from foo where t=$1&&name=$name`, 130 `select * from foo where t = $1 && name = $2`, 131 }, 132 } 133 for _, s := range samples { 134 e, err := filterNamedArgs(s.src) 135 if err != nil { 136 t.Fatal(err) 137 } 138 139 if e != s.exp { 140 t.Errorf("\nexpected %q\n got %q", s.exp, e) 141 } 142 } 143 144 stmt, err := db.PrepareContext(context.Background(), `select $number`) 145 if err != nil { 146 t.Fatal(err) 147 } 148 var n int 149 err = stmt.QueryRowContext(context.Background(), sql.Named("number", 1)).Scan(&n) 150 if err != nil { 151 t.Fatal(err) 152 } 153 if n != 1 { 154 t.Errorf("expected 1 got %d", n) 155 } 156 }