package sqllex import ( "strings" "testing" ) func TestWalkSQLContexts(t *testing.T) { sql := `SELECT :x,:x, :x::text, ':hidden', 'it'':hidden', E'it\':hidden', ":hidden", $$:hidden$$, $名$:hidden$名$; -- :hidden /* :hidden /* :hidden */ :hidden */ SELECT :y, value::integer, x := 1;` var names []string got := Walk(sql, func(name string) string { names = append(names, name); return "$1 ${2} :inserted" }, nil) if strings.Join(names, ",") != ":x,:x,:x,:y" { t.Fatalf("parameters: %v", names) } if strings.Count(got, "$1 ${2} :inserted") != 4 || !strings.Contains(got, "value::integer") { t.Fatalf("result: %s", got) } } func TestUnterminatedSQLContextsAreOpaque(t *testing.T) { for _, sql := range []string{"SELECT ':x", `SELECT ":x`, "DO $tag$:x", "/* :x", "-- :x"} { if got := Walk(sql, func(string) string { t.Fatal("unexpected parameter"); return "" }, nil); got != sql { t.Fatalf("changed %q", sql) } } }