Skip to content

Commit 6d0870b

Browse files
committed
Add support for inserts from select queries
1 parent 2594d3a commit 6d0870b

File tree

3 files changed

+47
-9
lines changed

3 files changed

+47
-9
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## 2.1.7
2+
3+
- Add support for inserts from select queries
4+
15
## 2.1.6
26

37
- Upgrade sqlparser

lib/src/timestamped_crdt.dart

+42-8
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,48 @@ abstract class TimestampedCrdt extends BaseCrdt {
1010
@override
1111
Future<void> _insert(InsertStatement statement, List<Object?>? args,
1212
[Hlc? hlc]) async {
13+
// Force explicit column description in insert statements
14+
assert(statement.targetColumns.isNotEmpty,
15+
'Unsupported statement: target columns must be explicitly stated.\n${statement.toSql()}');
16+
// Disallow star select statements
17+
assert(
18+
statement.source is! SelectInsertSource ||
19+
((statement.source as SelectInsertSource).stmt as SelectStatement)
20+
.columns
21+
.whereType<StarResultColumn>()
22+
.isEmpty,
23+
'Unsupported statement: select columns must be explicitly stated.\n${statement.toSql()}');
24+
1325
final argCount = args?.length ?? 0;
26+
final source = switch (statement.source) {
27+
ValuesSource s => ValuesSource([
28+
Tuple(expressions: [
29+
...s.values.first.expressions,
30+
NumberedVariable(argCount + 1),
31+
NumberedVariable(argCount + 2),
32+
NumberedVariable(argCount + 3),
33+
])
34+
]),
35+
SelectInsertSource s => SelectInsertSource(SelectStatement(
36+
withClause: (s.stmt as SelectStatement).withClause,
37+
distinct: (s.stmt as SelectStatement).distinct,
38+
columns: [
39+
...(s.stmt as SelectStatement).columns,
40+
ExpressionResultColumn(expression: NumberedVariable(argCount + 1)),
41+
ExpressionResultColumn(expression: NumberedVariable(argCount + 2)),
42+
ExpressionResultColumn(expression: NumberedVariable(argCount + 3)),
43+
],
44+
from: (s.stmt as SelectStatement).from,
45+
where: (s.stmt as SelectStatement).where,
46+
groupBy: (s.stmt as SelectStatement).groupBy,
47+
windowDeclarations: (s.stmt as SelectStatement).windowDeclarations,
48+
orderBy: (s.stmt as SelectStatement).orderBy,
49+
limit: (s.stmt as SelectStatement).limit,
50+
)),
51+
_ => throw UnimplementedError(
52+
'Unsupported data source: ${statement.source.runtimeType}, please file an issue in the sql_crdt project.')
53+
};
54+
1455
final newStatement = InsertStatement(
1556
mode: statement.mode,
1657
upsert: statement.upsert,
@@ -23,14 +64,7 @@ abstract class TimestampedCrdt extends BaseCrdt {
2364
Reference(columnName: 'node_id'),
2465
Reference(columnName: 'modified'),
2566
],
26-
source: ValuesSource([
27-
Tuple(expressions: [
28-
...(statement.source as ValuesSource).values.first.expressions,
29-
NumberedVariable(argCount + 1),
30-
NumberedVariable(argCount + 2),
31-
NumberedVariable(argCount + 3),
32-
])
33-
]),
67+
source: source,
3468
);
3569

3670
// Touch

pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: sql_crdt
22
description: Base package for Conflict-free Replicated Data Types (CRDTs) using SQL databases
3-
version: 2.1.6
3+
version: 2.1.7
44
homepage: https://github.com/cachapa/sql_crdt
55
repository: https://github.com/cachapa/sql_crdt
66
issue_tracker: https://github.com/cachapa/sql_crdt/issues

0 commit comments

Comments
 (0)