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 (p *planner) expandSubqueries(stmt parser.Statement) error { v := subqueryVisitor{planner: p} parser.WalkStmt(&v, stmt) return v.err }