Skip to content

Commit adabc4c

Browse files
committed
duckdb: Add support for auto increment primary key
1 parent b336073 commit adabc4c

File tree

4 files changed

+55
-2
lines changed

4 files changed

+55
-2
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
module ActiveRecord
2+
module ConnectionAdapters
3+
module ADBC
4+
class SchemaCreation < ConnectionAdapters::SchemaCreation
5+
private def quote_string(s)
6+
@conn.quote_string(s)
7+
end
8+
9+
private def sequence_name(column)
10+
"sequence_#{column.table.name}_#{column.name}"
11+
end
12+
13+
private def quoted_sequence_name(column)
14+
quote_table_name(sequence_name(column))
15+
end
16+
17+
def visit_ColumnDefinition(o)
18+
sql = super
19+
if o.type == :primary_key and @conn.backend == "duckdb"
20+
sql << " DEFAULT NEXTVAL('#{quote_string(sequence_name(o))}')"
21+
end
22+
sql
23+
end
24+
25+
def visit_TableDefinition(o)
26+
o.columns.each do |column|
27+
column.singleton_class.define_method(:table) do
28+
o
29+
end
30+
end
31+
sql = super
32+
if @conn.backend == "duckdb"
33+
o.columns.each do |column|
34+
if column.type == :primary_key
35+
s = +"CREATE SEQUENCE"
36+
s << " IF NOT EXISTS" if o.if_not_exists
37+
s << " #{quoted_sequence_name(column)}"
38+
s << "; #{sql}"
39+
sql = s
40+
end
41+
end
42+
end
43+
sql
44+
end
45+
end
46+
end
47+
end
48+
end

lib/active_record/connection_adapters/adbc/schema_statements.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ def create_table_definition(name, **options)
155155
ADBC::TableDefinition.new(self, name, **options)
156156
end
157157

158+
def schema_creation
159+
ADBC::SchemaCreation.new(self)
160+
end
161+
158162
def new_column_from_field(table_name, field, definitions)
159163
ADBC::Column.new(field["column_name"],
160164
field["xdbc_column_def"],

lib/active_record/connection_adapters/adbc_adapter.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
require_relative "adbc/database_statements"
55
require_relative "adbc/quoting"
66
require_relative "adbc/result"
7+
require_relative "adbc/schema_creation"
78
require_relative "adbc/schema_definitions"
89
require_relative "adbc/schema_statements"
910

@@ -150,11 +151,11 @@ def build_insert_sql(insert)
150151
sql
151152
end
152153

153-
private
154154
def backend
155155
@connection_parameters[:driver].gsub(/\Aadbc_driver_/, "")
156156
end
157157

158+
private
158159
def detect_features
159160
detect_features_method = "detect_features_#{backend}"
160161
if respond_to?(detect_features_method, true)

test/test-type.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ def test_integer
55
ActiveRecord::Base.connection.create_table("users") do |table|
66
table.column :integer, :integer
77
end
8-
User.create!(id: 1, integer: 1)
8+
User.create!(integer: 1)
99
assert_equal(User.new(id: 1, integer: 1),
1010
User.first)
1111
end

0 commit comments

Comments
 (0)