diff --git a/pkg/parser/state.go b/pkg/parser/state.go index f32a67131..0fbb2d653 100644 --- a/pkg/parser/state.go +++ b/pkg/parser/state.go @@ -47,10 +47,9 @@ func (s *ReadyState) Next(r rune, data []byte) State { fallthrough case 'C': offset := len(data) - len(BEGIN_ATOMIC) - if offset >= 0 && strings.EqualFold(string(data[offset:]), BEGIN_ATOMIC) { + if offset > 0 && strings.EqualFold(string(data[offset:]), BEGIN_ATOMIC) && unicode.IsSpace(rune(data[offset-1])) { return &AtomicState{prev: s, delimiter: []byte(END_ATOMIC)} } - } return s } diff --git a/pkg/parser/state_test.go b/pkg/parser/state_test.go index bae10fe19..50e49909a 100644 --- a/pkg/parser/state_test.go +++ b/pkg/parser/state_test.go @@ -167,4 +167,27 @@ END ;`} checkSplit(t, sql) }) + + t.Run("atomic in table name", func(t *testing.T) { + sql := []string{"create table public.atomic_test (id int);", "\nselect 1;"} + checkSplit(t, sql) + }) + + t.Run("atomic in function name", func(t *testing.T) { + sql := []string{ + "CREATE OR REPLACE FUNCTION public.my_function_atomic(p_id uuid)\nRETURNS void\nLANGUAGE plpgsql\nAS $$\nBEGIN\n RAISE NOTICE 'hello';\nEND;\n$$;", + "\nGRANT EXECUTE ON FUNCTION public.my_function_atomic(uuid) TO authenticated;", + } + checkSplit(t, sql) + }) + + t.Run("atomic in column name", func(t *testing.T) { + sql := []string{"select is_atomic from flags;", "\nselect 1;"} + checkSplit(t, sql) + }) + + t.Run("digit before atomic", func(t *testing.T) { + sql := []string{"select col1atomic from t;", "\nselect 1;"} + checkSplit(t, sql) + }) }