Files
signoz/pkg/sqlschema/sqlitesqlschema/provider_test.go
Naman Verma 4fe311cb0e
Some checks failed
build-staging / js-build (push) Has been cancelled
build-staging / go-build (push) Has been cancelled
build-staging / prepare (push) Has been cancelled
build-staging / staging (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
feat: add functional unique index (#11307)
* feat: add functional unique index

* chore: add tag migration

* chore: add failing scratch test (to discuss)

* chore: fetch expressions as well in getindices call

* fix: remove tag unique index (will be added in a separate PR)

* fix: remove tag unique index (will be added in a separate PR)

* chore: remove temporary tests

* fix: go lint fix

* chore: better comment for unique index

* test: add test for case insensitive expression equality

* test: add equality test for columns with quotes and capital letters

* chore: add separate type for unique indices with expressions

* test: add test for postgres provider
2026-07-10 19:10:10 +00:00

143 lines
4.1 KiB
Go

package sqlitesqlschema
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestExtractWhereClause(t *testing.T) {
testCases := []struct {
name string
sql string
where string
}{
{
name: "UppercaseWhere",
sql: `CREATE UNIQUE INDEX "idx" ON "users" ("email") WHERE "deleted_at" IS NULL`,
where: `"deleted_at" IS NULL`,
},
{
name: "LowercaseWhere",
sql: `CREATE UNIQUE INDEX "idx" ON "users" ("email") where "deleted_at" IS NULL`,
where: `"deleted_at" IS NULL`,
},
{
name: "NewlineBeforeWhere",
sql: "CREATE UNIQUE INDEX \"idx\" ON \"users\" (\"email\")\nWHERE \"deleted_at\" IS NULL",
where: `"deleted_at" IS NULL`,
},
{
name: "ExtraWhitespace",
sql: "CREATE UNIQUE INDEX \"idx\" ON \"users\" (\"email\") \n \t where \"deleted_at\" IS NULL ",
where: `"deleted_at" IS NULL`,
},
{
name: "WhereInStringLiteral",
sql: `CREATE UNIQUE INDEX "idx" ON "users" ("email") WHERE status = 'somewhere'`,
where: `status = 'somewhere'`,
},
{
name: "BooleanLiteral",
sql: `CREATE UNIQUE INDEX "idx" ON "users" ("email") WHERE active = true`,
where: `active = true`,
},
}
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
assert.Equal(t, testCase.where, extractWhereClause(testCase.sql))
})
}
}
func TestExtractIndexColumns(t *testing.T) {
testCases := []struct {
name string
sql string
columns []string
}{
{
name: "SingleColumn",
sql: `CREATE UNIQUE INDEX "idx" ON "users" ("email")`,
columns: []string{`"email"`},
},
{
name: "SingleExpression",
sql: `CREATE UNIQUE INDEX "idx" ON "users" (LOWER(email))`,
columns: []string{"LOWER(email)"},
},
{
name: "MixedColumnsAndExpressions",
sql: `CREATE UNIQUE INDEX "idx" ON "tag" (org_id, kind, LOWER(key), LOWER(value))`,
columns: []string{"org_id", "kind", "LOWER(key)", "LOWER(value)"},
},
{
name: "CommaInsideStringLiteralNotSplit",
sql: `CREATE UNIQUE INDEX "idx" ON "users" (LOWER(TRIM(first_name) || ', ' || last_name))`,
columns: []string{"LOWER(TRIM(first_name) || ', ' || last_name)"},
},
{
name: "CommaInsideQuotedIdentifierNotSplit",
sql: `CREATE UNIQUE INDEX "idx" ON "t" ("weird,col", LOWER(x))`,
columns: []string{`"weird,col"`, "LOWER(x)"},
},
{
name: "WhereClauseAfterKeyListIgnored",
sql: `CREATE UNIQUE INDEX "idx" ON "tag" (LOWER(key)) WHERE deleted = 0`,
columns: []string{"LOWER(key)"},
},
{
name: "WhereClauseWithParensAfterKeyListIgnored",
sql: `CREATE UNIQUE INDEX "idx" ON "tag" (LOWER(key)) WHERE (deleted = 0 AND kind = 'a')`,
columns: []string{"LOWER(key)"},
},
{
name: "CommaInsideBacktickIdentifierNotSplit",
sql: "CREATE UNIQUE INDEX `idx` ON `t` (`weird,col`, x)",
columns: []string{"`weird,col`", "x"},
},
{
name: "CommaInsideBracketIdentifierNotSplit",
sql: `CREATE UNIQUE INDEX [idx] ON [t] ([weird,col], x)`,
columns: []string{"[weird,col]", "x"},
},
{
name: "EscapedDoubleQuoteInIdentifier",
sql: `CREATE UNIQUE INDEX "idx" ON "t" ("a""b", x)`,
columns: []string{`"a""b"`, "x"},
},
{
name: "EscapedSingleQuoteInLiteral",
sql: `CREATE UNIQUE INDEX "idx" ON "t" (COALESCE(x, 'it''s, ok'))`,
columns: []string{"COALESCE(x, 'it''s, ok')"},
},
{
name: "NestedFunctionCallCommasNotSplit",
sql: `CREATE UNIQUE INDEX "idx" ON "t" (COALESCE(a, b, c), d)`,
columns: []string{"COALESCE(a, b, c)", "d"},
},
{
name: "NewlinesAndTabsTrimmed",
sql: "CREATE UNIQUE INDEX \"idx\" ON \"t\" (\n\tLOWER(key),\n\torg_id\n)",
columns: []string{"LOWER(key)", "org_id"},
},
{
name: "CollateAndOrderSuffixKeptVerbatim",
sql: `CREATE UNIQUE INDEX "idx" ON "t" (LOWER(key) COLLATE NOCASE, value DESC)`,
columns: []string{"LOWER(key) COLLATE NOCASE", "value DESC"},
},
{
name: "NoKeyListReturnsNil",
sql: `CREATE INDEX "idx" ON "t"`,
columns: nil,
},
}
for _, testCase := range testCases {
t.Run(testCase.name, func(t *testing.T) {
assert.Equal(t, testCase.columns, extractIndexColumns(testCase.sql))
})
}
}