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  }