activerecord-spanner-adapter 1.4.2 → 1.4.4
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.
- checksums.yaml +4 -4
- data/.github/workflows/nightly-acceptance-tests-on-emulator.yaml +5 -1
- data/.github/workflows/nightly-acceptance-tests-on-production.yaml +1 -1
- data/.release-please-manifest.json +1 -1
- data/CHANGELOG.md +12 -0
- data/acceptance/cases/migration/rename_column_test.rb +17 -15
- data/acceptance/cases/models/default_value_test.rb +36 -4
- data/acceptance/test_helpers/with_separate_database.rb +1 -0
- data/lib/active_record/connection_adapters/spanner/quoting.rb +5 -2
- data/lib/activerecord_spanner_adapter/information_schema.rb +66 -0
- data/lib/activerecord_spanner_adapter/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1a935693a8621d55fd7f51a17ba93dcc598f97789e6b7825ca7c916fbc0c9e1
|
4
|
+
data.tar.gz: 671717a9df5b2d7b6bbf388faea2c9ec6f982906a6456271a8696c2980d62684
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5fa701ba551c2072ad60e6a7aadde8a4c4e20e3262d091c4854fd37d3663cfa353595017a8de229404c37dc7145ef5852c4ac16f531655c54462e419b217d86b
|
7
|
+
data.tar.gz: 24733bae08d92cd3ad8c7ae4cbbdbf016dc845f3f8b1a962bdde535b8df2627c9dc8a62d4d41cad3ec58a295c22de9ccb01924f95c985d1bf6741d647a0fcf4d
|
@@ -20,7 +20,7 @@ jobs:
|
|
20
20
|
matrix:
|
21
21
|
# Run acceptance tests all supported combinations of Ruby and ActiveRecord.
|
22
22
|
ruby: [2.6, 2.7, 3.0, 3.1, 3.2]
|
23
|
-
ar: [6.0.0, 6.0.1, 6.0.2.2, 6.0.3.7, 6.0.4, 6.1.3.2, 6.1.4.7, 6.1.5.1, 6.1.6.1, 7.0.2.4, 7.0.3.1, 7.0.4, 7.0.5]
|
23
|
+
ar: [6.0.0, 6.0.1, 6.0.2.2, 6.0.3.7, 6.0.4, 6.1.3.2, 6.1.4.7, 6.1.5.1, 6.1.6.1, 7.0.2.4, 7.0.3.1, 7.0.4, 7.0.5, 7.0.6, 7.0.7]
|
24
24
|
# Exclude combinations that are not supported.
|
25
25
|
exclude:
|
26
26
|
- ruby: 3.0
|
@@ -61,6 +61,10 @@ jobs:
|
|
61
61
|
ar: 7.0.4
|
62
62
|
- ruby: 2.6
|
63
63
|
ar: 7.0.5
|
64
|
+
- ruby: 2.6
|
65
|
+
ar: 7.0.6
|
66
|
+
- ruby: 2.6
|
67
|
+
ar: 7.0.7
|
64
68
|
env:
|
65
69
|
AR_VERSION: ${{ matrix.ar }}
|
66
70
|
steps:
|
@@ -29,7 +29,7 @@ jobs:
|
|
29
29
|
- name: Install dependencies
|
30
30
|
run: bundle install
|
31
31
|
- name: Run acceptance tests on production
|
32
|
-
run: bundle exec rake acceptance
|
32
|
+
run: bundle exec rake acceptance\[,,,"exclude cases/migration"\]
|
33
33
|
env:
|
34
34
|
SPANNER_TEST_PROJECT: ${{ secrets.GCP_PROJECT_ID }}
|
35
35
|
SPANNER_TEST_INSTANCE: ruby-activerecord-test
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
### 1.4.4 (2023-09-06)
|
4
|
+
|
5
|
+
#### Bug Fixes
|
6
|
+
|
7
|
+
* Support for changes in Rails 7.0.7. ([#260](https://github.com/googleapis/ruby-spanner-activerecord/issues/260))
|
8
|
+
|
9
|
+
### 1.4.3 (2023-06-09)
|
10
|
+
|
11
|
+
#### Bug Fixes
|
12
|
+
|
13
|
+
* unquote string default value ([#253](https://github.com/googleapis/ruby-spanner-activerecord/issues/253))
|
14
|
+
|
3
15
|
### 1.4.2 (2023-06-01)
|
4
16
|
|
5
17
|
#### Bug Fixes
|
@@ -23,21 +23,23 @@ module ActiveRecord
|
|
23
23
|
skip_test_table_create!
|
24
24
|
super
|
25
25
|
|
26
|
-
connection.
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
26
|
+
connection.ddl_batch do
|
27
|
+
connection.drop_table :rename_column_comments, if_exists: true
|
28
|
+
connection.drop_table :rename_column_posts, if_exists: true
|
29
|
+
|
30
|
+
connection.create_table(:rename_column_posts) do |t|
|
31
|
+
t.string :name, limit: 128
|
32
|
+
t.integer :comment_count
|
33
|
+
end
|
34
|
+
|
35
|
+
connection.create_table(:rename_column_comments) do |t|
|
36
|
+
t.string :comment
|
37
|
+
# The Spanner ActiveRecord adapter does not support creating an index on a column that also has a foreign key,
|
38
|
+
# as Cloud Spanner automatically creates a managed index for the foreign key. The index is therefore created
|
39
|
+
# separately.
|
40
|
+
t.references :rename_column_post, foreign_key: true
|
41
|
+
t.index :rename_column_post_id
|
42
|
+
end
|
41
43
|
end
|
42
44
|
|
43
45
|
RenameColumnPost.reset_column_information
|
@@ -7,15 +7,47 @@ module Models
|
|
7
7
|
class DefaultValueTest < SpannerAdapter::TestCase
|
8
8
|
include TestHelpers::WithSeparateDatabase
|
9
9
|
|
10
|
-
class
|
10
|
+
class LiteralValue < ActiveRecord::Base; end
|
11
|
+
class ExpressionValue < ActiveRecord::Base; end
|
11
12
|
|
12
|
-
def
|
13
|
-
|
13
|
+
def test_literal_default_values
|
14
|
+
default = OpenStruct.new(
|
15
|
+
col_string: "default",
|
16
|
+
col_int64: 123,
|
17
|
+
col_float64: 1.23,
|
18
|
+
col_numeric: BigDecimal("1.23"),
|
19
|
+
col_bool: true,
|
20
|
+
col_date: Date.new(2023, 5, 9),
|
21
|
+
col_timestamp: DateTime.new(2023, 5, 9, 1, 2, 3),
|
22
|
+
)
|
23
|
+
|
24
|
+
connection.create_table :literal_values do |t|
|
25
|
+
t.column :col_string, :string, default: default.col_string
|
26
|
+
t.column :col_int64, :bigint, default: default.col_int64
|
27
|
+
t.column :col_float64, :float, default: default.col_float64
|
28
|
+
t.column :col_numeric, :numeric, default: default.col_numeric
|
29
|
+
t.column :col_bool, :boolean, default: default.col_bool
|
30
|
+
t.column :col_date, :date, default: default.col_date
|
31
|
+
t.column :col_timestamp, :datetime, default: default.col_timestamp
|
32
|
+
end
|
33
|
+
|
34
|
+
item = LiteralValue.new
|
35
|
+
default.each_pair { |col, expected| assert_equal(expected, item[col]) }
|
36
|
+
item.save!
|
37
|
+
default.each_pair { |col, expected| assert_equal(expected, item[col]) }
|
38
|
+
item.reload
|
39
|
+
default.each_pair { |col, expected| assert_equal(expected, item[col]) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_expression_default_values
|
43
|
+
connection.create_table :expression_values do |t|
|
44
|
+
t.column :col_numeric, :numeric, default: -> { "NUMERIC '1.23'" }
|
14
45
|
t.column :col_timestamp, :datetime, default: -> { "CURRENT_TIMESTAMP()" }
|
15
46
|
end
|
16
47
|
|
17
|
-
item =
|
48
|
+
item = ExpressionValue.create!
|
18
49
|
item.reload
|
50
|
+
assert_equal(BigDecimal("1.23"), item.col_numeric)
|
19
51
|
assert(item.col_timestamp)
|
20
52
|
end
|
21
53
|
end
|
@@ -32,12 +32,15 @@ module ActiveRecord
|
|
32
32
|
module ConnectionAdapters
|
33
33
|
module Spanner
|
34
34
|
module Quoting
|
35
|
+
QUOTED_COLUMN_NAMES = Concurrent::Map.new # :nodoc:
|
36
|
+
QUOTED_TABLE_NAMES = Concurrent::Map.new # :nodoc:
|
37
|
+
|
35
38
|
def quote_column_name name
|
36
|
-
|
39
|
+
QUOTED_COLUMN_NAMES[name] ||= "`#{super.gsub '`', '``'}`".freeze
|
37
40
|
end
|
38
41
|
|
39
42
|
def quote_table_name name
|
40
|
-
|
43
|
+
QUOTED_TABLE_NAMES[name] ||= super.gsub(".", "`.`").freeze
|
41
44
|
end
|
42
45
|
|
43
46
|
STR_ESCAPE_REGX = /[\n\r'\\]/.freeze
|
@@ -87,6 +87,10 @@ module ActiveRecordSpannerAdapter
|
|
87
87
|
default = nil
|
88
88
|
end
|
89
89
|
|
90
|
+
if default && type == "STRING"
|
91
|
+
default = unquote_string default
|
92
|
+
end
|
93
|
+
|
90
94
|
Table::Column.new \
|
91
95
|
table_name,
|
92
96
|
column_name,
|
@@ -286,8 +290,70 @@ module ActiveRecordSpannerAdapter
|
|
286
290
|
[matched[1], limit]
|
287
291
|
end
|
288
292
|
|
293
|
+
def unquote_string value
|
294
|
+
return unquote_raw_string value, 1 if value[0] == "r" || value[0] == "R"
|
295
|
+
unescape_string unquote_raw_string value
|
296
|
+
end
|
297
|
+
|
289
298
|
private
|
290
299
|
|
300
|
+
def unquote_raw_string value, prefix_length = 0
|
301
|
+
triple_quote_range = prefix_length..(prefix_length + 2)
|
302
|
+
if value[triple_quote_range] == '"""' || value[triple_quote_range] == "'''"
|
303
|
+
value[(prefix_length + 3)...-3]
|
304
|
+
else
|
305
|
+
value[(prefix_length + 1)...-1]
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
def unescape_string value # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity
|
310
|
+
str = ""
|
311
|
+
i = 0
|
312
|
+
|
313
|
+
while i < value.length
|
314
|
+
case value[i]
|
315
|
+
when "\\"
|
316
|
+
i += 1
|
317
|
+
case value[i]
|
318
|
+
when "a" then str += "\a"
|
319
|
+
when "b" then str += "\b"
|
320
|
+
when "f" then str += "\f"
|
321
|
+
when "n" then str += "\n"
|
322
|
+
when "r" then str += "\r"
|
323
|
+
when "t" then str += "\t"
|
324
|
+
when "v" then str += "\v"
|
325
|
+
when "\\" then str += "\\"
|
326
|
+
when "?" then str += "?"
|
327
|
+
when "'" then str += "'"
|
328
|
+
when '"' then str += '"'
|
329
|
+
when "`" then str += "`"
|
330
|
+
when "0".."7"
|
331
|
+
str += unescape_unicode value, i, 3, 8
|
332
|
+
i += 2
|
333
|
+
when "x", "X"
|
334
|
+
str += unescape_unicode value, i + 1, 2, 16
|
335
|
+
i += 2
|
336
|
+
when "u"
|
337
|
+
str += unescape_unicode value, i + 1, 4, 16
|
338
|
+
i += 4
|
339
|
+
when "U"
|
340
|
+
str += unescape_unicode value, i + 1, 8, 16
|
341
|
+
i += 8
|
342
|
+
end
|
343
|
+
else
|
344
|
+
str += value[i]
|
345
|
+
end
|
346
|
+
|
347
|
+
i += 1
|
348
|
+
end
|
349
|
+
|
350
|
+
str
|
351
|
+
end
|
352
|
+
|
353
|
+
def unescape_unicode value, start, length, base
|
354
|
+
[value[start...(start + length)].to_i(base)].pack "U"
|
355
|
+
end
|
356
|
+
|
291
357
|
def column_options table_name, column_name
|
292
358
|
sql = +"SELECT COLUMN_NAME, OPTION_NAME, OPTION_TYPE, OPTION_VALUE"
|
293
359
|
sql << " FROM INFORMATION_SCHEMA.COLUMN_OPTIONS"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-spanner-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Google LLC
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-06
|
11
|
+
date: 2023-09-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: google-cloud-spanner
|
@@ -539,7 +539,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
539
539
|
- !ruby/object:Gem::Version
|
540
540
|
version: '0'
|
541
541
|
requirements: []
|
542
|
-
rubygems_version: 3.4.
|
542
|
+
rubygems_version: 3.4.19
|
543
543
|
signing_key:
|
544
544
|
specification_version: 4
|
545
545
|
summary: Rails ActiveRecord connector for Google Spanner Database
|