From f68a196cb7bddc86da86fe03007844d4fb8bd63e Mon Sep 17 00:00:00 2001 From: Scott Winkler Date: Tue, 28 Nov 2023 16:09:02 -0800 Subject: [PATCH] fix event tables --- pkg/sdk/event_tables_def.go | 69 +++++--- pkg/sdk/event_tables_dto_builders_gen.go | 67 ++++++-- pkg/sdk/event_tables_dto_gen.go | 47 +++-- pkg/sdk/event_tables_gen.go | 105 +++++++----- pkg/sdk/event_tables_gen_test.go | 47 ++++- pkg/sdk/event_tables_impl_gen.go | 71 ++++++-- pkg/sdk/event_tables_validations_gen.go | 160 +++--------------- pkg/sdk/poc/main.go | 1 + .../testint/event_tables_integration_test.go | 86 ++++++++-- 9 files changed, 379 insertions(+), 274 deletions(-) diff --git a/pkg/sdk/event_tables_def.go b/pkg/sdk/event_tables_def.go index 2dd06cebe0..7cef1bd677 100644 --- a/pkg/sdk/event_tables_def.go +++ b/pkg/sdk/event_tables_def.go @@ -16,9 +16,20 @@ var eventTableUnset = g.NewQueryStruct("EventTableUnset"). OptionalSQL("CHANGE_TRACKING"). OptionalSQL("COMMENT") +var eventTableAddRowAccessPolicy = g.NewQueryStruct("EventTableAddRowAccessPolicy"). + SQL("ADD"). + Identifier("RowAccessPolicy", g.KindOfT[SchemaObjectIdentifier](), g.IdentifierOptions().SQL("ROW ACCESS POLICY").Required()). + NamedListWithParens("ON", g.KindOfT[string](), g.KeywordOptions().Required()). // TODO: double quotes here? + WithValidation(g.ValidIdentifier, "RowAccessPolicy") + var eventTableDropRowAccessPolicy = g.NewQueryStruct("EventTableDropRowAccessPolicy"). - SQL("ROW ACCESS POLICY"). - Identifier("Name", g.KindOfT[SchemaObjectIdentifier](), g.IdentifierOptions()) + SQL("DROP"). + Identifier("RowAccessPolicy", g.KindOfT[SchemaObjectIdentifier](), g.IdentifierOptions().SQL("ROW ACCESS POLICY").Required()). + WithValidation(g.ValidIdentifier, "RowAccessPolicy") + +var eventTableDropAndAddRowAccessPolicy = g.NewQueryStruct("EventTableDropAndAddRowAccessPolicy"). + QueryStructField("Drop", eventTableDropRowAccessPolicy, g.KeywordOptions().Required()). + QueryStructField("Add", eventTableAddRowAccessPolicy, g.KeywordOptions().Required()) var eventTableClusteringAction = g.NewQueryStruct("EventTableClusteringAction"). PredefinedQueryStructField("ClusterBy", "*[]string", g.KeywordOptions().Parentheses().SQL("CLUSTER BY")). @@ -54,7 +65,7 @@ var EventTablesDef = g.NewInterface( SQL("EVENT TABLE"). IfNotExists(). Name(). - PredefinedQueryStructField("ClusterBy", "[]string", g.KeywordOptions().Parentheses().SQL("CLUSTER BY")). + NamedListWithParens("CLUSTER BY", g.KindOfT[string](), g.KeywordOptions()). OptionalNumberAssignment("DATA_RETENTION_TIME_IN_DAYS", g.ParameterOptions()). OptionalNumberAssignment("MAX_DATA_EXTENSION_TIME_IN_DAYS", g.ParameterOptions()). OptionalBooleanAssignment("CHANGE_TRACKING", g.ParameterOptions()). @@ -62,36 +73,35 @@ var EventTablesDef = g.NewInterface( OptionalSQL("COPY GRANTS"). OptionalTextAssignment("COMMENT", g.ParameterOptions().SingleQuotes()). PredefinedQueryStructField("RowAccessPolicy", "*RowAccessPolicy", g.KeywordOptions()). - OptionalTags().WithValidation(g.ValidIdentifier, "name"), + OptionalTags(). + WithValidation(g.ValidIdentifier, "name"). + WithValidation(g.ConflictingFields, "OrReplace", "IfNotExists"), ).ShowOperation( "https://docs.snowflake.com/en/sql-reference/sql/show-event-tables", g.DbStruct("eventTableRow"). - Field("created_on", "string"). + Field("created_on", "time.Time"). Field("name", "string"). Field("database_name", "string"). Field("schema_name", "string"). - Field("owner", "string"). - Field("comment", "string"). - Field("owner_role_type", "string"). - Field("change_tracking", "string"), + Field("owner", "sql.NullString"). + Field("comment", "sql.NullString"). + Field("owner_role_type", "sql.NullString"), g.PlainStruct("EventTable"). - Field("CreatedOn", "string"). + Field("CreatedOn", "time.Time"). Field("Name", "string"). Field("DatabaseName", "string"). Field("SchemaName", "string"). Field("Owner", "string"). Field("Comment", "string"). - Field("OwnerRoleType", "string"). - Field("ChangeTracking", "bool"), - g.NewQueryStruct("ShowFunctions"). + Field("OwnerRoleType", "string"), + g.NewQueryStruct("ShowEventTables"). Show(). SQL("EVENT TABLES"). OptionalLike(). OptionalIn(). - OptionalTextAssignment("STARTS WITH", g.ParameterOptions().SingleQuotes().NoEquals()). - OptionalNumberAssignment("LIMIT", g.ParameterOptions()). - OptionalTextAssignment("FROM", g.ParameterOptions().SingleQuotes().NoEquals()), -).DescribeOperation( + OptionalStartsWith(). + OptionalLimit(), +).ShowByIdOperation().DescribeOperation( g.DescriptionMappingKindSingleValue, "https://docs.snowflake.com/en/sql-reference/sql/describe-event-table", g.DbStruct("eventTableDetailsRow"). @@ -107,6 +117,15 @@ var EventTablesDef = g.NewInterface( SQL("EVENT TABLE"). Name(). WithValidation(g.ValidIdentifier, "name"), +).DropOperation( + "https://docs.snowflake.com/en/sql-reference/sql/drop-event-table", + g.NewQueryStruct("DropEventTable"). + Drop(). + SQL("TABLE"). + IfExists(). + Name(). + OptionalSQL("RESTRICT"). // CASCADE or RESTRICT, and CASCADE for Default + WithValidation(g.ValidIdentifier, "name"), ).AlterOperation( "https://docs.snowflake.com/en/sql-reference/sql/alter-event-table", g.NewQueryStruct("AlterEventTable"). @@ -124,12 +143,9 @@ var EventTablesDef = g.NewInterface( eventTableUnset, g.KeywordOptions().SQL("UNSET"), ). - PredefinedQueryStructField("AddRowAccessPolicy", "*RowAccessPolicy", g.KeywordOptions().SQL("ADD")). - OptionalQueryStructField( - "DropRowAccessPolicy", - eventTableDropRowAccessPolicy, - g.KeywordOptions().SQL("DROP"), - ). + OptionalQueryStructField("AddRowAccessPolicy", eventTableAddRowAccessPolicy, g.KeywordOptions()). + OptionalQueryStructField("DropRowAccessPolicy", eventTableDropRowAccessPolicy, g.KeywordOptions()). + OptionalQueryStructField("DropAndAddRowAccessPolicy", eventTableDropAndAddRowAccessPolicy, g.ListOptions().NoParentheses()). OptionalSQL("DROP ALL ROW ACCESS POLICIES"). OptionalQueryStructField( "ClusteringAction", @@ -141,8 +157,9 @@ var EventTablesDef = g.NewInterface( eventTableSearchOptimizationAction, g.KeywordOptions(), ). - PredefinedQueryStructField("SetTags", "[]TagAssociation", g.KeywordOptions().SQL("SET TAG")). - PredefinedQueryStructField("UnsetTags", "[]ObjectIdentifier", g.KeywordOptions().SQL("UNSET TAG")). + OptionalSetTags(). + OptionalUnsetTags(). Identifier("RenameTo", g.KindOfTPointer[SchemaObjectIdentifier](), g.IdentifierOptions().SQL("RENAME TO")). - WithValidation(g.ValidIdentifier, "name"), + WithValidation(g.ValidIdentifier, "name"). + WithValidation(g.ExactlyOneValueSet, "RenameTo", "Set", "Unset", "SetTags", "UnsetTags", "AddRowAccessPolicy", "DropRowAccessPolicy", "DropAndAddRowAccessPolicy", "DropAllRowAccessPolicies", "ClusteringAction", "SearchOptimizationAction"), ) diff --git a/pkg/sdk/event_tables_dto_builders_gen.go b/pkg/sdk/event_tables_dto_builders_gen.go index 2135b558d7..c1475265e4 100644 --- a/pkg/sdk/event_tables_dto_builders_gen.go +++ b/pkg/sdk/event_tables_dto_builders_gen.go @@ -71,10 +71,8 @@ func NewShowEventTableRequest() *ShowEventTableRequest { return &ShowEventTableRequest{} } -func (s *ShowEventTableRequest) WithLike(pattern string) *ShowEventTableRequest { - s.Like = &Like{ - Pattern: &pattern, - } +func (s *ShowEventTableRequest) WithLike(Like *Like) *ShowEventTableRequest { + s.Like = Like return s } @@ -88,16 +86,11 @@ func (s *ShowEventTableRequest) WithStartsWith(StartsWith *string) *ShowEventTab return s } -func (s *ShowEventTableRequest) WithLimit(Limit *int) *ShowEventTableRequest { +func (s *ShowEventTableRequest) WithLimit(Limit *LimitFrom) *ShowEventTableRequest { s.Limit = Limit return s } -func (s *ShowEventTableRequest) WithFrom(From *string) *ShowEventTableRequest { - s.From = From - return s -} - func NewDescribeEventTableRequest( name SchemaObjectIdentifier, ) *DescribeEventTableRequest { @@ -106,6 +99,24 @@ func NewDescribeEventTableRequest( return &s } +func NewDropEventTableRequest( + name SchemaObjectIdentifier, +) *DropEventTableRequest { + s := DropEventTableRequest{} + s.name = name + return &s +} + +func (s *DropEventTableRequest) WithIfExists(IfExists *bool) *DropEventTableRequest { + s.IfExists = IfExists + return s +} + +func (s *DropEventTableRequest) WithRestrict(Restrict *bool) *DropEventTableRequest { + s.Restrict = Restrict + return s +} + func NewAlterEventTableRequest( name SchemaObjectIdentifier, ) *AlterEventTableRequest { @@ -129,7 +140,7 @@ func (s *AlterEventTableRequest) WithUnset(Unset *EventTableUnsetRequest) *Alter return s } -func (s *AlterEventTableRequest) WithAddRowAccessPolicy(AddRowAccessPolicy *RowAccessPolicy) *AlterEventTableRequest { +func (s *AlterEventTableRequest) WithAddRowAccessPolicy(AddRowAccessPolicy *EventTableAddRowAccessPolicyRequest) *AlterEventTableRequest { s.AddRowAccessPolicy = AddRowAccessPolicy return s } @@ -139,6 +150,11 @@ func (s *AlterEventTableRequest) WithDropRowAccessPolicy(DropRowAccessPolicy *Ev return s } +func (s *AlterEventTableRequest) WithDropAndAddRowAccessPolicy(DropAndAddRowAccessPolicy *EventTableDropAndAddRowAccessPolicyRequest) *AlterEventTableRequest { + s.DropAndAddRowAccessPolicy = DropAndAddRowAccessPolicy + return s +} + func (s *AlterEventTableRequest) WithDropAllRowAccessPolicies(DropAllRowAccessPolicies *bool) *AlterEventTableRequest { s.DropAllRowAccessPolicies = DropAllRowAccessPolicies return s @@ -217,13 +233,32 @@ func (s *EventTableUnsetRequest) WithComment(Comment *bool) *EventTableUnsetRequ return s } -func NewEventTableDropRowAccessPolicyRequest() *EventTableDropRowAccessPolicyRequest { - return &EventTableDropRowAccessPolicyRequest{} +func NewEventTableAddRowAccessPolicyRequest( + RowAccessPolicy SchemaObjectIdentifier, + On []string, +) *EventTableAddRowAccessPolicyRequest { + s := EventTableAddRowAccessPolicyRequest{} + s.RowAccessPolicy = RowAccessPolicy + s.On = On + return &s } -func (s *EventTableDropRowAccessPolicyRequest) WithName(Name SchemaObjectIdentifier) *EventTableDropRowAccessPolicyRequest { - s.Name = Name - return s +func NewEventTableDropRowAccessPolicyRequest( + RowAccessPolicy SchemaObjectIdentifier, +) *EventTableDropRowAccessPolicyRequest { + s := EventTableDropRowAccessPolicyRequest{} + s.RowAccessPolicy = RowAccessPolicy + return &s +} + +func NewEventTableDropAndAddRowAccessPolicyRequest( + Drop EventTableDropRowAccessPolicyRequest, + Add EventTableAddRowAccessPolicyRequest, +) *EventTableDropAndAddRowAccessPolicyRequest { + s := EventTableDropAndAddRowAccessPolicyRequest{} + s.Drop = Drop + s.Add = Add + return &s } func NewEventTableClusteringActionRequest() *EventTableClusteringActionRequest { diff --git a/pkg/sdk/event_tables_dto_gen.go b/pkg/sdk/event_tables_dto_gen.go index 2240d4fa1f..4e9a8b078b 100644 --- a/pkg/sdk/event_tables_dto_gen.go +++ b/pkg/sdk/event_tables_dto_gen.go @@ -6,6 +6,7 @@ var ( _ optionsProvider[CreateEventTableOptions] = new(CreateEventTableRequest) _ optionsProvider[ShowEventTableOptions] = new(ShowEventTableRequest) _ optionsProvider[DescribeEventTableOptions] = new(DescribeEventTableRequest) + _ optionsProvider[DropEventTableOptions] = new(DropEventTableRequest) _ optionsProvider[AlterEventTableOptions] = new(AlterEventTableRequest) ) @@ -28,27 +29,33 @@ type ShowEventTableRequest struct { Like *Like In *In StartsWith *string - Limit *int - From *string + Limit *LimitFrom } type DescribeEventTableRequest struct { name SchemaObjectIdentifier // required } +type DropEventTableRequest struct { + IfExists *bool + name SchemaObjectIdentifier // required + Restrict *bool +} + type AlterEventTableRequest struct { - IfNotExists *bool - name SchemaObjectIdentifier // required - Set *EventTableSetRequest - Unset *EventTableUnsetRequest - AddRowAccessPolicy *RowAccessPolicy - DropRowAccessPolicy *EventTableDropRowAccessPolicyRequest - DropAllRowAccessPolicies *bool - ClusteringAction *EventTableClusteringActionRequest - SearchOptimizationAction *EventTableSearchOptimizationActionRequest - SetTags []TagAssociation - UnsetTags []ObjectIdentifier - RenameTo *SchemaObjectIdentifier + IfNotExists *bool + name SchemaObjectIdentifier // required + Set *EventTableSetRequest + Unset *EventTableUnsetRequest + AddRowAccessPolicy *EventTableAddRowAccessPolicyRequest + DropRowAccessPolicy *EventTableDropRowAccessPolicyRequest + DropAndAddRowAccessPolicy *EventTableDropAndAddRowAccessPolicyRequest + DropAllRowAccessPolicies *bool + ClusteringAction *EventTableClusteringActionRequest + SearchOptimizationAction *EventTableSearchOptimizationActionRequest + SetTags []TagAssociation + UnsetTags []ObjectIdentifier + RenameTo *SchemaObjectIdentifier } type EventTableSetRequest struct { @@ -65,8 +72,18 @@ type EventTableUnsetRequest struct { Comment *bool } +type EventTableAddRowAccessPolicyRequest struct { + RowAccessPolicy SchemaObjectIdentifier // required + On []string // required +} + type EventTableDropRowAccessPolicyRequest struct { - Name SchemaObjectIdentifier + RowAccessPolicy SchemaObjectIdentifier // required +} + +type EventTableDropAndAddRowAccessPolicyRequest struct { + Drop EventTableDropRowAccessPolicyRequest // required + Add EventTableAddRowAccessPolicyRequest // required } type EventTableClusteringActionRequest struct { diff --git a/pkg/sdk/event_tables_gen.go b/pkg/sdk/event_tables_gen.go index 782a55f42e..b853d53999 100644 --- a/pkg/sdk/event_tables_gen.go +++ b/pkg/sdk/event_tables_gen.go @@ -1,12 +1,17 @@ package sdk -import "context" +import ( + "context" + "database/sql" + "time" +) type EventTables interface { Create(ctx context.Context, request *CreateEventTableRequest) error Show(ctx context.Context, request *ShowEventTableRequest) ([]EventTable, error) ShowByID(ctx context.Context, id SchemaObjectIdentifier) (*EventTable, error) - Describe(ctx context.Context, request *DescribeEventTableRequest) (*EventTableDetails, error) + Describe(ctx context.Context, id SchemaObjectIdentifier) (*EventTableDetails, error) + Drop(ctx context.Context, request *DropEventTableRequest) error Alter(ctx context.Context, request *AlterEventTableRequest) error } @@ -30,35 +35,32 @@ type CreateEventTableOptions struct { // ShowEventTableOptions is based on https://docs.snowflake.com/en/sql-reference/sql/show-event-tables. type ShowEventTableOptions struct { - show bool `ddl:"static" sql:"SHOW"` - eventTables bool `ddl:"static" sql:"EVENT TABLES"` - Like *Like `ddl:"keyword" sql:"LIKE"` - In *In `ddl:"keyword" sql:"IN"` - StartsWith *string `ddl:"parameter,single_quotes,no_equals" sql:"STARTS WITH"` - Limit *int `ddl:"parameter" sql:"LIMIT"` - From *string `ddl:"parameter,single_quotes,no_equals" sql:"FROM"` + show bool `ddl:"static" sql:"SHOW"` + eventTables bool `ddl:"static" sql:"EVENT TABLES"` + Like *Like `ddl:"keyword" sql:"LIKE"` + In *In `ddl:"keyword" sql:"IN"` + StartsWith *string `ddl:"parameter,single_quotes,no_equals" sql:"STARTS WITH"` + Limit *LimitFrom `ddl:"keyword" sql:"LIMIT"` } type eventTableRow struct { - CreatedOn string `db:"created_on"` - Name string `db:"name"` - DatabaseName string `db:"database_name"` - SchemaName string `db:"schema_name"` - Owner string `db:"owner"` - Comment string `db:"comment"` - OwnerRoleType string `db:"owner_role_type"` - ChangeTracking string `db:"change_tracking"` + CreatedOn time.Time `db:"created_on"` + Name string `db:"name"` + DatabaseName string `db:"database_name"` + SchemaName string `db:"schema_name"` + Owner sql.NullString `db:"owner"` + Comment sql.NullString `db:"comment"` + OwnerRoleType sql.NullString `db:"owner_role_type"` } type EventTable struct { - CreatedOn string - Name string - DatabaseName string - SchemaName string - Owner string - Comment string - OwnerRoleType string - ChangeTracking bool + CreatedOn time.Time + Name string + DatabaseName string + SchemaName string + Owner string + Comment string + OwnerRoleType string } // DescribeEventTableOptions is based on https://docs.snowflake.com/en/sql-reference/sql/describe-event-table. @@ -80,22 +82,32 @@ type EventTableDetails struct { Comment string } +// DropEventTableOptions is based on https://docs.snowflake.com/en/sql-reference/sql/drop-event-table. +type DropEventTableOptions struct { + drop bool `ddl:"static" sql:"DROP"` + table bool `ddl:"static" sql:"TABLE"` + IfExists *bool `ddl:"keyword" sql:"IF EXISTS"` + name SchemaObjectIdentifier `ddl:"identifier"` + Restrict *bool `ddl:"keyword" sql:"RESTRICT"` +} + // AlterEventTableOptions is based on https://docs.snowflake.com/en/sql-reference/sql/alter-event-table. type AlterEventTableOptions struct { - alter bool `ddl:"static" sql:"ALTER"` - eventTable bool `ddl:"static" sql:"TABLE"` - IfNotExists *bool `ddl:"keyword" sql:"IF NOT EXISTS"` - name SchemaObjectIdentifier `ddl:"identifier"` - Set *EventTableSet `ddl:"keyword" sql:"SET"` - Unset *EventTableUnset `ddl:"keyword" sql:"UNSET"` - AddRowAccessPolicy *RowAccessPolicy `ddl:"keyword" sql:"ADD"` - DropRowAccessPolicy *EventTableDropRowAccessPolicy `ddl:"keyword" sql:"DROP"` - DropAllRowAccessPolicies *bool `ddl:"keyword" sql:"DROP ALL ROW ACCESS POLICIES"` - ClusteringAction *EventTableClusteringAction `ddl:"keyword"` - SearchOptimizationAction *EventTableSearchOptimizationAction `ddl:"keyword"` - SetTags []TagAssociation `ddl:"keyword" sql:"SET TAG"` - UnsetTags []ObjectIdentifier `ddl:"keyword" sql:"UNSET TAG"` - RenameTo *SchemaObjectIdentifier `ddl:"identifier" sql:"RENAME TO"` + alter bool `ddl:"static" sql:"ALTER"` + table bool `ddl:"static" sql:"TABLE"` + IfNotExists *bool `ddl:"keyword" sql:"IF NOT EXISTS"` + name SchemaObjectIdentifier `ddl:"identifier"` + Set *EventTableSet `ddl:"keyword" sql:"SET"` + Unset *EventTableUnset `ddl:"keyword" sql:"UNSET"` + AddRowAccessPolicy *EventTableAddRowAccessPolicy `ddl:"keyword"` + DropRowAccessPolicy *EventTableDropRowAccessPolicy `ddl:"keyword"` + DropAndAddRowAccessPolicy *EventTableDropAndAddRowAccessPolicy `ddl:"list,no_parentheses"` + DropAllRowAccessPolicies *bool `ddl:"keyword" sql:"DROP ALL ROW ACCESS POLICIES"` + ClusteringAction *EventTableClusteringAction `ddl:"keyword"` + SearchOptimizationAction *EventTableSearchOptimizationAction `ddl:"keyword"` + SetTags []TagAssociation `ddl:"keyword" sql:"SET TAG"` + UnsetTags []ObjectIdentifier `ddl:"keyword" sql:"UNSET TAG"` + RenameTo *SchemaObjectIdentifier `ddl:"identifier" sql:"RENAME TO"` } type EventTableSet struct { @@ -112,9 +124,20 @@ type EventTableUnset struct { Comment *bool `ddl:"keyword" sql:"COMMENT"` } +type EventTableAddRowAccessPolicy struct { + add bool `ddl:"static" sql:"ADD"` + RowAccessPolicy SchemaObjectIdentifier `ddl:"identifier" sql:"ROW ACCESS POLICY"` + On []string `ddl:"keyword,parentheses" sql:"ON"` +} + type EventTableDropRowAccessPolicy struct { - rowAccessPolicy bool `ddl:"static" sql:"ROW ACCESS POLICY"` - Name SchemaObjectIdentifier `ddl:"identifier"` + drop bool `ddl:"static" sql:"DROP"` + RowAccessPolicy SchemaObjectIdentifier `ddl:"identifier" sql:"ROW ACCESS POLICY"` +} + +type EventTableDropAndAddRowAccessPolicy struct { + Drop EventTableDropRowAccessPolicy `ddl:"keyword"` + Add EventTableAddRowAccessPolicy `ddl:"keyword"` } type EventTableClusteringAction struct { diff --git a/pkg/sdk/event_tables_gen_test.go b/pkg/sdk/event_tables_gen_test.go index 9f78640a74..c4aaa69312 100644 --- a/pkg/sdk/event_tables_gen_test.go +++ b/pkg/sdk/event_tables_gen_test.go @@ -138,6 +138,20 @@ func TestEventTables_Alter(t *testing.T) { assertOptsInvalidJoinedErrors(t, opts, ErrInvalidObjectIdentifier) }) + t.Run("validation: exactly one field should be present", func(t *testing.T) { + opts := defaultOpts() + assertOptsInvalidJoinedErrors(t, opts, errExactlyOneOf("AlterEventTableOptions", "RenameTo", "Set", "Unset", "SetTags", "UnsetTags", "AddRowAccessPolicy", "DropRowAccessPolicy", "DropAndAddRowAccessPolicy", "DropAllRowAccessPolicies", "ClusteringAction", "SearchOptimizationAction")) + }) + + t.Run("validation: exactly one field should be present", func(t *testing.T) { + opts := defaultOpts() + opts.DropAllRowAccessPolicies = Bool(true) + opts.Set = &EventTableSet{ + DataRetentionTimeInDays: Int(1), + } + assertOptsInvalidJoinedErrors(t, opts, errExactlyOneOf("AlterEventTableOptions", "RenameTo", "Set", "Unset", "SetTags", "UnsetTags", "AddRowAccessPolicy", "DropRowAccessPolicy", "DropAndAddRowAccessPolicy", "DropAllRowAccessPolicies", "ClusteringAction", "SearchOptimizationAction")) + }) + t.Run("alter: rename to", func(t *testing.T) { opts := defaultOpts() target := NewSchemaObjectIdentifier(id.DatabaseName(), id.SchemaName(), random.StringN(12)) @@ -263,20 +277,41 @@ func TestEventTables_Alter(t *testing.T) { }) t.Run("alter: add row access policy", func(t *testing.T) { + rowAccessPolicyId := RandomSchemaObjectIdentifier() + opts := defaultOpts() - opts.AddRowAccessPolicy = &RowAccessPolicy{ - Name: NewSchemaObjectIdentifier(random.StringN(4), random.StringN(4), random.StringN(4)), - On: []string{"c1", "c2"}, + opts.AddRowAccessPolicy = &EventTableAddRowAccessPolicy{ + RowAccessPolicy: rowAccessPolicyId, + On: []string{"a", "b"}, } - assertOptsValidAndSQLEquals(t, opts, `ALTER TABLE IF NOT EXISTS %s ADD ROW ACCESS POLICY %s ON (c1, c2)`, id.FullyQualifiedName(), opts.AddRowAccessPolicy.Name.FullyQualifiedName()) + assertOptsValidAndSQLEquals(t, opts, "ALTER TABLE IF NOT EXISTS %s ADD ROW ACCESS POLICY %s ON (a, b)", id.FullyQualifiedName(), rowAccessPolicyId.FullyQualifiedName()) }) t.Run("alter: drop row access policy", func(t *testing.T) { + rowAccessPolicyId := RandomSchemaObjectIdentifier() + opts := defaultOpts() opts.DropRowAccessPolicy = &EventTableDropRowAccessPolicy{ - Name: NewSchemaObjectIdentifier(random.StringN(4), random.StringN(4), random.StringN(4)), + RowAccessPolicy: rowAccessPolicyId, + } + assertOptsValidAndSQLEquals(t, opts, "ALTER TABLE IF NOT EXISTS %s DROP ROW ACCESS POLICY %s", id.FullyQualifiedName(), rowAccessPolicyId.FullyQualifiedName()) + }) + + t.Run("alter: drop and add row access policy", func(t *testing.T) { + rowAccessPolicy1Id := RandomSchemaObjectIdentifier() + rowAccessPolicy2Id := RandomSchemaObjectIdentifier() + + opts := defaultOpts() + opts.DropAndAddRowAccessPolicy = &EventTableDropAndAddRowAccessPolicy{ + Drop: EventTableDropRowAccessPolicy{ + RowAccessPolicy: rowAccessPolicy1Id, + }, + Add: EventTableAddRowAccessPolicy{ + RowAccessPolicy: rowAccessPolicy2Id, + On: []string{"a", "b"}, + }, } - assertOptsValidAndSQLEquals(t, opts, `ALTER TABLE IF NOT EXISTS %s DROP ROW ACCESS POLICY %s`, id.FullyQualifiedName(), opts.DropRowAccessPolicy.Name.FullyQualifiedName()) + assertOptsValidAndSQLEquals(t, opts, "ALTER TABLE IF NOT EXISTS %s DROP ROW ACCESS POLICY %s, ADD ROW ACCESS POLICY %s ON (a, b)", id.FullyQualifiedName(), rowAccessPolicy1Id.FullyQualifiedName(), rowAccessPolicy2Id.FullyQualifiedName()) }) t.Run("alter: drop all row access policies", func(t *testing.T) { diff --git a/pkg/sdk/event_tables_impl_gen.go b/pkg/sdk/event_tables_impl_gen.go index da19d19c1f..8cf6992791 100644 --- a/pkg/sdk/event_tables_impl_gen.go +++ b/pkg/sdk/event_tables_impl_gen.go @@ -28,16 +28,18 @@ func (v *eventTables) Show(ctx context.Context, request *ShowEventTableRequest) } func (v *eventTables) ShowByID(ctx context.Context, id SchemaObjectIdentifier) (*EventTable, error) { - request := NewShowEventTableRequest().WithLike(id.Name()) - functions, err := v.Show(ctx, request) + request := NewShowEventTableRequest().WithIn(&In{Database: NewAccountObjectIdentifier(id.DatabaseName())}).WithLike(&Like{String(id.Name())}) + eventTables, err := v.Show(ctx, request) if err != nil { return nil, err } - return collections.FindOne(functions, func(r EventTable) bool { return r.Name == id.Name() }) + return collections.FindOne(eventTables, func(r EventTable) bool { return r.Name == id.Name() }) } -func (v *eventTables) Describe(ctx context.Context, request *DescribeEventTableRequest) (*EventTableDetails, error) { - opts := request.toOpts() +func (v *eventTables) Describe(ctx context.Context, id SchemaObjectIdentifier) (*EventTableDetails, error) { + opts := &DescribeEventTableOptions{ + name: id, + } result, err := validateAndQueryOne[eventTableDetailsRow](v.client, ctx, opts) if err != nil { return nil, err @@ -45,6 +47,11 @@ func (v *eventTables) Describe(ctx context.Context, request *DescribeEventTableR return result.convert(), nil } +func (v *eventTables) Drop(ctx context.Context, request *DropEventTableRequest) error { + opts := request.toOpts() + return validateAndExec(v.client, ctx, opts) +} + func (v *eventTables) Alter(ctx context.Context, request *AlterEventTableRequest) error { opts := request.toOpts() return validateAndExec(v.client, ctx, opts) @@ -74,22 +81,27 @@ func (r *ShowEventTableRequest) toOpts() *ShowEventTableOptions { In: r.In, StartsWith: r.StartsWith, Limit: r.Limit, - From: r.From, } return opts } func (r eventTableRow) convert() *EventTable { - return &EventTable{ - CreatedOn: r.CreatedOn, - Name: r.Name, - DatabaseName: r.DatabaseName, - SchemaName: r.SchemaName, - Owner: r.Owner, - Comment: r.Comment, - OwnerRoleType: r.OwnerRoleType, - ChangeTracking: r.ChangeTracking == "ON", + t := &EventTable{ + CreatedOn: r.CreatedOn, + Name: r.Name, + DatabaseName: r.DatabaseName, + SchemaName: r.SchemaName, + } + if r.Owner.Valid { + t.Owner = r.Owner.String + } + if r.Comment.Valid { + t.Comment = r.Comment.String + } + if r.OwnerRoleType.Valid { + t.OwnerRoleType = r.OwnerRoleType.String } + return t } func (r *DescribeEventTableRequest) toOpts() *DescribeEventTableOptions { @@ -107,13 +119,20 @@ func (r eventTableDetailsRow) convert() *EventTableDetails { } } +func (r *DropEventTableRequest) toOpts() *DropEventTableOptions { + opts := &DropEventTableOptions{ + IfExists: r.IfExists, + name: r.name, + Restrict: r.Restrict, + } + return opts +} + func (r *AlterEventTableRequest) toOpts() *AlterEventTableOptions { opts := &AlterEventTableOptions{ IfNotExists: r.IfNotExists, name: r.name, - AddRowAccessPolicy: r.AddRowAccessPolicy, - DropAllRowAccessPolicies: r.DropAllRowAccessPolicies, SetTags: r.SetTags, @@ -136,9 +155,25 @@ func (r *AlterEventTableRequest) toOpts() *AlterEventTableOptions { Comment: r.Unset.Comment, } } + if r.AddRowAccessPolicy != nil { + opts.AddRowAccessPolicy = &EventTableAddRowAccessPolicy{ + RowAccessPolicy: r.AddRowAccessPolicy.RowAccessPolicy, + On: r.AddRowAccessPolicy.On, + } + } if r.DropRowAccessPolicy != nil { opts.DropRowAccessPolicy = &EventTableDropRowAccessPolicy{ - Name: r.DropRowAccessPolicy.Name, + RowAccessPolicy: r.DropRowAccessPolicy.RowAccessPolicy, + } + } + if r.DropAndAddRowAccessPolicy != nil { + opts.DropAndAddRowAccessPolicy = &EventTableDropAndAddRowAccessPolicy{} + opts.DropAndAddRowAccessPolicy.Drop = EventTableDropRowAccessPolicy{ + RowAccessPolicy: r.DropAndAddRowAccessPolicy.Drop.RowAccessPolicy, + } + opts.DropAndAddRowAccessPolicy.Add = EventTableAddRowAccessPolicy{ + RowAccessPolicy: r.DropAndAddRowAccessPolicy.Add.RowAccessPolicy, + On: r.DropAndAddRowAccessPolicy.Add.On, } } if r.ClusteringAction != nil { diff --git a/pkg/sdk/event_tables_validations_gen.go b/pkg/sdk/event_tables_validations_gen.go index 41899728fe..1a586565d8 100644 --- a/pkg/sdk/event_tables_validations_gen.go +++ b/pkg/sdk/event_tables_validations_gen.go @@ -1,11 +1,10 @@ package sdk -import "errors" - var ( _ validatable = new(CreateEventTableOptions) _ validatable = new(ShowEventTableOptions) _ validatable = new(DescribeEventTableOptions) + _ validatable = new(DropEventTableOptions) _ validatable = new(AlterEventTableOptions) ) @@ -17,11 +16,8 @@ func (opts *CreateEventTableOptions) validate() error { if !ValidObjectIdentifier(opts.name) { errs = append(errs, ErrInvalidObjectIdentifier) } - if everyValueSet(opts.OrReplace, opts.IfNotExists) && *opts.OrReplace && *opts.IfNotExists { - errs = append(errs, errOneOf("OrReplace", "IfNotExists")) - } - if valueSet(opts.CopyGrants) && !valueSet(opts.OrReplace) { - errs = append(errs, errors.New("CopyGrants requires OrReplace")) + if everyValueSet(opts.OrReplace, opts.IfNotExists) { + errs = append(errs, errOneOf("CreateEventTableOptions", "OrReplace", "IfNotExists")) } return JoinErrors(errs...) } @@ -34,99 +30,18 @@ func (opts *ShowEventTableOptions) validate() error { return JoinErrors(errs...) } -func (v *EventTableClusteringAction) validate() error { - if v == nil { - return ErrNilOptions - } - var errs []error - if ok := anyValueSet( - v.ClusterBy, - v.ResumeRecluster, - v.SuspendRecluster, - v.DropClusteringKey, - ); !ok { - errs = append(errs, errAtLeastOneOf("ClusterBy", "ResumeRecluster", "SuspendRecluster", "DropClusteringKey")) - } - if ok := exactlyOneValueSet( - v.ClusterBy, - v.ResumeRecluster, - v.SuspendRecluster, - v.DropClusteringKey, - ); !ok { - errs = append(errs, errExactlyOneOf("ClusterBy", "ResumeRecluster", "SuspendRecluster", "DropClusteringKey")) - } - return errors.Join(errs...) -} - -func (v *EventTableSearchOptimizationAction) validate() error { - if v == nil { - return ErrNilOptions - } - var errs []error - if ok := anyValueSet( - v.Add, - v.Drop, - ); !ok { - errs = append(errs, errAtLeastOneOf("Add", "Drop")) - } - if ok := exactlyOneValueSet( - v.Add, - v.Drop, - ); !ok { - errs = append(errs, errExactlyOneOf("Add", "Drop")) - } - return errors.Join(errs...) -} - -func (v *EventTableSet) validate() error { - if v == nil { - return ErrNilOptions - } - var errs []error - if ok := anyValueSet( - v.DataRetentionTimeInDays, - v.MaxDataExtensionTimeInDays, - v.ChangeTracking, - v.Comment, - ); !ok { - errs = append(errs, errAtLeastOneOf("DataRetentionTimeInDays", "MaxDataExtensionTimeInDays", "ChangeTracking", "Comment")) - } - if ok := exactlyOneValueSet( - v.DataRetentionTimeInDays, - v.MaxDataExtensionTimeInDays, - v.ChangeTracking, - v.Comment, - ); !ok { - errs = append(errs, errExactlyOneOf("DataRetentionTimeInDays", "MaxDataExtensionTimeInDays", "ChangeTracking", "Comment")) - } - return errors.Join(errs...) -} - -func (v *EventTableUnset) validate() error { - if v == nil { +func (opts *DescribeEventTableOptions) validate() error { + if opts == nil { return ErrNilOptions } var errs []error - if ok := anyValueSet( - v.DataRetentionTimeInDays, - v.MaxDataExtensionTimeInDays, - v.ChangeTracking, - v.Comment, - ); !ok { - errs = append(errs, errAtLeastOneOf("DataRetentionTimeInDays", "MaxDataExtensionTimeInDays", "ChangeTracking", "Comment")) - } - if ok := exactlyOneValueSet( - v.DataRetentionTimeInDays, - v.MaxDataExtensionTimeInDays, - v.ChangeTracking, - v.Comment, - ); !ok { - errs = append(errs, errExactlyOneOf("DataRetentionTimeInDays", "MaxDataExtensionTimeInDays", "ChangeTracking", "Comment")) + if !ValidObjectIdentifier(opts.name) { + errs = append(errs, ErrInvalidObjectIdentifier) } - return errors.Join(errs...) + return JoinErrors(errs...) } -func (opts *DescribeEventTableOptions) validate() error { +func (opts *DropEventTableOptions) validate() error { if opts == nil { return ErrNilOptions } @@ -145,52 +60,29 @@ func (opts *AlterEventTableOptions) validate() error { if !ValidObjectIdentifier(opts.name) { errs = append(errs, ErrInvalidObjectIdentifier) } - if ok := anyValueSet( - opts.Set, - opts.Unset, - opts.SetTags, - opts.UnsetTags, - opts.AddRowAccessPolicy, - opts.DropRowAccessPolicy, - opts.DropAllRowAccessPolicies, - opts.SearchOptimizationAction, - opts.ClusteringAction, - opts.RenameTo, - ); !ok { - errs = append(errs, errAtLeastOneOf("Set", "Unset", "SetTags", "UnsetTags", "AddRowAccessPolicy", "DropRowAccessPolicy", "DropAllRowAccessPolicies", "SearchOptimizationAction", "ClusteringAction", "RenameTo")) + if !exactlyOneValueSet(opts.RenameTo, opts.Set, opts.Unset, opts.SetTags, opts.UnsetTags, opts.AddRowAccessPolicy, opts.DropRowAccessPolicy, opts.DropAndAddRowAccessPolicy, opts.DropAllRowAccessPolicies, opts.ClusteringAction, opts.SearchOptimizationAction) { + errs = append(errs, errExactlyOneOf("AlterEventTableOptions", "RenameTo", "Set", "Unset", "SetTags", "UnsetTags", "AddRowAccessPolicy", "DropRowAccessPolicy", "DropAndAddRowAccessPolicy", "DropAllRowAccessPolicies", "ClusteringAction", "SearchOptimizationAction")) } - if ok := exactlyOneValueSet( - opts.Set, - opts.Unset, - opts.SetTags, - opts.UnsetTags, - opts.AddRowAccessPolicy, - opts.DropRowAccessPolicy, - opts.DropAllRowAccessPolicies, - opts.SearchOptimizationAction, - opts.ClusteringAction, - opts.RenameTo, - ); !ok { - errs = append(errs, errExactlyOneOf("Set", "Unset", "SetTags", "UnsetTags", "AddRowAccessPolicy", "DropRowAccessPolicy", "DropAllRowAccessPolicies", "SearchOptimizationAction", "ClusteringAction", "RenameTo")) - } - if valueSet(opts.ClusteringAction) { - if err := opts.ClusteringAction.validate(); err != nil { - errs = append(errs, err) + if valueSet(opts.AddRowAccessPolicy) { + if !ValidObjectIdentifier(opts.AddRowAccessPolicy.RowAccessPolicy) { + errs = append(errs, ErrInvalidObjectIdentifier) } } - if valueSet(opts.SearchOptimizationAction) { - if err := opts.SearchOptimizationAction.validate(); err != nil { - errs = append(errs, err) + if valueSet(opts.DropRowAccessPolicy) { + if !ValidObjectIdentifier(opts.DropRowAccessPolicy.RowAccessPolicy) { + errs = append(errs, ErrInvalidObjectIdentifier) } } - if valueSet(opts.Set) { - if err := opts.Set.validate(); err != nil { - errs = append(errs, err) + if valueSet(opts.DropAndAddRowAccessPolicy) { + if valueSet(opts.DropAndAddRowAccessPolicy.Drop) { + if !ValidObjectIdentifier(opts.DropAndAddRowAccessPolicy.Drop.RowAccessPolicy) { + errs = append(errs, ErrInvalidObjectIdentifier) + } } - } - if valueSet(opts.Unset) { - if err := opts.Unset.validate(); err != nil { - errs = append(errs, err) + if valueSet(opts.DropAndAddRowAccessPolicy.Add) { + if !ValidObjectIdentifier(opts.DropAndAddRowAccessPolicy.Add.RowAccessPolicy) { + errs = append(errs, ErrInvalidObjectIdentifier) + } } } return JoinErrors(errs...) diff --git a/pkg/sdk/poc/main.go b/pkg/sdk/poc/main.go index 817f5a115a..6d0115847e 100644 --- a/pkg/sdk/poc/main.go +++ b/pkg/sdk/poc/main.go @@ -24,6 +24,7 @@ var definitionMapping = map[string]*generator.Interface{ "application_roles_def.go": sdk.ApplicationRolesDef, "views_def.go": sdk.ViewsDef, "stages_def.go": sdk.StagesDef, + "event_tables_def.go": sdk.EventTablesDef, } func main() { diff --git a/pkg/sdk/testint/event_tables_integration_test.go b/pkg/sdk/testint/event_tables_integration_test.go index d6e7025965..ab56f96af3 100644 --- a/pkg/sdk/testint/event_tables_integration_test.go +++ b/pkg/sdk/testint/event_tables_integration_test.go @@ -2,7 +2,6 @@ package testint import ( "context" - "fmt" "testing" "github.com/Snowflake-Labs/terraform-provider-snowflake/pkg/sdk" @@ -16,10 +15,7 @@ func TestInt_EventTables(t *testing.T) { client := testClient(t) ctx := context.Background() - databaseTest, databaseCleanup := createDatabase(t, client) - t.Cleanup(databaseCleanup) - schemaTest, schemaCleanup := createSchema(t, client, databaseTest) - t.Cleanup(schemaCleanup) + databaseTest, schemaTest := testDb(t), testSchema(t) tagTest, tagCleaup := createTag(t, client, databaseTest, schemaTest) t.Cleanup(tagCleaup) @@ -34,7 +30,7 @@ func TestInt_EventTables(t *testing.T) { cleanupTableHandle := func(t *testing.T, id sdk.SchemaObjectIdentifier) func() { t.Helper() return func() { - _, err := client.ExecForTests(ctx, fmt.Sprintf("DROP TABLE \"%s\".\"%s\".\"%s\"", id.DatabaseName(), id.SchemaName(), id.Name())) + err := client.EventTables.Drop(ctx, sdk.NewDropEventTableRequest(id).WithIfExists(sdk.Bool(true))) require.NoError(t, err) } } @@ -42,7 +38,7 @@ func TestInt_EventTables(t *testing.T) { createEventTableHandle := func(t *testing.T) *sdk.EventTable { t.Helper() - id := sdk.NewSchemaObjectIdentifier(databaseTest.Name, schemaTest.Name, random.String()) + id := sdk.NewSchemaObjectIdentifier(databaseTest.Name, schemaTest.Name, random.StringN(4)) err := client.EventTables.Create(ctx, sdk.NewCreateEventTableRequest(id)) require.NoError(t, err) t.Cleanup(cleanupTableHandle(t, id)) @@ -90,7 +86,7 @@ func TestInt_EventTables(t *testing.T) { et1 := createEventTableHandle(t) et2 := createEventTableHandle(t) - tables, err := client.EventTables.Show(ctx, sdk.NewShowEventTableRequest().WithLike(et1.Name)) + tables, err := client.EventTables.Show(ctx, sdk.NewShowEventTableRequest().WithLike(&sdk.Like{Pattern: &et1.Name})) require.NoError(t, err) assert.Equal(t, 1, len(tables)) assert.Contains(t, tables, *et1) @@ -98,7 +94,7 @@ func TestInt_EventTables(t *testing.T) { }) t.Run("show event table: no matches", func(t *testing.T) { - tables, err := client.EventTables.Show(ctx, sdk.NewShowEventTableRequest().WithLike("non-existent")) + tables, err := client.EventTables.Show(ctx, sdk.NewShowEventTableRequest().WithLike(&sdk.Like{Pattern: sdk.String("non-existent")})) require.NoError(t, err) assert.Equal(t, 0, len(tables)) }) @@ -111,7 +107,7 @@ func TestInt_EventTables(t *testing.T) { require.NoError(t, err) t.Cleanup(cleanupTableHandle(t, id)) - details, err := client.EventTables.Describe(ctx, sdk.NewDescribeEventTableRequest(id)) + details, err := client.EventTables.Describe(ctx, id) require.NoError(t, err) assert.Equal(t, "TIMESTAMP", details.Name) }) @@ -154,17 +150,9 @@ func TestInt_EventTables(t *testing.T) { err = client.EventTables.Alter(ctx, sdk.NewAlterEventTableRequest(id).WithSet(set)) require.NoError(t, err) - et, err := client.EventTables.ShowByID(ctx, id) - require.NoError(t, err) - assert.Equal(t, true, et.ChangeTracking) - unset := sdk.NewEventTableUnsetRequest().WithChangeTracking(sdk.Bool(true)) err = client.EventTables.Alter(ctx, sdk.NewAlterEventTableRequest(id).WithUnset(unset)) require.NoError(t, err) - - et, err = client.EventTables.ShowByID(ctx, id) - require.NoError(t, err) - assert.Equal(t, false, et.ChangeTracking) }) t.Run("alter event table: set and unset tag", func(t *testing.T) { @@ -224,4 +212,66 @@ func TestInt_EventTables(t *testing.T) { err = client.EventTables.Alter(ctx, sdk.NewAlterEventTableRequest(id).WithClusteringAction(action)) require.NoError(t, err) }) + + // alter view: add and drop row access policies + t.Run("alter event table: add and drop row access policies", func(t *testing.T) { + rowAccessPolicyId, rowAccessPolicyCleanup := createRowAccessPolicy(t, client, testSchema(t)) + t.Cleanup(rowAccessPolicyCleanup) + rowAccessPolicy2Id, rowAccessPolicy2Cleanup := createRowAccessPolicy(t, client, testSchema(t)) + t.Cleanup(rowAccessPolicy2Cleanup) + + table, tableCleanup := createTable(t, client, databaseTest, schemaTest) + t.Cleanup(tableCleanup) + id := sdk.NewSchemaObjectIdentifier(table.DatabaseName, table.SchemaName, table.Name) + + // add policy + alterRequest := sdk.NewAlterEventTableRequest(id).WithAddRowAccessPolicy(sdk.NewEventTableAddRowAccessPolicyRequest(rowAccessPolicyId, []string{"id"})) + err := client.EventTables.Alter(ctx, alterRequest) + require.NoError(t, err) + + e, err := getRowAccessPolicyFor(t, client, table.ID(), sdk.ObjectTypeTable) + require.NoError(t, err) + assert.Equal(t, rowAccessPolicyId.Name(), e.PolicyName) + assert.Equal(t, "ROW_ACCESS_POLICY", e.PolicyKind) + assert.Equal(t, table.ID().Name(), e.RefEntityName) + assert.Equal(t, "TABLE", e.RefEntityDomain) + assert.Equal(t, "ACTIVE", e.PolicyStatus) + + // remove policy + alterRequest = sdk.NewAlterEventTableRequest(id).WithDropRowAccessPolicy(sdk.NewEventTableDropRowAccessPolicyRequest(rowAccessPolicyId)) + err = client.EventTables.Alter(ctx, alterRequest) + require.NoError(t, err) + + _, err = getRowAccessPolicyFor(t, client, table.ID(), sdk.ObjectTypeTable) + require.Error(t, err, "no rows in result set") + + // add policy again + alterRequest = sdk.NewAlterEventTableRequest(id).WithAddRowAccessPolicy(sdk.NewEventTableAddRowAccessPolicyRequest(rowAccessPolicyId, []string{"id"})) + err = client.EventTables.Alter(ctx, alterRequest) + require.NoError(t, err) + + e, err = getRowAccessPolicyFor(t, client, table.ID(), sdk.ObjectTypeTable) + require.NoError(t, err) + assert.Equal(t, rowAccessPolicyId.Name(), e.PolicyName) + + // drop and add other policy simultaneously + alterRequest = sdk.NewAlterEventTableRequest(id).WithDropAndAddRowAccessPolicy(sdk.NewEventTableDropAndAddRowAccessPolicyRequest( + *sdk.NewEventTableDropRowAccessPolicyRequest(rowAccessPolicyId), + *sdk.NewEventTableAddRowAccessPolicyRequest(rowAccessPolicy2Id, []string{"id"}), + )) + err = client.EventTables.Alter(ctx, alterRequest) + require.NoError(t, err) + + e, err = getRowAccessPolicyFor(t, client, table.ID(), sdk.ObjectTypeTable) + require.NoError(t, err) + assert.Equal(t, rowAccessPolicy2Id.Name(), e.PolicyName) + + // drop all policies + alterRequest = sdk.NewAlterEventTableRequest(id).WithDropAllRowAccessPolicies(sdk.Bool(true)) + err = client.EventTables.Alter(ctx, alterRequest) + require.NoError(t, err) + + _, err = getRowAccessPolicyFor(t, client, table.ID(), sdk.ObjectTypeView) + require.Error(t, err, "no rows in result set") + }) }