diff --git a/go.mod b/go.mod index b092e15..3688cea 100644 --- a/go.mod +++ b/go.mod @@ -3,38 +3,38 @@ module github.com/daichirata/hammer go 1.18 require ( - cloud.google.com/go/spanner v1.42.0 + cloud.google.com/go/spanner v1.45.0 github.com/google/go-cmp v0.5.9 github.com/spf13/cobra v0.0.5 - google.golang.org/api v0.105.0 - google.golang.org/genproto v0.0.0-20221207170731-23e4bf6bdc37 + google.golang.org/api v0.114.0 + google.golang.org/genproto v0.0.0-20230320184635-7606e756e683 ) require ( - cloud.google.com/go v0.107.0 // indirect - cloud.google.com/go/compute v1.14.0 // indirect + cloud.google.com/go v0.110.0 // indirect + cloud.google.com/go/compute v1.18.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v0.8.0 // indirect - cloud.google.com/go/longrunning v0.3.0 // indirect + cloud.google.com/go/iam v0.12.0 // indirect + cloud.google.com/go/longrunning v0.4.1 // indirect github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect - github.com/cncf/xds/go v0.0.0-20221128185840-c261a164b73d // indirect + github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b // indirect github.com/envoyproxy/go-control-plane v0.10.3 // indirect github.com/envoyproxy/protoc-gen-validate v0.9.1 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.2 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.1 // indirect - github.com/googleapis/gax-go/v2 v2.7.0 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.7.1 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/spf13/pflag v1.0.3 // indirect go.opencensus.io v0.24.0 // indirect - golang.org/x/net v0.4.0 // indirect - golang.org/x/oauth2 v0.3.0 // indirect - golang.org/x/sys v0.3.0 // indirect - golang.org/x/text v0.5.0 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/oauth2 v0.6.0 // indirect + golang.org/x/sys v0.6.0 // indirect + golang.org/x/text v0.8.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/grpc v1.51.0 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/grpc v1.53.0 // indirect + google.golang.org/protobuf v1.29.1 // indirect ) diff --git a/go.sum b/go.sum index 9e78e76..6dd3577 100644 --- a/go.sum +++ b/go.sum @@ -13,30 +13,30 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.107.0 h1:qkj22L7bgkl6vIeZDlOY2po43Mx/TIa2Wsa7VR+PEww= -cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.14.0 h1:hfm2+FfxVmnRlh6LpB7cg1ZNU+5edAHmW679JePztk0= -cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v0.8.0 h1:E2osAkZzxI/+8pZcxVLcDtAQx/u+hZXVryUaYQ5O0Kk= -cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= -cloud.google.com/go/longrunning v0.3.0 h1:NjljC+FYPV3uh5/OwWT6pVU+doBqMg2x/rZlE+CamDs= -cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/iam v0.12.0 h1:DRtTY29b75ciH6Ov1PHb4/iat2CLCvrOm40Q0a6DFpE= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/spanner v1.42.0 h1:W6RIkN4X0htp+GRNWK1rhXYYcjb5znZDuyIO2CWkoM0= -cloud.google.com/go/spanner v1.42.0/go.mod h1:KEfcH3c7wMqO6bTZqY1/BDS5DZfC1k3U0QZTlnlvW/0= +cloud.google.com/go/spanner v1.45.0 h1:7VdjZ8zj4sHbDw55atp5dfY6kn1j9sam9DRNpPQhqR4= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= @@ -70,8 +70,8 @@ github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20221128185840-c261a164b73d h1:H55MykFmlh/0htvhH/qG5bO0e4COKdaqytEYqXV7YSA= -github.com/cncf/xds/go v0.0.0-20221128185840-c261a164b73d/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b h1:ACGZRIr7HsgBKHsueQ1yM4WaVaXh21ynwqsF8M8tXhA= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -153,12 +153,12 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/googleapis/enterprise-certificate-proxy v0.2.1 h1:RY7tHKZcRlk788d5WSo/e83gOyyy742E8GSs771ySpg= -github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.7.0 h1:IcsPKeInNvYi7eqSaDjiZqDDKu5rsmunY0Y1YupQSSQ= -github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1 h1:gF4c0zjUP2H/s/hEGyLA3I0fA2ZWjzYiONAD6cvPr8A= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -294,16 +294,16 @@ golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.4.0 h1:Q5QPcMlvfxFTAPV0+07Xz/MpK9NTXu2VDUuy0FeMfaU= -golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.3.0 h1:6l90koy8/LaBLmLu8jpHeHexzMwEita0zFfYlggy2F8= -golang.org/x/oauth2 v0.3.0/go.mod h1:rQrIauxkUhJ6CuwEXwymO2/eh4xz2ZWF1nBkcxS+tGk= +golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -345,8 +345,8 @@ golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0 h1:w8ZOecv6NaNa/zC8944JTU3vz4u6Lagfk4RPQxv92NQ= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -356,8 +356,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.5.0 h1:OLmvp0KP+FVG99Ct/qFiL/Fhk4zp4QQnZ7b2U+5piUM= -golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -424,8 +424,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.105.0 h1:t6P9Jj+6XTn4U9I2wycQai6Q/Kz7iOT+QzjJ3G2V4x8= -google.golang.org/api v0.105.0/go.mod h1:qh7eD5FJks5+BcE+cjBIm6Gz8vioK7EHvnlniqXBnqI= +google.golang.org/api v0.114.0 h1:1xQPji6cO2E2vLiI+C/XiFAnsn1WV3mjaEwGLhi3grE= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -466,8 +466,8 @@ google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= -google.golang.org/genproto v0.0.0-20221207170731-23e4bf6bdc37 h1:jmIfw8+gSvXcZSgaFAGyInDXeWzUhvYH57G/5GKMn70= -google.golang.org/genproto v0.0.0-20221207170731-23e4bf6bdc37/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683 h1:khxVcsk/FhnzxMKOyD+TDGwjbEOpcPuIpmafPGFmhMA= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -486,8 +486,8 @@ google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U= -google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -502,8 +502,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= diff --git a/internal/hammer/ddl.go b/internal/hammer/ddl.go index cf5173d..c72dfce 100644 --- a/internal/hammer/ddl.go +++ b/internal/hammer/ddl.go @@ -30,9 +30,6 @@ func ParseDDL(uri, schema string, option *DDLOption) (DDL, error) { if trimed == "" { continue } - if option.IgnoreChangeStreams && strings.HasPrefix(trimed, "CREATE CHANGE STREAM") { - continue - } lines = append(lines, line+";") } @@ -45,6 +42,9 @@ func ParseDDL(uri, schema string, option *DDLOption) (DDL, error) { if _, ok := stmt.(*spansql.AlterDatabase); ok && option.IgnoreAlterDatabase { continue } + if _, ok := stmt.(*spansql.CreateChangeStream); ok && option.IgnoreChangeStreams { + continue + } list = append(list, stmt) } return DDL{List: list}, nil diff --git a/internal/hammer/ddl_test.go b/internal/hammer/ddl_test.go index 4a40183..0070bed 100644 --- a/internal/hammer/ddl_test.go +++ b/internal/hammer/ddl_test.go @@ -25,6 +25,19 @@ func TestParseDDL(t *testing.T) { Name STRING(10) NOT NULL, -- comment ) PRIMARY KEY(UserID); +CREATE CHANGE STREAM LongerDataRetention INVALID SCHEMA (); +`, + option: &hammer.DDLOption{}, + want: ``, + wantErr: true, + }, + { + name: "parse change streams", + schema: `CREATE TABLE Users ( + UserID STRING(10) NOT NULL, -- comment + Name STRING(10) NOT NULL, -- comment +) PRIMARY KEY(UserID); + CREATE CHANGE STREAM LongerDataRetention FOR ALL OPTIONS ( retention_period = '36h' @@ -35,7 +48,7 @@ CREATE CHANGE STREAM LongerDataRetention UserID STRING(10) NOT NULL, Name STRING(10) NOT NULL, ) PRIMARY KEY(UserID); -CREATE CHANGE STREAM LongerDataRetention FOR ALL OPTIONS( retention_period='36h' );`, +CREATE CHANGE STREAM LongerDataRetention FOR ALL OPTIONS (retention_period='36h');`, }, { name: "Ignore change streams", @@ -48,6 +61,26 @@ CREATE CHANGE STREAM LongerDataRetention FOR ALL OPTIONS ( retention_period = '36h' ); +`, + option: &hammer.DDLOption{ + IgnoreChangeStreams: true, + }, + want: `CREATE TABLE Users ( + UserID STRING(10) NOT NULL, + Name STRING(10) NOT NULL, +) PRIMARY KEY(UserID);`, + }, + { + name: "Ignore change streams with small cases", + schema: `CREATE TABLE Users ( + UserID STRING(10) NOT NULL, -- comment + Name STRING(10) NOT NULL, -- comment +) PRIMARY KEY(UserID); + +create change stream LongerDataRetention + for all options ( + retention_period = '36h' +); `, option: &hammer.DDLOption{ IgnoreChangeStreams: true, diff --git a/internal/hammer/diff.go b/internal/hammer/diff.go index 55af24c..d873cb3 100644 --- a/internal/hammer/diff.go +++ b/internal/hammer/diff.go @@ -21,8 +21,9 @@ func Diff(ddl1, ddl2 DDL) (DDL, error) { } generator := &Generator{ - from: database1, - to: database2, + from: database1, + to: database2, + willCreateOrAlterChangeStreamIDs: map[spansql.ID]*ChangeStream{}, } return generator.GenerateDDL(), nil } @@ -30,6 +31,7 @@ func Diff(ddl1, ddl2 DDL) (DDL, error) { func NewDatabase(ddl DDL) (*Database, error) { var ( tables []*Table + changeStreams []*ChangeStream alterDatabaseOptions *spansql.AlterDatabase options spansql.SetDatabaseOptions ) @@ -66,6 +68,16 @@ func NewDatabase(ddl DDL) (*Database, error) { default: return nil, fmt.Errorf("unsupported database alteration: %v", stmt) } + case *spansql.CreateChangeStream: + if len(stmt.Watch) > 0 { + for _, watch := range stmt.Watch { + if t, ok := m[watch.Table]; ok { + t.changeStreams = append(t.changeStreams, &ChangeStream{CreateChangeStream: stmt}) + } + } + } else { + changeStreams = append(changeStreams, &ChangeStream{CreateChangeStream: stmt}) + } default: return nil, fmt.Errorf("unexpected ddl statement: %v", stmt) } @@ -80,11 +92,12 @@ func NewDatabase(ddl DDL) (*Database, error) { } } - return &Database{tables: tables, alterDatabaseOptions: alterDatabaseOptions, options: options}, nil + return &Database{tables: tables, changeStreams: changeStreams, alterDatabaseOptions: alterDatabaseOptions, options: options}, nil } type Database struct { - tables []*Table + tables []*Table + changeStreams []*ChangeStream alterDatabaseOptions *spansql.AlterDatabase options spansql.SetDatabaseOptions @@ -93,17 +106,32 @@ type Database struct { type Table struct { *spansql.CreateTable - indexes []*spansql.CreateIndex - children []*Table + indexes []*spansql.CreateIndex + children []*Table + changeStreams []*ChangeStream +} + +type ChangeStream struct { + *spansql.CreateChangeStream +} + +func (cs *ChangeStream) WatchNone() bool { + return !cs.WatchAllTables && len(cs.Watch) == 0 +} + +func (cs *ChangeStream) WatchTable() bool { + return !cs.WatchAllTables && len(cs.Watch) > 0 } type Generator struct { from *Database to *Database - dropedTable []spansql.ID - dropedIndex []spansql.ID - droppedConstraints []spansql.TableConstraint + dropedTable []spansql.ID + dropedIndex []spansql.ID + dropedChangeStream []spansql.ID + droppedConstraints []spansql.TableConstraint + willCreateOrAlterChangeStreamIDs map[spansql.ID]*ChangeStream } func (g *Generator) GenerateDDL() DDL { @@ -143,12 +171,36 @@ func (g *Generator) GenerateDDL() DDL { ddl.AppendDDL(g.generateDDLForCreateIndex(fromTable, toTable)) ddl.AppendDDL(g.generateDDLForConstraints(fromTable, toTable)) ddl.AppendDDL(g.generateDDLForRowDeletionPolicy(fromTable, toTable)) + ddl.AppendDDL(g.generateDDLForCreateChangeStream(g.from, toTable)) } for _, fromTable := range g.from.tables { if _, exists := g.findTableByName(g.to.tables, fromTable.Name); !exists { ddl.AppendDDL(g.generateDDLForDropConstraintIndexAndTable(fromTable)) } } + // for alter change stream + for _, toChangeStream := range g.to.changeStreams { + fromChangeStream, exists := g.findChangeStreamByName(g.from, toChangeStream.Name) + if !exists { + ddl.Append(toChangeStream) + continue + } + ddl.AppendDDL(g.generateDDLForAlterChangeStream(fromChangeStream, toChangeStream)) + } + for _, fromChangeStream := range g.from.changeStreams { + if _, exists := g.findChangeStreamByName(g.to, fromChangeStream.Name); !exists { + ddl.AppendDDL(g.generateDDLForDropChangeStream(fromChangeStream)) + } + } + for _, cs := range g.willCreateOrAlterChangeStreamIDs { + fromChangeStream, exists := g.findChangeStreamByName(g.from, cs.Name) + if !exists || g.isDropedChangeStream(cs.Name) { + ddl.Append(cs) + continue + } + + ddl.AppendDDL(g.generateDDLForAlterChangeStream(fromChangeStream, cs)) + } return ddl } @@ -219,6 +271,9 @@ func (g *Generator) generateDDLForCreateTableAndIndex(table *Table) DDL { for _, i := range table.indexes { ddl.Append(i) } + for _, cs := range table.changeStreams { + g.willCreateOrAlterChangeStreamIDs[cs.Name] = cs + } return ddl } @@ -234,6 +289,12 @@ func (g *Generator) generateDDLForDropConstraintIndexAndTable(table *Table) DDL for _, i := range table.indexes { ddl.Append(spansql.DropIndex{Name: i.Name}) } + for _, cs := range table.changeStreams { + if !g.isDropedChangeStream(cs.Name) { + ddl.Append(spansql.DropChangeStream{Name: cs.Name}) + g.dropedChangeStream = append(g.dropedChangeStream, cs.Name) + } + } ddl.AppendDDL(g.generateDDLForDropNamedConstraintsMatchingPredicate(func(constraint spansql.TableConstraint) bool { fk, ok := constraint.Constraint.(spansql.ForeignKey) if !ok { @@ -460,6 +521,14 @@ func (g *Generator) generateDDLForCreateIndex(from, to *Table) DDL { return ddl } +func (g *Generator) generateDDLForCreateChangeStream(from *Database, to *Table) DDL { + ddl := DDL{} + + for _, cs := range to.changeStreams { + g.willCreateOrAlterChangeStreamIDs[cs.Name] = cs + } + return ddl +} func (g *Generator) generateDDLForDropNamedConstraint(table spansql.ID, constraint spansql.TableConstraint) DDL { ddl := DDL{} @@ -509,6 +578,14 @@ func (g *Generator) isDroppedConstraint(constraint spansql.TableConstraint) bool return false } +func (g *Generator) isDropedChangeStream(name spansql.ID) bool { + for _, t := range g.dropedChangeStream { + if t == name { + return true + } + } + return false +} func (g *Generator) interleaveEqual(x, y *Table) bool { return reflect.DeepEqual(x.Interleave, y.Interleave) } @@ -549,6 +626,10 @@ func (g *Generator) indexEqual(x, y spansql.CreateIndex) bool { return cmp.Equal(x, y, cmpopts.IgnoreTypes(spansql.Position{})) } +func (g *Generator) watchEqual(x, y []spansql.WatchDef) bool { + return cmp.Equal(x, y, cmpopts.IgnoreTypes(spansql.Position{})) +} + func (g *Generator) allowNull(col spansql.ColumnDef) spansql.ColumnDef { col.NotNull = false return col @@ -668,3 +749,64 @@ func (g *Generator) generateDDLForDropNamedConstraintsMatchingPredicate(predicat return ddl } + +func (g *Generator) findChangeStreamByName(database *Database, name spansql.ID) (changeStream *ChangeStream, exists bool) { + for _, cs := range database.changeStreams { + if cs.Name == name { + changeStream = cs + exists = true + break + } + } + for _, table := range database.tables { + for _, cs := range table.changeStreams { + if cs.Name == name { + changeStream = cs + exists = true + break + } + } + } + return +} + +func (g *Generator) generateDDLForAlterChangeStream(from, to *ChangeStream) DDL { + ddl := DDL{} + defaultRetentionPeriod := "1d" + defaultValueCaptureType := "OLD_AND_NEW_VALUES" + switch { + case from.WatchAllTables && to.WatchTable(): + ddl.Append(spansql.AlterChangeStream{Name: to.Name, Alteration: spansql.AlterWatch{Watch: to.Watch}}) + case from.WatchAllTables && to.WatchNone(): + ddl.Append(spansql.AlterChangeStream{Name: to.Name, Alteration: spansql.DropChangeStreamWatch{}}) + case from.WatchTable() && to.WatchAllTables: + ddl.Append(spansql.AlterChangeStream{Name: to.Name, Alteration: spansql.AlterWatch{WatchAllTables: to.WatchAllTables}}) + case from.WatchTable() && to.WatchNone(): + ddl.Append(spansql.DropChangeStream{Name: to.Name}) + ddl.Append(spansql.CreateChangeStream{Name: to.Name}) + case from.WatchTable() && to.WatchTable(): + if !g.watchEqual(from.Watch, to.Watch) { + ddl.Append(spansql.AlterChangeStream{Name: to.Name, Alteration: spansql.AlterWatch{Watch: to.Watch}}) + } + case from.WatchNone() && to.WatchAllTables: + ddl.Append(spansql.AlterChangeStream{Name: to.Name, Alteration: spansql.AlterWatch{WatchAllTables: to.WatchAllTables}}) + case from.WatchNone() && to.WatchTable(): + ddl.Append(spansql.AlterChangeStream{Name: to.Name, Alteration: spansql.AlterWatch{Watch: to.Watch}}) + } + if !reflect.DeepEqual(from.Options, to.Options) { + if from.Options.RetentionPeriod != nil && to.Options.RetentionPeriod == nil { + to.Options.RetentionPeriod = &defaultRetentionPeriod + } + if from.Options.ValueCaptureType != nil && to.Options.ValueCaptureType == nil { + to.Options.ValueCaptureType = &defaultValueCaptureType + } + ddl.Append(spansql.AlterChangeStream{Name: to.Name, Alteration: spansql.AlterChangeStreamOptions{Options: to.Options}}) + } + return ddl +} + +func (g *Generator) generateDDLForDropChangeStream(changeStream *ChangeStream) DDL { + ddl := DDL{} + ddl.Append(spansql.DropChangeStream{Name: changeStream.Name}) + return ddl +} diff --git a/internal/hammer/diff_test.go b/internal/hammer/diff_test.go index ab9a858..55ad7b2 100644 --- a/internal/hammer/diff_test.go +++ b/internal/hammer/diff_test.go @@ -1119,6 +1119,248 @@ CREATE TABLE t1 ( ignoreAlterDatabase: true, expected: []string{}, }, + { + name: "drop change stream", + from: ` +CREATE CHANGE STREAM SomeStream; +`, + to: ``, + ignoreAlterDatabase: true, + expected: []string{"DROP CHANGE STREAM SomeStream"}, + }, + { + name: "create change stream", + from: ``, + to: ` +CREATE CHANGE STREAM SomeStream; +`, + ignoreAlterDatabase: true, + expected: []string{"CREATE CHANGE STREAM SomeStream"}, + }, + { + name: "alter change stream watch none to all", + from: ` +CREATE CHANGE STREAM SomeStream; +`, + to: ` +CREATE CHANGE STREAM SomeStream FOR ALL; +`, + ignoreAlterDatabase: true, + expected: []string{"ALTER CHANGE STREAM SomeStream SET FOR ALL"}, + }, + { + name: "alter change stream watch none to table", + from: ` +CREATE CHANGE STREAM SomeStream; +`, + to: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR Singers(id), Albums; +`, + ignoreAlterDatabase: true, + expected: []string{`CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id)`, + `CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id)`, "ALTER CHANGE STREAM SomeStream SET FOR Singers(id), Albums"}, + }, + { + name: "alter change stream watch all to none", + from: ` +CREATE CHANGE STREAM SomeStream FOR ALL; +`, + to: ` +CREATE CHANGE STREAM SomeStream; +`, + ignoreAlterDatabase: true, + expected: []string{"ALTER CHANGE STREAM SomeStream DROP FOR ALL"}, + }, + { + name: "alter change stream watch all to table", + from: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR ALL; +`, + to: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR Singers(id), Albums; +`, + ignoreAlterDatabase: true, + expected: []string{"ALTER CHANGE STREAM SomeStream SET FOR Singers(id), Albums"}, + }, + { + name: "alter change stream watch table to none", + from: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR Singers(id), Albums; +`, + to: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream; +`, + ignoreAlterDatabase: true, + expected: []string{"DROP CHANGE STREAM SomeStream", "CREATE CHANGE STREAM SomeStream"}, + }, + { + name: "alter change stream watch table to all", + from: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR Singers(id), Albums; +`, + to: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR All; +`, + ignoreAlterDatabase: true, + expected: []string{"ALTER CHANGE STREAM SomeStream SET FOR ALL"}, + }, + { + name: "alter change stream watch table to other table", + from: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR Singers(id); +`, + to: ` +CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR Albums; +`, + ignoreAlterDatabase: true, + expected: []string{`CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id)`, "DROP CHANGE STREAM SomeStream", "DROP TABLE Singers", `CREATE CHANGE STREAM SomeStream FOR Albums`}, + }, + { + name: "alter change stream watch column to same table", + from: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, + name STRING(MAX) NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR Singers(id); +`, + to: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, + name STRING(MAX) NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR Singers(name); +`, + ignoreAlterDatabase: true, + expected: []string{"ALTER CHANGE STREAM SomeStream SET FOR Singers(name)"}, + }, + { + name: "alter change stream watch table to same table", + from: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR Singers(id), Albums; +`, + to: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR Singers(id), Albums; +`, + ignoreAlterDatabase: true, + expected: []string{}, + }, + { + name: "delete tables and related change stream", + from: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE TABLE Albums ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStream FOR Singers, Albums; +`, + to: ``, + ignoreAlterDatabase: true, + expected: []string{"DROP CHANGE STREAM SomeStream", "DROP TABLE Singers", "DROP TABLE Albums"}, + }, + { + name: "delete table and related change streams", + from: ` +CREATE TABLE Singers ( + id INT64 NOT NULL, +) PRIMARY KEY(id); +CREATE CHANGE STREAM SomeStreamOne FOR Singers; +CREATE CHANGE STREAM SomeStreamTwo FOR Singers; +`, + to: ``, + ignoreAlterDatabase: true, + expected: []string{"DROP CHANGE STREAM SomeStreamOne", "DROP CHANGE STREAM SomeStreamTwo", "DROP TABLE Singers"}, + }, + { + name: "alter change stream option", + from: ` +CREATE CHANGE STREAM SomeStream FOR ALL OPTIONS( retention_period = '36h', value_capture_type = 'NEW_VALUES' ); +`, + to: ` +CREATE CHANGE STREAM SomeStream FOR ALL OPTIONS( retention_period = '5d', value_capture_type = 'NEW_ROW' ); +`, + ignoreAlterDatabase: true, + expected: []string{"ALTER CHANGE STREAM SomeStream SET OPTIONS (retention_period='5d', value_capture_type='NEW_ROW')"}, + }, + { + name: "alter change stream option to default", + from: ` +CREATE CHANGE STREAM SomeStream FOR ALL OPTIONS( retention_period = '36h', value_capture_type = 'NEW_VALUES' ); +`, + to: ` +CREATE CHANGE STREAM SomeStream FOR ALL; +`, + ignoreAlterDatabase: true, + expected: []string{"ALTER CHANGE STREAM SomeStream SET OPTIONS (retention_period='1d', value_capture_type='OLD_AND_NEW_VALUES')"}, + }, } for _, v := range values { t.Run(v.name, func(t *testing.T) {