github.com/mithrandie/csvq@v1.18.1/lib/query/prepared_statement_test.go (about)

     1  package query
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  
     7  	"github.com/mithrandie/csvq/lib/value"
     8  
     9  	"github.com/mithrandie/csvq/lib/parser"
    10  )
    11  
    12  func TestPreparedStatementMap_Prepare(t *testing.T) {
    13  	m := NewPreparedStatementMap()
    14  
    15  	expr := parser.StatementPreparation{
    16  		Name:      parser.Identifier{Literal: "stmt"},
    17  		Statement: value.NewString("select 1"),
    18  	}
    19  
    20  	expect := GenerateStatementMap([]*PreparedStatement{
    21  		{
    22  			Name:            "stmt",
    23  			StatementString: "select 1",
    24  			Statements: []parser.Statement{
    25  				parser.SelectQuery{
    26  					SelectEntity: parser.SelectEntity{
    27  						SelectClause: parser.SelectClause{
    28  							BaseExpr: parser.NewBaseExpr(parser.Token{Line: 1, Char: 1, SourceFile: "stmt"}),
    29  							Fields: []parser.QueryExpression{
    30  								parser.Field{
    31  									Object: parser.NewIntegerValueFromString("1"),
    32  								},
    33  							},
    34  						},
    35  					},
    36  				},
    37  			},
    38  			HolderNumber: 0,
    39  		},
    40  	})
    41  
    42  	err := m.Prepare(TestTx.Flags, expr)
    43  	if err != nil {
    44  		t.Errorf("unexpected error %q", err)
    45  	} else {
    46  		if !SyncMapEqual(m, expect) {
    47  			t.Errorf("result = %v, want %v", m, expect)
    48  		}
    49  	}
    50  
    51  	expectErr := "statement stmt is a duplicate"
    52  	err = m.Prepare(TestTx.Flags, expr)
    53  	if err == nil {
    54  		t.Errorf("no error, want error %q", expectErr)
    55  	} else {
    56  		if err.Error() != expectErr {
    57  			t.Errorf("error = %q, want error %q", err.Error(), expectErr)
    58  		}
    59  	}
    60  
    61  	expr = parser.StatementPreparation{
    62  		Name:      parser.Identifier{Literal: "stmt2"},
    63  		Statement: value.NewString("select from"),
    64  	}
    65  	expectErr = "prepare stmt2 [L:1 C:8] syntax error: unexpected token \"from\""
    66  	err = m.Prepare(TestTx.Flags, expr)
    67  	if err == nil {
    68  		t.Errorf("no error, want error %q", expectErr)
    69  	} else {
    70  		if err.Error() != expectErr {
    71  			t.Errorf("error = %q, want error %q", err.Error(), expectErr)
    72  		}
    73  	}
    74  }
    75  
    76  func TestPreparedStatementMap_Get(t *testing.T) {
    77  	m := GenerateStatementMap([]*PreparedStatement{
    78  		{
    79  			Name: "stmt",
    80  			Statements: []parser.Statement{
    81  				parser.SelectQuery{
    82  					SelectEntity: parser.SelectEntity{
    83  						SelectClause: parser.SelectClause{
    84  							BaseExpr: parser.NewBaseExpr(parser.Token{Line: 1, Char: 1, SourceFile: "stmt"}),
    85  							Fields: []parser.QueryExpression{
    86  								parser.Field{
    87  									Object: parser.NewIntegerValueFromString("1"),
    88  								},
    89  							},
    90  						},
    91  					},
    92  				},
    93  			},
    94  		},
    95  	})
    96  
    97  	name := parser.Identifier{Literal: "stmt"}
    98  	expect := &PreparedStatement{
    99  		Name: "stmt",
   100  		Statements: []parser.Statement{
   101  			parser.SelectQuery{
   102  				SelectEntity: parser.SelectEntity{
   103  					SelectClause: parser.SelectClause{
   104  						BaseExpr: parser.NewBaseExpr(parser.Token{Line: 1, Char: 1, SourceFile: "stmt"}),
   105  						Fields: []parser.QueryExpression{
   106  							parser.Field{
   107  								Object: parser.NewIntegerValueFromString("1"),
   108  							},
   109  						},
   110  					},
   111  				},
   112  			},
   113  		},
   114  	}
   115  
   116  	stmt, err := m.Get(name)
   117  	if err != nil {
   118  		t.Errorf("unexpected error %q", err)
   119  	} else {
   120  		if !reflect.DeepEqual(stmt, expect) {
   121  			t.Errorf("result = %v, want %v", stmt, expect)
   122  		}
   123  	}
   124  
   125  	name = parser.Identifier{Literal: "notexist"}
   126  	expectErr := "statement notexist does not exist"
   127  
   128  	_, err = m.Get(name)
   129  	if err == nil {
   130  		t.Errorf("no error, want error %q", expectErr)
   131  	} else if err.Error() != expectErr {
   132  		t.Errorf("error %q, want error %q", err.Error(), expectErr)
   133  	}
   134  }
   135  
   136  func TestPreparedStatementMap_Dispose(t *testing.T) {
   137  	m := GenerateStatementMap([]*PreparedStatement{
   138  		{
   139  			Name: "stmt",
   140  			Statements: []parser.Statement{
   141  				parser.SelectQuery{
   142  					SelectEntity: parser.SelectEntity{
   143  						SelectClause: parser.SelectClause{
   144  							BaseExpr: parser.NewBaseExpr(parser.Token{Line: 1, Char: 1, SourceFile: "stmt"}),
   145  							Fields: []parser.QueryExpression{
   146  								parser.Field{
   147  									Object: parser.NewIntegerValueFromString("1"),
   148  								},
   149  							},
   150  						},
   151  					},
   152  				},
   153  			},
   154  		},
   155  	})
   156  
   157  	expr := parser.DisposeStatement{
   158  		Name: parser.Identifier{Literal: "stmt"},
   159  	}
   160  
   161  	expect := NewPreparedStatementMap()
   162  
   163  	err := m.Dispose(expr)
   164  	if err != nil {
   165  		t.Errorf("unexpected error %q", err)
   166  	} else {
   167  		if !SyncMapEqual(m, expect) {
   168  			t.Errorf("result = %v, want %v", m, expect)
   169  		}
   170  	}
   171  
   172  	expectErr := "statement stmt does not exist"
   173  	err = m.Dispose(expr)
   174  	if err == nil {
   175  		t.Errorf("no error, want error %q", expectErr)
   176  	} else if err.Error() != expectErr {
   177  		t.Errorf("error %q, want error %q", err.Error(), expectErr)
   178  	}
   179  }
   180  
   181  func TestNewPreparedStatement(t *testing.T) {
   182  	expr := parser.StatementPreparation{
   183  		Name:      parser.Identifier{Literal: "stmt"},
   184  		Statement: value.NewString("select 1"),
   185  	}
   186  	expect := &PreparedStatement{
   187  		Name:            "stmt",
   188  		StatementString: "select 1",
   189  		Statements: []parser.Statement{
   190  			parser.SelectQuery{
   191  				SelectEntity: parser.SelectEntity{
   192  					SelectClause: parser.SelectClause{
   193  						BaseExpr: parser.NewBaseExpr(parser.Token{Line: 1, Char: 1, SourceFile: "stmt"}),
   194  						Fields: []parser.QueryExpression{
   195  							parser.Field{
   196  								Object: parser.NewIntegerValueFromString("1"),
   197  							},
   198  						},
   199  					},
   200  				},
   201  			},
   202  		},
   203  		HolderNumber: 0,
   204  	}
   205  
   206  	result, err := NewPreparedStatement(TestTx.Flags, expr)
   207  	if err != nil {
   208  		t.Errorf("error %q, want no error", err.Error())
   209  	} else {
   210  		if !reflect.DeepEqual(result, expect) {
   211  			t.Errorf("result = %v, want %v", result, expect)
   212  		}
   213  	}
   214  
   215  	expr = parser.StatementPreparation{
   216  		Name:      parser.Identifier{Literal: "stmt"},
   217  		Statement: value.NewString("select from"),
   218  	}
   219  	expectErr := "prepare stmt [L:1 C:8] syntax error: unexpected token \"from\""
   220  
   221  	_, err = NewPreparedStatement(TestTx.Flags, expr)
   222  	if err == nil {
   223  		t.Errorf("no error, want error %q", expectErr)
   224  	} else if err.Error() != expectErr {
   225  		t.Errorf("error %q, want error %q", err.Error(), expectErr)
   226  	}
   227  }
   228  
   229  func TestNewReplaceValues(t *testing.T) {
   230  	values := []parser.ReplaceValue{
   231  		{Value: parser.NewIntegerValueFromString("1")},
   232  		{Value: parser.NewStringValue("a"), Name: parser.Identifier{Literal: "val"}},
   233  	}
   234  	expect := &ReplaceValues{
   235  		Values: []parser.QueryExpression{
   236  			parser.NewIntegerValueFromString("1"),
   237  			parser.NewStringValue("a"),
   238  		},
   239  		Names: map[string]int{
   240  			"val": 1,
   241  		},
   242  	}
   243  
   244  	result := NewReplaceValues(values)
   245  	if !reflect.DeepEqual(result, expect) {
   246  		t.Errorf("result = %v, want %v", result, expect)
   247  	}
   248  }