rom-sql 2.0.0.beta2 → 2.0.0.beta3

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 (170) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/lib/rom/plugins/relation/sql/postgres/explain.rb +54 -0
  4. data/lib/rom/sql.rb +1 -1
  5. data/lib/rom/sql/attribute.rb +17 -18
  6. data/lib/rom/sql/errors.rb +3 -0
  7. data/lib/rom/sql/extensions/mysql.rb +1 -1
  8. data/lib/rom/sql/extensions/mysql/type_builder.rb +28 -0
  9. data/lib/rom/sql/extensions/postgres.rb +3 -1
  10. data/lib/rom/sql/extensions/postgres/commands.rb +30 -13
  11. data/lib/rom/sql/extensions/postgres/{attributes_inferrer.rb → type_builder.rb} +24 -28
  12. data/lib/rom/sql/extensions/postgres/type_serializer.rb +39 -0
  13. data/lib/rom/sql/extensions/postgres/types.rb +24 -477
  14. data/lib/rom/sql/extensions/postgres/types/array.rb +163 -0
  15. data/lib/rom/sql/extensions/postgres/types/geometric.rb +135 -0
  16. data/lib/rom/sql/extensions/postgres/types/json.rb +235 -0
  17. data/lib/rom/sql/extensions/postgres/types/network.rb +15 -0
  18. data/lib/rom/sql/extensions/sqlite.rb +1 -1
  19. data/lib/rom/sql/extensions/sqlite/{attributes_inferrer.rb → type_builder.rb} +5 -5
  20. data/lib/rom/sql/extensions/sqlite/types.rb +8 -3
  21. data/lib/rom/sql/foreign_key.rb +17 -0
  22. data/lib/rom/sql/function.rb +86 -8
  23. data/lib/rom/sql/gateway.rb +26 -26
  24. data/lib/rom/sql/index.rb +4 -0
  25. data/lib/rom/sql/migration.rb +3 -3
  26. data/lib/rom/sql/migration/inline_runner.rb +9 -83
  27. data/lib/rom/sql/migration/migrator.rb +35 -12
  28. data/lib/rom/sql/migration/recorder.rb +21 -0
  29. data/lib/rom/sql/migration/runner.rb +115 -0
  30. data/lib/rom/sql/migration/schema_diff.rb +108 -53
  31. data/lib/rom/sql/migration/writer.rb +61 -0
  32. data/lib/rom/sql/relation.rb +2 -1
  33. data/lib/rom/sql/relation/reading.rb +63 -3
  34. data/lib/rom/sql/relation/writing.rb +38 -0
  35. data/lib/rom/sql/schema.rb +9 -3
  36. data/lib/rom/sql/schema/attributes_inferrer.rb +3 -119
  37. data/lib/rom/sql/schema/inferrer.rb +99 -18
  38. data/lib/rom/sql/schema/type_builder.rb +94 -0
  39. data/lib/rom/sql/type_dsl.rb +30 -0
  40. data/lib/rom/sql/type_extensions.rb +11 -6
  41. data/lib/rom/sql/type_serializer.rb +46 -0
  42. data/lib/rom/sql/types.rb +12 -0
  43. data/lib/rom/sql/version.rb +1 -1
  44. metadata +26 -244
  45. data/.codeclimate.yml +0 -15
  46. data/.gitignore +0 -17
  47. data/.rspec +0 -3
  48. data/.travis.yml +0 -39
  49. data/.yardopts +0 -2
  50. data/Gemfile +0 -33
  51. data/Guardfile +0 -24
  52. data/LICENSE.txt +0 -22
  53. data/Rakefile +0 -19
  54. data/circle.yml +0 -10
  55. data/lib/rom/sql/extensions/mysql/attributes_inferrer.rb +0 -10
  56. data/lib/rom/sql/relation/sequel_api.rb +0 -133
  57. data/log/.gitkeep +0 -0
  58. data/rom-sql.gemspec +0 -29
  59. data/spec/extensions/postgres/attribute_spec.rb +0 -217
  60. data/spec/extensions/postgres/integration_spec.rb +0 -59
  61. data/spec/extensions/postgres/types_spec.rb +0 -252
  62. data/spec/extensions/sqlite/types_spec.rb +0 -11
  63. data/spec/fixtures/migrations/20150403090603_create_carrots.rb +0 -8
  64. data/spec/integration/associations/many_to_many/custom_fks_spec.rb +0 -76
  65. data/spec/integration/associations/many_to_many/from_view_spec.rb +0 -88
  66. data/spec/integration/associations/many_to_many_spec.rb +0 -162
  67. data/spec/integration/associations/many_to_one/custom_fks_spec.rb +0 -64
  68. data/spec/integration/associations/many_to_one/from_view_spec.rb +0 -84
  69. data/spec/integration/associations/many_to_one/self_ref_spec.rb +0 -53
  70. data/spec/integration/associations/many_to_one_spec.rb +0 -117
  71. data/spec/integration/associations/one_to_many/custom_fks_spec.rb +0 -54
  72. data/spec/integration/associations/one_to_many/from_view_spec.rb +0 -57
  73. data/spec/integration/associations/one_to_many/self_ref_spec.rb +0 -54
  74. data/spec/integration/associations/one_to_many_spec.rb +0 -86
  75. data/spec/integration/associations/one_to_one_spec.rb +0 -69
  76. data/spec/integration/associations/one_to_one_through_spec.rb +0 -92
  77. data/spec/integration/auto_migrations/errors_spec.rb +0 -31
  78. data/spec/integration/auto_migrations/indexes_spec.rb +0 -253
  79. data/spec/integration/auto_migrations/managing_columns_spec.rb +0 -156
  80. data/spec/integration/auto_migrations/postgres/column_types_spec.rb +0 -63
  81. data/spec/integration/combine_with_spec.rb +0 -43
  82. data/spec/integration/commands/create_spec.rb +0 -304
  83. data/spec/integration/commands/delete_spec.rb +0 -84
  84. data/spec/integration/commands/update_spec.rb +0 -90
  85. data/spec/integration/commands/upsert_spec.rb +0 -83
  86. data/spec/integration/gateway_spec.rb +0 -107
  87. data/spec/integration/migration_spec.rb +0 -55
  88. data/spec/integration/plugins/associates/many_to_many_spec.rb +0 -69
  89. data/spec/integration/plugins/associates_spec.rb +0 -250
  90. data/spec/integration/plugins/auto_restrictions_spec.rb +0 -74
  91. data/spec/integration/relation_schema_spec.rb +0 -271
  92. data/spec/integration/schema/call_spec.rb +0 -24
  93. data/spec/integration/schema/inferrer/mysql_spec.rb +0 -45
  94. data/spec/integration/schema/inferrer/postgres_spec.rb +0 -203
  95. data/spec/integration/schema/inferrer/sqlite_spec.rb +0 -37
  96. data/spec/integration/schema/inferrer_spec.rb +0 -390
  97. data/spec/integration/schema/prefix_spec.rb +0 -16
  98. data/spec/integration/schema/qualified_spec.rb +0 -16
  99. data/spec/integration/schema/rename_spec.rb +0 -21
  100. data/spec/integration/schema/view_spec.rb +0 -29
  101. data/spec/integration/sequel_api_spec.rb +0 -36
  102. data/spec/integration/setup_spec.rb +0 -26
  103. data/spec/integration/support/active_support_notifications_spec.rb +0 -24
  104. data/spec/integration/support/rails_log_subscriber_spec.rb +0 -30
  105. data/spec/integration/wrap_spec.rb +0 -91
  106. data/spec/shared/accounts.rb +0 -48
  107. data/spec/shared/database_setup.rb +0 -70
  108. data/spec/shared/notes.rb +0 -23
  109. data/spec/shared/posts.rb +0 -34
  110. data/spec/shared/puppies.rb +0 -15
  111. data/spec/shared/relations.rb +0 -8
  112. data/spec/shared/users.rb +0 -32
  113. data/spec/shared/users_and_tasks.rb +0 -50
  114. data/spec/spec_helper.rb +0 -122
  115. data/spec/support/env_helper.rb +0 -25
  116. data/spec/support/helpers.rb +0 -24
  117. data/spec/support/oracle/create_users.sql +0 -7
  118. data/spec/support/oracle/set_sys_passwords.sql +0 -2
  119. data/spec/support/test_configuration.rb +0 -16
  120. data/spec/unit/attribute_spec.rb +0 -104
  121. data/spec/unit/function_spec.rb +0 -48
  122. data/spec/unit/gateway_spec.rb +0 -70
  123. data/spec/unit/logger_spec.rb +0 -14
  124. data/spec/unit/migration_tasks_spec.rb +0 -111
  125. data/spec/unit/migrator_spec.rb +0 -25
  126. data/spec/unit/order_dsl_spec.rb +0 -43
  127. data/spec/unit/plugin/associates_spec.rb +0 -94
  128. data/spec/unit/plugin/pagination_spec.rb +0 -91
  129. data/spec/unit/plugin/timestamp_spec.rb +0 -117
  130. data/spec/unit/projection_dsl_spec.rb +0 -110
  131. data/spec/unit/relation/assoc_spec.rb +0 -87
  132. data/spec/unit/relation/associations_spec.rb +0 -27
  133. data/spec/unit/relation/avg_spec.rb +0 -11
  134. data/spec/unit/relation/by_pk_spec.rb +0 -62
  135. data/spec/unit/relation/dataset_spec.rb +0 -50
  136. data/spec/unit/relation/distinct_spec.rb +0 -15
  137. data/spec/unit/relation/exclude_spec.rb +0 -11
  138. data/spec/unit/relation/exist_predicate_spec.rb +0 -25
  139. data/spec/unit/relation/exists_spec.rb +0 -18
  140. data/spec/unit/relation/fetch_spec.rb +0 -21
  141. data/spec/unit/relation/group_spec.rb +0 -61
  142. data/spec/unit/relation/having_spec.rb +0 -22
  143. data/spec/unit/relation/inner_join_spec.rb +0 -158
  144. data/spec/unit/relation/inspect_spec.rb +0 -11
  145. data/spec/unit/relation/instrument_spec.rb +0 -45
  146. data/spec/unit/relation/invert_spec.rb +0 -11
  147. data/spec/unit/relation/left_join_spec.rb +0 -55
  148. data/spec/unit/relation/lock_spec.rb +0 -93
  149. data/spec/unit/relation/map_spec.rb +0 -16
  150. data/spec/unit/relation/max_spec.rb +0 -11
  151. data/spec/unit/relation/min_spec.rb +0 -11
  152. data/spec/unit/relation/order_spec.rb +0 -51
  153. data/spec/unit/relation/pluck_spec.rb +0 -11
  154. data/spec/unit/relation/prefix_spec.rb +0 -29
  155. data/spec/unit/relation/primary_key_spec.rb +0 -27
  156. data/spec/unit/relation/project_spec.rb +0 -24
  157. data/spec/unit/relation/qualified_columns_spec.rb +0 -30
  158. data/spec/unit/relation/qualified_spec.rb +0 -25
  159. data/spec/unit/relation/read_spec.rb +0 -25
  160. data/spec/unit/relation/rename_spec.rb +0 -23
  161. data/spec/unit/relation/right_join_spec.rb +0 -57
  162. data/spec/unit/relation/select_append_spec.rb +0 -21
  163. data/spec/unit/relation/select_spec.rb +0 -40
  164. data/spec/unit/relation/sum_spec.rb +0 -11
  165. data/spec/unit/relation/union_spec.rb +0 -19
  166. data/spec/unit/relation/unique_predicate_spec.rb +0 -18
  167. data/spec/unit/relation/where_spec.rb +0 -133
  168. data/spec/unit/restriction_dsl_spec.rb +0 -34
  169. data/spec/unit/schema_spec.rb +0 -25
  170. data/spec/unit/types_spec.rb +0 -65
@@ -1,21 +0,0 @@
1
- RSpec.describe ROM::Relation, '#select_append' do
2
- subject(:relation) { relations[:tasks] }
3
-
4
- include_context 'users and tasks'
5
-
6
- with_adapters do
7
- it 'appends new columns' do
8
- selected = relation.select(:id).select_append(:title)
9
-
10
- expect(selected.schema.map(&:name)).to eql(%i[id title])
11
- expect(selected.first).to eql(id: 1, title: "Joe's task")
12
- end
13
-
14
- it 'supports blocks' do
15
- selected = relation.select(:id).select_append { string::upper(title).as(:title) }
16
-
17
- expect(selected.schema.map(&:name)).to eql(%i[id title])
18
- expect(selected.first).to eql(id: 1, title: "JOE'S TASK")
19
- end
20
- end
21
- end
@@ -1,40 +0,0 @@
1
- RSpec.describe ROM::Relation, '#select' do
2
- subject(:relation) { container.relations.tasks }
3
-
4
- include_context 'users and tasks'
5
-
6
- before do
7
- conf.relation(:tasks) { schema(infer: true) }
8
- end
9
-
10
- with_adapters do
11
- it 'projects a relation using a list of symbols' do
12
- expect(relation.select(:id, :title).to_a)
13
- .to eql([{ id: 1, title: "Joe's task" }, { id: 2, title: "Jane's task"}])
14
- end
15
-
16
- it 'projects a relation using a schema' do
17
- expect(relation.select(*relation.schema.project(:id, :title)).to_a)
18
- .to eql([{ id: 1, title: "Joe's task" }, { id: 2, title: "Jane's task"}])
19
- end
20
-
21
- it 'maintains schema' do
22
- expect(relation.select(:id, :title).schema.map(&:name)).to eql(%i[id title])
23
- end
24
-
25
- it 'supports args and blocks' do
26
- expect(relation.select(:id) { [title] }.schema.map(&:name)).to eql(%i[id title])
27
- end
28
-
29
- it 'supports blocks' do
30
- expect(relation.select { [id, title] }.schema.map(&:name)).to eql(%i[id title])
31
- end
32
-
33
- it 'supports selecting literal strings' do
34
- new_rel = relation.select { `'event'`.as(:type) }
35
-
36
- expect(new_rel.schema[:type].primitive).to be(String)
37
- expect(new_rel.first).to eql(type: 'event')
38
- end
39
- end
40
- end
@@ -1,11 +0,0 @@
1
- RSpec.describe ROM::Relation, '#sum' do
2
- subject(:relation) { container.relations.users }
3
-
4
- include_context 'users and tasks'
5
-
6
- with_adapters do
7
- it 'returns a sum' do
8
- expect(relation.sum(:id)).to eql(3)
9
- end
10
- end
11
- end
@@ -1,19 +0,0 @@
1
- RSpec.describe ROM::Relation, '#union' do
2
- subject(:relation) { container.relations.users }
3
-
4
- include_context 'users and tasks'
5
-
6
- with_adapters do
7
- let(:relation1) { relation.where(id: 1).select(:id, :name) }
8
- let(:relation2) { relation.where(id: 2).select(:id, :name) }
9
-
10
- it 'unions two relations and returns a new relation' do
11
- result = relation1.union(relation2)
12
-
13
- expect(result.to_a).to match_array([
14
- { id: 1, name: 'Jane' },
15
- { id: 2, name: 'Joe' }
16
- ])
17
- end
18
- end
19
- end
@@ -1,18 +0,0 @@
1
- RSpec.describe ROM::Relation, '#unique?' do
2
- subject(:relation) { container.relations.tasks }
3
-
4
- include_context 'users and tasks'
5
-
6
- with_adapters do
7
- before { relation.delete }
8
-
9
- it 'returns true when there is only one tuple matching criteria' do
10
- expect(relation.unique?(title: 'Task One')).to be(true)
11
- end
12
-
13
- it 'returns true when there are more than one tuple matching criteria' do
14
- relation.insert(title: 'Task One')
15
- expect(relation.unique?(title: 'Task One')).to be(false)
16
- end
17
- end
18
- end
@@ -1,133 +0,0 @@
1
- RSpec.describe ROM::Relation, '#where' do
2
- subject(:relation) { relations[:tasks].select(:id, :title) }
3
-
4
- include_context 'users and tasks'
5
-
6
- with_adapters do
7
- context 'without :read types' do
8
- it 'restricts relation using provided conditions' do
9
- expect(relation.where(id: 1).to_a).
10
- to eql([{ id: 1, title: "Joe's task" }])
11
- end
12
-
13
- it 'restricts relation using provided conditions and block' do
14
- expect(relation.where(id: 1) { title.like("%Jane%") }.to_a).to be_empty
15
- end
16
-
17
- it 'restricts relation using provided conditions in a block' do
18
- expect(relation.where { (id > 2) & title.like("%Jane%") }.to_a).to be_empty
19
- end
20
-
21
- it 'restricts relation using canonical attributes' do
22
- expect(relation.rename(id: :user_id).where { id > 3 }.to_a).to be_empty
23
- end
24
-
25
- it 'restricts with or condition' do
26
- expect(relation.where { id.is(1) | id.is(2) }.to_a).
27
- to eql([{ id: 1, title: "Joe's task" }, { id: 2, title: "Jane's task" }])
28
- end
29
-
30
- it 'restricts with a range condition' do
31
- expect(relation.where { id.in(-1...2) }.to_a).
32
- to eql([{ id: 1, title: "Joe's task" }])
33
-
34
- expect(relation.where { id.in(0...3) }.to_a).
35
- to eql([{ id: 1, title: "Joe's task" }, { id: 2, title: "Jane's task" }])
36
- end
37
-
38
- it 'restricts with an inclusive range' do
39
- expect(relation.where { id.in(0..2) }.to_a).
40
- to eql([{ id: 1, title: "Joe's task" }, { id: 2, title: "Jane's task" }])
41
- end
42
-
43
- it 'restricts with an ordinary enum' do
44
- expect(relation.where { id.in(2, 3) }.to_a).
45
- to eql([{ id: 2, title: "Jane's task" }])
46
- end
47
-
48
- it 'restricts with enum using self syntax' do
49
- expect(relation.where(relation[:id].in(2, 3)).to_a).
50
- to eql([{ id: 2, title: "Jane's task" }])
51
- end
52
-
53
- context 'using underscored symbols for qualifying' do
54
- before { Sequel.split_symbols = true }
55
- after { Sequel.split_symbols = false }
56
-
57
- it 'queries with a qualified name' do
58
- expect(relation.where(tasks__id: 1).to_a).
59
- to eql([{ id: 1, title: "Joe's task" }])
60
- end
61
- end
62
-
63
- it 'restricts with a function' do
64
- expect(relation.where { string::lower(title).is("joe's task") }.to_a).
65
- to eql([{ id: 1, title: "Joe's task" }])
66
- end
67
-
68
- it 'restricts with a function using LIKE' do
69
- expect(relation.where { string::lower(title).like("joe%") }.to_a).
70
- to eql([{ id: 1, title: "Joe's task" }])
71
- end
72
- end
73
-
74
- context 'with :read types' do
75
- before do
76
- conf.relation(:tasks) do
77
- schema(infer: true) do
78
- attribute :id, ROM::SQL::Types::Serial.constructor(&:to_i)
79
- attribute :title, ROM::SQL::Types::Coercible::String
80
- end
81
- end
82
-
83
- module Test
84
- Id = Struct.new(:v) do
85
- def to_i
86
- v.to_i
87
- end
88
- end
89
-
90
- Title = Struct.new(:v) do
91
- def to_s
92
- v.to_s
93
- end
94
- end
95
- end
96
- end
97
-
98
- it 'applies write_schema to hash conditions' do
99
- rel = tasks.where(id: Test::Id.new('2'), title: Test::Title.new(:"Jane's task"))
100
-
101
- expect(rel.first).
102
- to eql(id: 2, user_id: 1, title: "Jane's task")
103
- end
104
-
105
- it 'applies write_schema to hash conditions where value is an array' do
106
- ids = %w(1 2).map(&Test::Id.method(:new))
107
- rel = tasks.where(id: ids)
108
-
109
- expect(rel.to_a).
110
- to eql([
111
- { id: 1, user_id: 2, title: "Joe's task" },
112
- { id: 2, user_id: 1, title: "Jane's task" }
113
- ])
114
- end
115
-
116
- it 'applies write_schema to conditions with operators other than equality' do
117
- rel = tasks.where { id >= Test::Id.new('2') }
118
-
119
- expect(rel.first).
120
- to eql(id: 2, user_id: 1, title: "Jane's task")
121
- end
122
-
123
- it 'applies write_schema to conditions in a block' do
124
- rel = tasks.where {
125
- id.is(Test::Id.new('2')) & title.is(Test::Title.new(:"Jane's task"))
126
- }
127
-
128
- expect(rel.first).
129
- to eql(id: 2, user_id: 1, title: "Jane's task")
130
- end
131
- end
132
- end
133
- end
@@ -1,34 +0,0 @@
1
- require 'spec_helper'
2
-
3
- RSpec.describe ROM::SQL::RestrictionDSL, :sqlite, helpers: true do
4
- include_context 'database setup'
5
-
6
- subject(:dsl) do
7
- ROM::SQL::RestrictionDSL.new(schema)
8
- end
9
-
10
- let(:schema) do
11
- define_schema(:users, id: ROM::SQL::Types::Serial, name: ROM::SQL::Types::String)
12
- end
13
-
14
- let(:ds) do
15
- conn[:users]
16
- end
17
-
18
- describe '#call' do
19
- it 'evaluates the block and returns an SQL expression' do
20
- expect(conn[:users].literal(dsl.call { count(id) >= 3 })).to eql('(count(`id`) >= 3)')
21
- end
22
- end
23
-
24
- describe '#method_missing' do
25
- it 'responds to methods matching attribute names' do
26
- expect(dsl.id.name).to be(:id)
27
- expect(dsl.name.name).to be(:name)
28
- end
29
-
30
- it 'delegates to sequel virtual row' do
31
- expect(conn[:users].literal(dsl.count(dsl.id))).to eql('count(`id`)')
32
- end
33
- end
34
- end
@@ -1,25 +0,0 @@
1
- RSpec.describe ROM::SQL::Schema, :postgres do
2
- describe '#primary_key' do
3
- it 'returns primary key attributes' do
4
- schema_proc = Class.new(ROM::Relation[:sql]).schema do
5
- attribute :id, ROM::SQL::Types::Serial
6
- end
7
-
8
- schema = schema_proc.call
9
- schema.finalize_attributes!.finalize!
10
-
11
- expect(schema.primary_key).to eql([schema[:id]])
12
- end
13
-
14
- it 'returns empty array when there is no PK defined' do
15
- schema_proc = Class.new(ROM::Relation[:sql]).schema do
16
- attribute :id, ROM::SQL::Types::Int
17
- end
18
-
19
- schema = schema_proc.call
20
- schema.finalize_attributes!.finalize!
21
-
22
- expect(schema.primary_key).to eql([])
23
- end
24
- end
25
- end
@@ -1,65 +0,0 @@
1
- require 'rom/sql/types'
2
-
3
- RSpec.describe ROM::SQL::Types, :postgres do
4
- describe ROM::SQL::Types::Blob do
5
- it 'coerces strings to Sequel::SQL::Blob' do
6
- input = 'sutin'
7
- output = described_class[input]
8
-
9
- expect(output).to be_instance_of(Sequel::SQL::Blob)
10
- expect(output).to eql('sutin')
11
- end
12
- end
13
-
14
- describe '#sql_literal', helpers: true do
15
- subject(:base) { define_attribute(:age, :Int, source: ROM::Relation::Name.new(:users)) }
16
-
17
- include_context 'database setup'
18
-
19
- let(:ds) { container.gateways[:default][:users] }
20
- let(:sql_literal) { type.sql_literal(ds) }
21
-
22
- context 'when qualified' do
23
- subject(:type) { base.qualified }
24
-
25
- specify do
26
- expect(sql_literal).to eql(%("users"."age"))
27
- end
28
- end
29
-
30
- context 'when aliased' do
31
- subject(:type) { base.as(:user_age) }
32
-
33
- specify do
34
- expect(sql_literal).to eql(%("age" AS "user_age"))
35
- end
36
- end
37
-
38
- context 'when qualified and aliased' do
39
- subject(:type) { base.qualified.as(:user_age) }
40
-
41
- specify do
42
- expect(sql_literal).to eql(%("users"."age" AS "user_age"))
43
- end
44
- end
45
-
46
- context 'when aliased and qualified' do
47
- subject(:type) { base.as(:user_age).qualified }
48
-
49
- specify do
50
- expect(sql_literal).to eql(%("users"."age" AS "user_age"))
51
- end
52
- end
53
-
54
- context 'when qualified with a function expr' do
55
- subject(:type) { base.meta(sql_expr: func).qualified }
56
-
57
- let(:func) { Sequel::SQL::Function.new(:count, :age) }
58
-
59
- specify do
60
- expect { sql_literal }.
61
- to raise_error(ROM::SQL::Attribute::QualifyError, "can't qualify :age (#{func.inspect})")
62
- end
63
- end
64
- end
65
- end