func fuzzSingle(stmt parser.Statement) (interestingness int) { var lastExpr parser.Expr rcvr := func() { if r := recover(); r != nil { if !expected(fmt.Sprintf("%v", r)) { fmt.Printf("Stmt: %s\n%s", stmt, spew.Sdump(stmt)) if lastExpr != nil { fmt.Printf("Expr: %s", spew.Sdump(lastExpr)) } panic(r) } // Anything that has expected errors in it is fine, but not as // interesting as things that go through. interestingness = 1 } } defer rcvr() data0 := stmt.String() // TODO(tschottdorf): again, this is since we're ignoring stuff in the // grammar instead of erroring out on unsupported language. See: // https://github.com/cockroachdb/cockroach/issues/1949 if strings.Contains(data0, "%!s(<nil>)") { return 0 } stmt1, err := parser.Parse(data0) if err != nil { fmt.Printf("AST: %s", spew.Sdump(stmt)) fmt.Printf("data0: %q\n", data0) panic(err) } interestingness = 2 data1 := stmt1.String() // TODO(tschottdorf): due to the ignoring issue again. // if !reflect.DeepEqual(stmt, stmt1) { if data1 != data0 { fmt.Printf("data0: %q\n", data0) fmt.Printf("AST: %s", spew.Sdump(stmt)) fmt.Printf("data1: %q\n", data1) fmt.Printf("AST: %s", spew.Sdump(stmt1)) panic("not equal") } var v visitorFunc = func(e parser.Expr) parser.Expr { lastExpr = e if _, err := parser.EvalExpr(e); err != nil { panic(err) } return e } parser.WalkStmt(v, stmt) return }
func (c *conn) query(stmt parser.Statement, args []driver.Value) (*rows, error) { // TODO(pmattis): Apply the args to the statement. switch p := stmt.(type) { case *parser.CreateDatabase: return c.CreateDatabase(p, args) case *parser.CreateTable: return c.CreateTable(p, args) case *parser.Delete: return c.Delete(p, args) case *parser.Insert: return c.Insert(p, args) case *parser.Select: return c.Select(p, args) case *parser.ShowColumns: return c.Send(createCall(stmt.String(), args)) case *parser.ShowDatabases: return c.Send(createCall(stmt.String(), args)) case *parser.ShowIndex: return c.Send(createCall(stmt.String(), args)) case *parser.ShowTables: return c.Send(createCall(stmt.String(), args)) case *parser.Update: return c.Update(p, args) case *parser.Use: c.database = p.Name return c.Send(createCall(stmt.String(), args)) case *parser.AlterTable: case *parser.AlterView: case *parser.CreateIndex: case *parser.CreateView: case *parser.DropDatabase: case *parser.DropIndex: case *parser.DropTable: case *parser.DropView: case *parser.RenameTable: case *parser.Set: case *parser.TruncateTable: case *parser.Union: // Various unimplemented statements. default: return nil, fmt.Errorf("unknown statement type: %T", stmt) } return nil, fmt.Errorf("TODO(pmattis): unimplemented: %T %s", stmt, stmt) }