activerecord-spanner-adapter 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/.kokoro/release.cfg +2 -2
  3. data/.kokoro/release.sh +1 -2
  4. data/.release-please-manifest.json +1 -1
  5. data/CHANGELOG.md +10 -0
  6. data/README.md +25 -23
  7. data/acceptance/cases/models/default_value_test.rb +2 -2
  8. data/acceptance/cases/tasks/database_tasks_test.rb +71 -74
  9. data/acceptance/cases/transactions/read_write_transactions_test.rb +10 -4
  10. data/acceptance/test_helper.rb +21 -8
  11. data/activerecord-spanner-adapter.gemspec +1 -1
  12. data/examples/snippets/Rakefile +1 -0
  13. data/examples/snippets/auto-generated-primary-key/README.md +140 -0
  14. data/examples/snippets/auto-generated-primary-key/Rakefile +13 -0
  15. data/examples/snippets/auto-generated-primary-key/application.rb +86 -0
  16. data/examples/snippets/auto-generated-primary-key/config/database.yml +10 -0
  17. data/examples/snippets/auto-generated-primary-key/db/migrate/01_create_tables.rb +29 -0
  18. data/examples/snippets/auto-generated-primary-key/db/seeds.rb +31 -0
  19. data/examples/snippets/auto-generated-primary-key/models/album.rb +11 -0
  20. data/examples/snippets/auto-generated-primary-key/models/singer.rb +11 -0
  21. data/lib/active_record/connection_adapters/spanner/column.rb +4 -0
  22. data/lib/active_record/connection_adapters/spanner/schema_creation.rb +13 -2
  23. data/lib/active_record/connection_adapters/spanner/schema_statements.rb +5 -5
  24. data/lib/active_record/connection_adapters/spanner/type_metadata.rb +7 -3
  25. data/lib/active_record/connection_adapters/spanner_adapter.rb +22 -0
  26. data/lib/activerecord_spanner_adapter/base.rb +49 -16
  27. data/lib/activerecord_spanner_adapter/information_schema.rb +4 -2
  28. data/lib/activerecord_spanner_adapter/table/column.rb +4 -1
  29. data/lib/activerecord_spanner_adapter/version.rb +1 -1
  30. metadata +13 -5
@@ -26,7 +26,8 @@ module ActiveRecord
26
26
  "project" => ENV["SPANNER_TEST_PROJECT"],
27
27
  "instance" => ENV["SPANNER_TEST_INSTANCE"],
28
28
  "credentials" => ENV["SPANNER_TEST_KEYFILE"],
29
- "database" => @database_id
29
+ "database" => @database_id,
30
+ "default_sequence_kind" => "BIT_REVERSED_POSITIVE",
30
31
  }
31
32
 
32
33
  create_database
@@ -74,13 +75,9 @@ module ActiveRecord
74
75
  create_tables_in_test_schema
75
76
 
76
77
  db_config =
77
- if ActiveRecord.version >= Gem::Version.new("6.1")
78
- ActiveRecord::DatabaseConfigurations::HashConfig.new "test",
79
- "primary",
80
- connector_config
81
- else
82
- connector_config
83
- end
78
+ ActiveRecord::DatabaseConfigurations::HashConfig.new "test",
79
+ "primary",
80
+ connector_config
84
81
 
85
82
  tables = connection.tables.sort
86
83
  config_name = "primary"
@@ -109,7 +106,7 @@ module ActiveRecord
109
106
 
110
107
  def expected_schema_sql_on_emulator
111
108
  "CREATE TABLE all_types (
112
- id INT64 NOT NULL,
109
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
113
110
  col_string STRING(MAX),
114
111
  col_int64 INT64,
115
112
  col_float64 FLOAT64,
@@ -130,7 +127,7 @@ module ActiveRecord
130
127
  col_array_json ARRAY<JSON>,
131
128
  ) PRIMARY KEY(id);
132
129
  CREATE TABLE firms (
133
- id INT64 NOT NULL,
130
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
134
131
  name STRING(MAX),
135
132
  rating INT64,
136
133
  description STRING(MAX),
@@ -138,11 +135,11 @@ CREATE TABLE firms (
138
135
  ) PRIMARY KEY(id);
139
136
  CREATE INDEX index_firms_on_account_id ON firms(account_id);
140
137
  CREATE TABLE customers (
141
- id INT64 NOT NULL,
138
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
142
139
  name STRING(MAX),
143
140
  ) PRIMARY KEY(id);
144
141
  CREATE TABLE accounts (
145
- id INT64 NOT NULL,
142
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
146
143
  customer_id INT64,
147
144
  firm_id INT64,
148
145
  name STRING(MAX),
@@ -150,47 +147,47 @@ CREATE TABLE accounts (
150
147
  transactions_count INT64,
151
148
  ) PRIMARY KEY(id);
152
149
  CREATE TABLE transactions (
153
- id INT64 NOT NULL,
150
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
154
151
  amount FLOAT64,
155
152
  account_id INT64,
156
153
  ) PRIMARY KEY(id);
157
154
  CREATE TABLE departments (
158
- id INT64 NOT NULL,
155
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
159
156
  name STRING(MAX),
160
157
  resource_type STRING(255),
161
158
  resource_id INT64,
162
159
  ) PRIMARY KEY(id);
163
160
  CREATE INDEX index_departments_on_resource ON departments(resource_type, resource_id);
164
161
  CREATE TABLE member_types (
165
- id INT64 NOT NULL,
162
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
166
163
  name STRING(MAX),
167
164
  ) PRIMARY KEY(id);
168
165
  CREATE TABLE members (
169
- id INT64 NOT NULL,
166
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
170
167
  name STRING(MAX),
171
168
  member_type_id INT64,
172
169
  admittable_type STRING(255),
173
170
  admittable_id INT64,
174
171
  ) PRIMARY KEY(id);
175
172
  CREATE TABLE memberships (
176
- id INT64 NOT NULL,
173
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
177
174
  joined_on TIMESTAMP,
178
175
  club_id INT64,
179
176
  member_id INT64,
180
177
  favourite BOOL,
181
178
  ) PRIMARY KEY(id);
182
179
  CREATE TABLE clubs (
183
- id INT64 NOT NULL,
180
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
184
181
  name STRING(MAX),
185
182
  ) PRIMARY KEY(id);
186
183
  CREATE TABLE authors (
187
- id INT64 NOT NULL,
184
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
188
185
  name STRING(MAX) NOT NULL,
189
186
  registered_date DATE,
190
187
  organization_id INT64,
191
188
  ) PRIMARY KEY(id);
192
189
  CREATE TABLE posts (
193
- id INT64 NOT NULL,
190
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
194
191
  title STRING(MAX),
195
192
  content STRING(MAX),
196
193
  author_id INT64,
@@ -200,27 +197,27 @@ CREATE TABLE posts (
200
197
  ) PRIMARY KEY(id);
201
198
  CREATE INDEX index_posts_on_author_id ON posts(author_id);
202
199
  CREATE TABLE comments (
203
- id INT64 NOT NULL,
200
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
204
201
  comment STRING(MAX),
205
202
  post_id INT64,
206
203
  CONSTRAINT fk_rails_2fd19c0db7 FOREIGN KEY(post_id) REFERENCES posts(id),
207
204
  ) PRIMARY KEY(id);
208
205
  CREATE TABLE addresses (
209
- id INT64 NOT NULL,
206
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
210
207
  line1 STRING(MAX),
211
208
  postal_code STRING(MAX),
212
209
  city STRING(MAX),
213
210
  author_id INT64,
214
211
  ) PRIMARY KEY(id);
215
212
  CREATE TABLE organizations (
216
- id INT64 NOT NULL,
213
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
217
214
  name STRING(MAX),
218
215
  last_updated TIMESTAMP OPTIONS (
219
216
  allow_commit_timestamp = true
220
217
  ),
221
218
  ) PRIMARY KEY(id);
222
219
  CREATE TABLE singers (
223
- singerid INT64 NOT NULL,
220
+ singerid INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
224
221
  first_name STRING(200),
225
222
  last_name STRING(MAX),
226
223
  tracks_count INT64,
@@ -229,14 +226,14 @@ CREATE TABLE singers (
229
226
  ) PRIMARY KEY(singerid);
230
227
  CREATE INDEX index_singers_on_last_name ON singers(last_name) STORING (tracks_count, first_name);
231
228
  CREATE TABLE albums (
232
- albumid INT64 NOT NULL,
229
+ albumid INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
233
230
  singerid INT64 NOT NULL,
234
231
  title STRING(MAX),
235
232
  lock_version INT64,
236
233
  ) PRIMARY KEY(singerid, albumid),
237
234
  INTERLEAVE IN PARENT singers ON DELETE NO ACTION;
238
235
  CREATE TABLE tracks (
239
- trackid INT64 NOT NULL,
236
+ trackid INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
240
237
  singerid INT64 NOT NULL,
241
238
  albumid INT64 NOT NULL,
242
239
  title STRING(MAX),
@@ -267,7 +264,7 @@ INSERT INTO `schema_migrations` (version) VALUES
267
264
 
268
265
  def expected_schema_sql_on_emulator_7_1
269
266
  "CREATE TABLE all_types (
270
- id INT64 NOT NULL,
267
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
271
268
  col_string STRING(MAX),
272
269
  col_int64 INT64,
273
270
  col_float64 FLOAT64,
@@ -288,7 +285,7 @@ INSERT INTO `schema_migrations` (version) VALUES
288
285
  col_array_json ARRAY<JSON>,
289
286
  ) PRIMARY KEY(id);
290
287
  CREATE TABLE firms (
291
- id INT64 NOT NULL,
288
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
292
289
  name STRING(MAX),
293
290
  rating INT64,
294
291
  description STRING(MAX),
@@ -296,11 +293,11 @@ CREATE TABLE firms (
296
293
  ) PRIMARY KEY(id);
297
294
  CREATE INDEX index_firms_on_account_id ON firms(account_id);
298
295
  CREATE TABLE customers (
299
- id INT64 NOT NULL,
296
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
300
297
  name STRING(MAX),
301
298
  ) PRIMARY KEY(id);
302
299
  CREATE TABLE accounts (
303
- id INT64 NOT NULL,
300
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
304
301
  customer_id INT64,
305
302
  firm_id INT64,
306
303
  name STRING(MAX),
@@ -308,47 +305,47 @@ CREATE TABLE accounts (
308
305
  transactions_count INT64,
309
306
  ) PRIMARY KEY(id);
310
307
  CREATE TABLE transactions (
311
- id INT64 NOT NULL,
308
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
312
309
  amount FLOAT64,
313
310
  account_id INT64,
314
311
  ) PRIMARY KEY(id);
315
312
  CREATE TABLE departments (
316
- id INT64 NOT NULL,
313
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
317
314
  name STRING(MAX),
318
315
  resource_type STRING(255),
319
316
  resource_id INT64,
320
317
  ) PRIMARY KEY(id);
321
318
  CREATE INDEX index_departments_on_resource ON departments(resource_type, resource_id);
322
319
  CREATE TABLE member_types (
323
- id INT64 NOT NULL,
320
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
324
321
  name STRING(MAX),
325
322
  ) PRIMARY KEY(id);
326
323
  CREATE TABLE members (
327
- id INT64 NOT NULL,
324
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
328
325
  name STRING(MAX),
329
326
  member_type_id INT64,
330
327
  admittable_type STRING(255),
331
328
  admittable_id INT64,
332
329
  ) PRIMARY KEY(id);
333
330
  CREATE TABLE memberships (
334
- id INT64 NOT NULL,
331
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
335
332
  joined_on TIMESTAMP,
336
333
  club_id INT64,
337
334
  member_id INT64,
338
335
  favourite BOOL,
339
336
  ) PRIMARY KEY(id);
340
337
  CREATE TABLE clubs (
341
- id INT64 NOT NULL,
338
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
342
339
  name STRING(MAX),
343
340
  ) PRIMARY KEY(id);
344
341
  CREATE TABLE authors (
345
- id INT64 NOT NULL,
342
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
346
343
  name STRING(MAX) NOT NULL,
347
344
  registered_date DATE,
348
345
  organization_id INT64,
349
346
  ) PRIMARY KEY(id);
350
347
  CREATE TABLE posts (
351
- id INT64 NOT NULL,
348
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
352
349
  title STRING(MAX),
353
350
  content STRING(MAX),
354
351
  author_id INT64,
@@ -358,27 +355,27 @@ CREATE TABLE posts (
358
355
  ) PRIMARY KEY(id);
359
356
  CREATE INDEX index_posts_on_author_id ON posts(author_id);
360
357
  CREATE TABLE comments (
361
- id INT64 NOT NULL,
358
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
362
359
  comment STRING(MAX),
363
360
  post_id INT64,
364
361
  CONSTRAINT fk_rails_2fd19c0db7 FOREIGN KEY(post_id) REFERENCES posts(id),
365
362
  ) PRIMARY KEY(id);
366
363
  CREATE TABLE addresses (
367
- id INT64 NOT NULL,
364
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
368
365
  line1 STRING(MAX),
369
366
  postal_code STRING(MAX),
370
367
  city STRING(MAX),
371
368
  author_id INT64,
372
369
  ) PRIMARY KEY(id);
373
370
  CREATE TABLE organizations (
374
- id INT64 NOT NULL,
371
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
375
372
  name STRING(MAX),
376
373
  last_updated TIMESTAMP OPTIONS (
377
374
  allow_commit_timestamp = true
378
375
  ),
379
376
  ) PRIMARY KEY(id);
380
377
  CREATE TABLE singers (
381
- singerid INT64 NOT NULL,
378
+ singerid INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
382
379
  first_name STRING(200),
383
380
  last_name STRING(MAX),
384
381
  tracks_count INT64,
@@ -428,7 +425,7 @@ INSERT INTO `schema_migrations` (version) VALUES
428
425
  sequence_kind = 'bit_reversed_positive'
429
426
  );
430
427
  CREATE TABLE accounts (
431
- id INT64 NOT NULL,
428
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
432
429
  customer_id INT64,
433
430
  firm_id INT64,
434
431
  name STRING(MAX),
@@ -436,14 +433,14 @@ CREATE TABLE accounts (
436
433
  transactions_count INT64,
437
434
  ) PRIMARY KEY(id);
438
435
  CREATE TABLE addresses (
439
- id INT64 NOT NULL,
436
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
440
437
  line1 STRING(MAX),
441
438
  postal_code STRING(MAX),
442
439
  city STRING(MAX),
443
440
  author_id INT64,
444
441
  ) PRIMARY KEY(id);
445
442
  CREATE TABLE all_types (
446
- id INT64 NOT NULL,
443
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
447
444
  col_string STRING(MAX),
448
445
  col_int64 INT64,
449
446
  col_float64 FLOAT64,
@@ -470,33 +467,33 @@ CREATE TABLE ar_internal_metadata (
470
467
  updated_at TIMESTAMP NOT NULL,
471
468
  ) PRIMARY KEY(key);
472
469
  CREATE TABLE authors (
473
- id INT64 NOT NULL,
470
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
474
471
  name STRING(MAX) NOT NULL,
475
472
  registered_date DATE,
476
473
  organization_id INT64,
477
474
  ) PRIMARY KEY(id);
478
475
  CREATE TABLE clubs (
479
- id INT64 NOT NULL,
476
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
480
477
  name STRING(MAX),
481
478
  ) PRIMARY KEY(id);
482
479
  CREATE TABLE comments (
483
- id INT64 NOT NULL,
480
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
484
481
  comment STRING(MAX),
485
482
  post_id INT64,
486
483
  ) PRIMARY KEY(id);
487
484
  CREATE TABLE customers (
488
- id INT64 NOT NULL,
485
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
489
486
  name STRING(MAX),
490
487
  ) PRIMARY KEY(id);
491
488
  CREATE TABLE departments (
492
- id INT64 NOT NULL,
489
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
493
490
  name STRING(MAX),
494
491
  resource_type STRING(255),
495
492
  resource_id INT64,
496
493
  ) PRIMARY KEY(id);
497
494
  CREATE INDEX index_departments_on_resource ON departments(resource_type, resource_id);
498
495
  CREATE TABLE firms (
499
- id INT64 NOT NULL,
496
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
500
497
  name STRING(MAX),
501
498
  rating INT64,
502
499
  description STRING(MAX),
@@ -504,32 +501,32 @@ CREATE TABLE firms (
504
501
  ) PRIMARY KEY(id);
505
502
  CREATE INDEX index_firms_on_account_id ON firms(account_id);
506
503
  CREATE TABLE member_types (
507
- id INT64 NOT NULL,
504
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
508
505
  name STRING(MAX),
509
506
  ) PRIMARY KEY(id);
510
507
  CREATE TABLE members (
511
- id INT64 NOT NULL,
508
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
512
509
  name STRING(MAX),
513
510
  member_type_id INT64,
514
511
  admittable_type STRING(255),
515
512
  admittable_id INT64,
516
513
  ) PRIMARY KEY(id);
517
514
  CREATE TABLE memberships (
518
- id INT64 NOT NULL,
515
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
519
516
  joined_on TIMESTAMP,
520
517
  club_id INT64,
521
518
  member_id INT64,
522
519
  favourite BOOL,
523
520
  ) PRIMARY KEY(id);
524
521
  CREATE TABLE organizations (
525
- id INT64 NOT NULL,
522
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
526
523
  name STRING(MAX),
527
524
  last_updated TIMESTAMP OPTIONS (
528
525
  allow_commit_timestamp = true
529
526
  ),
530
527
  ) PRIMARY KEY(id);
531
528
  CREATE TABLE posts (
532
- id INT64 NOT NULL,
529
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
533
530
  title STRING(MAX),
534
531
  content STRING(MAX),
535
532
  author_id INT64,
@@ -543,7 +540,7 @@ CREATE TABLE schema_migrations (
543
540
  version STRING(MAX) NOT NULL,
544
541
  ) PRIMARY KEY(version);
545
542
  CREATE TABLE singers (
546
- singerid INT64 NOT NULL,
543
+ singerid INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
547
544
  first_name STRING(200),
548
545
  last_name STRING(MAX),
549
546
  tracks_count INT64,
@@ -574,7 +571,7 @@ CREATE TABLE table_with_sequence (
574
571
  age INT64 NOT NULL,
575
572
  ) PRIMARY KEY(id);
576
573
  CREATE TABLE transactions (
577
- id INT64 NOT NULL,
574
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
578
575
  amount FLOAT64,
579
576
  account_id INT64,
580
577
  ) PRIMARY KEY(id);
@@ -589,7 +586,7 @@ INSERT INTO `schema_migrations` (version) VALUES
589
586
  sequence_kind = 'bit_reversed_positive'
590
587
  );
591
588
  CREATE TABLE accounts (
592
- id INT64 NOT NULL,
589
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
593
590
  customer_id INT64,
594
591
  firm_id INT64,
595
592
  name STRING(MAX),
@@ -597,14 +594,14 @@ CREATE TABLE accounts (
597
594
  transactions_count INT64,
598
595
  ) PRIMARY KEY(id);
599
596
  CREATE TABLE addresses (
600
- id INT64 NOT NULL,
597
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
601
598
  line1 STRING(MAX),
602
599
  postal_code STRING(MAX),
603
600
  city STRING(MAX),
604
601
  author_id INT64,
605
602
  ) PRIMARY KEY(id);
606
603
  CREATE TABLE all_types (
607
- id INT64 NOT NULL,
604
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
608
605
  col_string STRING(MAX),
609
606
  col_int64 INT64,
610
607
  col_float64 FLOAT64,
@@ -631,33 +628,33 @@ CREATE TABLE ar_internal_metadata (
631
628
  updated_at TIMESTAMP NOT NULL,
632
629
  ) PRIMARY KEY(key);
633
630
  CREATE TABLE authors (
634
- id INT64 NOT NULL,
631
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
635
632
  name STRING(MAX) NOT NULL,
636
633
  registered_date DATE,
637
634
  organization_id INT64,
638
635
  ) PRIMARY KEY(id);
639
636
  CREATE TABLE clubs (
640
- id INT64 NOT NULL,
637
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
641
638
  name STRING(MAX),
642
639
  ) PRIMARY KEY(id);
643
640
  CREATE TABLE comments (
644
- id INT64 NOT NULL,
641
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
645
642
  comment STRING(MAX),
646
643
  post_id INT64,
647
644
  ) PRIMARY KEY(id);
648
645
  CREATE TABLE customers (
649
- id INT64 NOT NULL,
646
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
650
647
  name STRING(MAX),
651
648
  ) PRIMARY KEY(id);
652
649
  CREATE TABLE departments (
653
- id INT64 NOT NULL,
650
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
654
651
  name STRING(MAX),
655
652
  resource_type STRING(255),
656
653
  resource_id INT64,
657
654
  ) PRIMARY KEY(id);
658
655
  CREATE INDEX index_departments_on_resource ON departments(resource_type, resource_id);
659
656
  CREATE TABLE firms (
660
- id INT64 NOT NULL,
657
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
661
658
  name STRING(MAX),
662
659
  rating INT64,
663
660
  description STRING(MAX),
@@ -665,32 +662,32 @@ CREATE TABLE firms (
665
662
  ) PRIMARY KEY(id);
666
663
  CREATE INDEX index_firms_on_account_id ON firms(account_id);
667
664
  CREATE TABLE member_types (
668
- id INT64 NOT NULL,
665
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
669
666
  name STRING(MAX),
670
667
  ) PRIMARY KEY(id);
671
668
  CREATE TABLE members (
672
- id INT64 NOT NULL,
669
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
673
670
  name STRING(MAX),
674
671
  member_type_id INT64,
675
672
  admittable_type STRING(255),
676
673
  admittable_id INT64,
677
674
  ) PRIMARY KEY(id);
678
675
  CREATE TABLE memberships (
679
- id INT64 NOT NULL,
676
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
680
677
  joined_on TIMESTAMP,
681
678
  club_id INT64,
682
679
  member_id INT64,
683
680
  favourite BOOL,
684
681
  ) PRIMARY KEY(id);
685
682
  CREATE TABLE organizations (
686
- id INT64 NOT NULL,
683
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
687
684
  name STRING(MAX),
688
685
  last_updated TIMESTAMP OPTIONS (
689
686
  allow_commit_timestamp = true
690
687
  ),
691
688
  ) PRIMARY KEY(id);
692
689
  CREATE TABLE posts (
693
- id INT64 NOT NULL,
690
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
694
691
  title STRING(MAX),
695
692
  content STRING(MAX),
696
693
  author_id INT64,
@@ -704,7 +701,7 @@ CREATE TABLE schema_migrations (
704
701
  version STRING(MAX) NOT NULL,
705
702
  ) PRIMARY KEY(version);
706
703
  CREATE TABLE singers (
707
- singerid INT64 NOT NULL,
704
+ singerid INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
708
705
  first_name STRING(200),
709
706
  last_name STRING(MAX),
710
707
  tracks_count INT64,
@@ -735,7 +732,7 @@ CREATE TABLE table_with_sequence (
735
732
  age INT64 NOT NULL,
736
733
  ) PRIMARY KEY(id);
737
734
  CREATE TABLE transactions (
738
- id INT64 NOT NULL,
735
+ id INT64 NOT NULL GENERATED BY DEFAULT AS IDENTITY (BIT_REVERSED_POSITIVE),
739
736
  amount FLOAT64,
740
737
  account_id INT64,
741
738
  ) PRIMARY KEY(id);
@@ -260,12 +260,18 @@ module ActiveRecord
260
260
  end
261
261
 
262
262
  def test_create_record_with_sequence_using_mutations
263
- err = assert_raises ActiveRecord::StatementInvalid do
264
- TableWithSequence.transaction isolation: :buffered_mutations do
265
- TableWithSequence.create name: "Foo", age: 50
263
+ reset_value = TableWithSequence.connection.use_client_side_id_for_mutations
264
+ begin
265
+ TableWithSequence.connection.use_client_side_id_for_mutations = false
266
+ err = assert_raises ActiveRecord::StatementInvalid do
267
+ TableWithSequence.transaction isolation: :buffered_mutations do
268
+ TableWithSequence.create name: "Foo", age: 50
269
+ end
266
270
  end
271
+ assert_equal "Mutations cannot be used to create records that use an auto-generated primary key.", err.message
272
+ ensure
273
+ TableWithSequence.connection.use_client_side_id_for_mutations = reset_value
267
274
  end
268
- assert_equal "Mutations cannot be used to create records that use a sequence to generate the primary key. TableWithSequence uses test_sequence.", err.message
269
275
  end
270
276
  end
271
277
  end
@@ -27,14 +27,27 @@ end
27
27
  $spanner_test_database = "ar-test-#{SecureRandom.hex 4}"
28
28
 
29
29
  def connector_config
30
- {
31
- "adapter" => "spanner",
32
- "emulator_host" => ENV["SPANNER_EMULATOR_HOST"],
33
- "project" => ENV["SPANNER_TEST_PROJECT"],
34
- "instance" => ENV["SPANNER_TEST_INSTANCE"],
35
- "credentials" => ENV["SPANNER_TEST_KEYFILE"],
36
- "database" => $spanner_test_database
37
- }
30
+ if ActiveRecord.gem_version >= Gem::Version.create("7.1.0")
31
+ {
32
+ "adapter" => "spanner",
33
+ "emulator_host" => ENV["SPANNER_EMULATOR_HOST"],
34
+ "project" => ENV["SPANNER_TEST_PROJECT"],
35
+ "instance" => ENV["SPANNER_TEST_INSTANCE"],
36
+ "credentials" => ENV["SPANNER_TEST_KEYFILE"],
37
+ "database" => $spanner_test_database,
38
+ "default_sequence_kind" => "BIT_REVERSED_POSITIVE",
39
+ "use_client_side_id_for_mutations" => true,
40
+ }
41
+ else
42
+ {
43
+ "adapter" => "spanner",
44
+ "emulator_host" => ENV["SPANNER_EMULATOR_HOST"],
45
+ "project" => ENV["SPANNER_TEST_PROJECT"],
46
+ "instance" => ENV["SPANNER_TEST_INSTANCE"],
47
+ "credentials" => ENV["SPANNER_TEST_KEYFILE"],
48
+ "database" => $spanner_test_database,
49
+ }
50
+ end
38
51
  end
39
52
 
40
53
  def spanner
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency "google-cloud-spanner", "~> 2.18"
28
28
  # Pin gRPC to 1.64.3, as 1.65 and 1.66 cause test runs to hang randomly.
29
29
  spec.add_dependency "grpc", "1.64.3"
30
- spec.add_runtime_dependency "activerecord", [">= 6.1", "< 9"]
30
+ spec.add_runtime_dependency "activerecord", [">= 7.0", "< 9"]
31
31
 
32
32
  spec.add_development_dependency "autotest-suffix", "~> 1.1"
33
33
  spec.add_development_dependency "bundler", "~> 2.0"
@@ -32,6 +32,7 @@ task :all do
32
32
  samples.delete "interleaved-tables" if less_than_7_1
33
33
  samples.delete "interleaved-tables-before-7.1" unless less_than_7_1
34
34
  samples.delete "bit-reversed-sequence" if less_than_7_1
35
+ samples.delete "auto-generated-primary-key" if less_than_7_1
35
36
  samples.delete "query-logs" if less_than_7_1
36
37
  samples.each do |sample|
37
38
  run_sample sample