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 }