1 package sqlgen
2
3 import (
4 "fmt"
5 "time"
6
7 "github.com/doug-martin/goqu/v9/exp"
8 )
9
10 type (
11 SQLFragmentType int
12 SQLDialectOptions struct {
13
14 SupportsOrderByOnDelete bool
15
16 SupportsDeleteTableHint bool
17
18 SupportsOrderByOnUpdate bool
19
20 SupportsLimitOnDelete bool
21
22 SupportsLimitOnUpdate bool
23
24 SupportsReturn bool
25
26 SupportsConflictTarget bool
27
28 SupportsConflictUpdateWhere bool
29
30 SupportsInsertIgnoreSyntax bool
31
32 SupportsWithCTE bool
33
34 SupportsWithCTERecursive bool
35
36 SupportsMultipleUpdateTables bool
37
38 SupportsDistinctOn bool
39
40 SupportsLateral bool
41
42 WrapCompoundsInParens bool
43
44
45 SupportsWindowFunction bool
46
47
48 UseFromClauseForMultipleUpdateTables bool
49
50
51 SurroundLimitWithParentheses bool
52
53
54 UpdateClause []byte
55
56 InsertClause []byte
57
58 InsertIgnoreClause []byte
59
60 SelectClause []byte
61
62 DeleteClause []byte
63
64 TruncateClause []byte
65
66 WithFragment []byte
67
68 RecursiveFragment []byte
69
70 CascadeFragment []byte
71
72 RestrictFragment []byte
73
74
75 DefaultValuesFragment []byte
76
77
78 ValuesFragment []byte
79
80
81 IdentityFragment []byte
82
83 SetFragment []byte
84
85 DistinctFragment []byte
86
87 ReturningFragment []byte
88
89 FromFragment []byte
90
91 UsingFragment []byte
92
93 OnFragment []byte
94
95 WhereFragment []byte
96
97 GroupByFragment []byte
98
99 HavingFragment []byte
100
101 WindowFragment []byte
102
103 WindowPartitionByFragment []byte
104
105 WindowOrderByFragment []byte
106
107 WindowOverFragment []byte
108
109 OrderByFragment []byte
110
111 FetchFragment []byte
112
113 LimitFragment []byte
114
115 OffsetFragment []byte
116
117 ForUpdateFragment []byte
118
119 ForNoKeyUpdateFragment []byte
120
121 ForShareFragment []byte
122
123 OfFragment []byte
124
125 ForKeyShareFragment []byte
126
127 NowaitFragment []byte
128
129 SkipLockedFragment []byte
130
131 AsFragment []byte
132
133 LateralFragment []byte
134
135 QuoteRune rune
136
137 Null []byte
138
139 True []byte
140
141 False []byte
142
143 AscFragment []byte
144
145 DescFragment []byte
146
147 NullsFirstFragment []byte
148
149 NullsLastFragment []byte
150
151 AndFragment []byte
152
153 OrFragment []byte
154
155 UnionFragment []byte
156
157 UnionAllFragment []byte
158
159 IntersectFragment []byte
160
161 IntersectAllFragment []byte
162
163 CastFragment []byte
164
165 CaseFragment []byte
166
167 WhenFragment []byte
168
169 ThenFragment []byte
170
171 ElseFragment []byte
172
173 EndFragment []byte
174
175 StringQuote rune
176
177 SetOperatorRune rune
178
179 PlaceHolderFragment []byte
180
181 EmptyString string
182
183 CommaRune rune
184
185 SpaceRune rune
186
187 LeftParenRune rune
188
189 RightParenRune rune
190
191 StarRune rune
192
193 PeriodRune rune
194
195 IncludePlaceholderNum bool
196
197 TimeFormat string
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219 BooleanOperatorLookup map[exp.BooleanOperation][]byte
220
221
222
223
224
225
226
227
228
229 BitwiseOperatorLookup map[exp.BitwiseOperation][]byte
230
231
232
233
234
235 RangeOperatorLookup map[exp.RangeOperation][]byte
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251 JoinTypeLookup map[exp.JoinType][]byte
252
253 BooleanDataTypeSupported bool
254
255 UseLiteralIsBools bool
256
257
258
259
260
261 EscapedRunes map[rune][]byte
262
263
264 ConflictFragment []byte
265
266 ConflictDoNothingFragment []byte
267
268 ConflictDoUpdateFragment []byte
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285 SelectSQLOrder []SQLFragmentType
286
287
288
289
290
291
292
293
294
295
296
297
298 UpdateSQLOrder []SQLFragmentType
299
300
301
302
303
304
305
306
307
308 InsertSQLOrder []SQLFragmentType
309
310
311
312
313
314
315
316
317
318
319
320 DeleteSQLOrder []SQLFragmentType
321
322
323
324
325
326 TruncateSQLOrder []SQLFragmentType
327 }
328 )
329
330 const (
331 CommonTableSQLFragment = iota
332 SelectSQLFragment
333 SelectWithLimitSQLFragment
334 FromSQLFragment
335 JoinSQLFragment
336 WhereSQLFragment
337 GroupBySQLFragment
338 HavingSQLFragment
339 CompoundsSQLFragment
340 OrderSQLFragment
341 OrderWithOffsetFetchSQLFragment
342 LimitSQLFragment
343 OffsetSQLFragment
344 ForSQLFragment
345 UpdateBeginSQLFragment
346 SourcesSQLFragment
347 IntoSQLFragment
348 UpdateSQLFragment
349 UpdateFromSQLFragment
350 ReturningSQLFragment
351 InsertBeingSQLFragment
352 InsertSQLFragment
353 DeleteBeginSQLFragment
354 TruncateSQLFragment
355 WindowSQLFragment
356 )
357
358
359 func (sf SQLFragmentType) String() string {
360 switch sf {
361 case CommonTableSQLFragment:
362 return "CommonTableSQLFragment"
363 case SelectSQLFragment:
364 return "SelectSQLFragment"
365 case FromSQLFragment:
366 return "FromSQLFragment"
367 case JoinSQLFragment:
368 return "JoinSQLFragment"
369 case WhereSQLFragment:
370 return "WhereSQLFragment"
371 case GroupBySQLFragment:
372 return "GroupBySQLFragment"
373 case HavingSQLFragment:
374 return "HavingSQLFragment"
375 case CompoundsSQLFragment:
376 return "CompoundsSQLFragment"
377 case OrderSQLFragment:
378 return "OrderSQLFragment"
379 case LimitSQLFragment:
380 return "LimitSQLFragment"
381 case OffsetSQLFragment:
382 return "OffsetSQLFragment"
383 case ForSQLFragment:
384 return "ForSQLFragment"
385 case UpdateBeginSQLFragment:
386 return "UpdateBeginSQLFragment"
387 case SourcesSQLFragment:
388 return "SourcesSQLFragment"
389 case IntoSQLFragment:
390 return "IntoSQLFragment"
391 case UpdateSQLFragment:
392 return "UpdateSQLFragment"
393 case UpdateFromSQLFragment:
394 return "UpdateFromSQLFragment"
395 case ReturningSQLFragment:
396 return "ReturningSQLFragment"
397 case InsertBeingSQLFragment:
398 return "InsertBeingSQLFragment"
399 case DeleteBeginSQLFragment:
400 return "DeleteBeginSQLFragment"
401 case TruncateSQLFragment:
402 return "TruncateSQLFragment"
403 case WindowSQLFragment:
404 return "WindowSQLFragment"
405 }
406 return fmt.Sprintf("%d", sf)
407 }
408
409
410 func DefaultDialectOptions() *SQLDialectOptions {
411 return &SQLDialectOptions{
412 SupportsOrderByOnDelete: false,
413 SupportsDeleteTableHint: false,
414 SupportsOrderByOnUpdate: false,
415 SupportsLimitOnDelete: false,
416 SupportsLimitOnUpdate: false,
417 SupportsReturn: true,
418 SupportsConflictUpdateWhere: true,
419 SupportsInsertIgnoreSyntax: false,
420 SupportsConflictTarget: true,
421 SupportsWithCTE: true,
422 SupportsWithCTERecursive: true,
423 SupportsDistinctOn: true,
424 WrapCompoundsInParens: true,
425 SupportsWindowFunction: true,
426 SupportsLateral: true,
427
428 SupportsMultipleUpdateTables: true,
429 UseFromClauseForMultipleUpdateTables: true,
430
431 UpdateClause: []byte("UPDATE"),
432 InsertClause: []byte("INSERT INTO"),
433 InsertIgnoreClause: []byte("INSERT IGNORE INTO"),
434 SelectClause: []byte("SELECT"),
435 DeleteClause: []byte("DELETE"),
436 TruncateClause: []byte("TRUNCATE"),
437 WithFragment: []byte("WITH "),
438 RecursiveFragment: []byte("RECURSIVE "),
439 CascadeFragment: []byte(" CASCADE"),
440 RestrictFragment: []byte(" RESTRICT"),
441 DefaultValuesFragment: []byte(" DEFAULT VALUES"),
442 ValuesFragment: []byte(" VALUES "),
443 IdentityFragment: []byte(" IDENTITY"),
444 SetFragment: []byte(" SET "),
445 DistinctFragment: []byte("DISTINCT"),
446 ReturningFragment: []byte(" RETURNING "),
447 FromFragment: []byte(" FROM"),
448 UsingFragment: []byte(" USING "),
449 OnFragment: []byte(" ON "),
450 WhereFragment: []byte(" WHERE "),
451 GroupByFragment: []byte(" GROUP BY "),
452 HavingFragment: []byte(" HAVING "),
453 WindowFragment: []byte(" WINDOW "),
454 WindowPartitionByFragment: []byte("PARTITION BY "),
455 WindowOrderByFragment: []byte("ORDER BY "),
456 WindowOverFragment: []byte(" OVER "),
457 OrderByFragment: []byte(" ORDER BY "),
458 FetchFragment: []byte(" "),
459 LimitFragment: []byte(" LIMIT "),
460 OffsetFragment: []byte(" OFFSET "),
461 ForUpdateFragment: []byte(" FOR UPDATE "),
462 ForNoKeyUpdateFragment: []byte(" FOR NO KEY UPDATE "),
463 ForShareFragment: []byte(" FOR SHARE "),
464 ForKeyShareFragment: []byte(" FOR KEY SHARE "),
465 OfFragment: []byte("OF "),
466 NowaitFragment: []byte("NOWAIT"),
467 SkipLockedFragment: []byte("SKIP LOCKED"),
468 LateralFragment: []byte("LATERAL "),
469 AsFragment: []byte(" AS "),
470 AscFragment: []byte(" ASC"),
471 DescFragment: []byte(" DESC"),
472 NullsFirstFragment: []byte(" NULLS FIRST"),
473 NullsLastFragment: []byte(" NULLS LAST"),
474 AndFragment: []byte(" AND "),
475 OrFragment: []byte(" OR "),
476 UnionFragment: []byte(" UNION "),
477 UnionAllFragment: []byte(" UNION ALL "),
478 IntersectFragment: []byte(" INTERSECT "),
479 IntersectAllFragment: []byte(" INTERSECT ALL "),
480 ConflictFragment: []byte(" ON CONFLICT"),
481 ConflictDoUpdateFragment: []byte(" DO UPDATE SET "),
482 ConflictDoNothingFragment: []byte(" DO NOTHING"),
483 CastFragment: []byte("CAST"),
484 CaseFragment: []byte("CASE "),
485 WhenFragment: []byte(" WHEN "),
486 ThenFragment: []byte(" THEN "),
487 ElseFragment: []byte(" ELSE "),
488 EndFragment: []byte(" END"),
489 Null: []byte("NULL"),
490 True: []byte("TRUE"),
491 False: []byte("FALSE"),
492
493 PlaceHolderFragment: []byte("?"),
494 QuoteRune: '"',
495 StringQuote: '\'',
496 SetOperatorRune: '=',
497 CommaRune: ',',
498 SpaceRune: ' ',
499 LeftParenRune: '(',
500 RightParenRune: ')',
501 StarRune: '*',
502 PeriodRune: '.',
503 EmptyString: "",
504
505 BooleanOperatorLookup: map[exp.BooleanOperation][]byte{
506 exp.EqOp: []byte("="),
507 exp.NeqOp: []byte("!="),
508 exp.GtOp: []byte(">"),
509 exp.GteOp: []byte(">="),
510 exp.LtOp: []byte("<"),
511 exp.LteOp: []byte("<="),
512 exp.InOp: []byte("IN"),
513 exp.NotInOp: []byte("NOT IN"),
514 exp.IsOp: []byte("IS"),
515 exp.IsNotOp: []byte("IS NOT"),
516 exp.LikeOp: []byte("LIKE"),
517 exp.NotLikeOp: []byte("NOT LIKE"),
518 exp.ILikeOp: []byte("ILIKE"),
519 exp.NotILikeOp: []byte("NOT ILIKE"),
520 exp.RegexpLikeOp: []byte("~"),
521 exp.RegexpNotLikeOp: []byte("!~"),
522 exp.RegexpILikeOp: []byte("~*"),
523 exp.RegexpNotILikeOp: []byte("!~*"),
524 },
525 BitwiseOperatorLookup: map[exp.BitwiseOperation][]byte{
526 exp.BitwiseInversionOp: []byte("~"),
527 exp.BitwiseOrOp: []byte("|"),
528 exp.BitwiseAndOp: []byte("&"),
529 exp.BitwiseXorOp: []byte("#"),
530 exp.BitwiseLeftShiftOp: []byte("<<"),
531 exp.BitwiseRightShiftOp: []byte(">>"),
532 },
533 RangeOperatorLookup: map[exp.RangeOperation][]byte{
534 exp.BetweenOp: []byte("BETWEEN"),
535 exp.NotBetweenOp: []byte("NOT BETWEEN"),
536 },
537 JoinTypeLookup: map[exp.JoinType][]byte{
538 exp.InnerJoinType: []byte(" INNER JOIN "),
539 exp.FullOuterJoinType: []byte(" FULL OUTER JOIN "),
540 exp.RightOuterJoinType: []byte(" RIGHT OUTER JOIN "),
541 exp.LeftOuterJoinType: []byte(" LEFT OUTER JOIN "),
542 exp.FullJoinType: []byte(" FULL JOIN "),
543 exp.RightJoinType: []byte(" RIGHT JOIN "),
544 exp.LeftJoinType: []byte(" LEFT JOIN "),
545 exp.NaturalJoinType: []byte(" NATURAL JOIN "),
546 exp.NaturalLeftJoinType: []byte(" NATURAL LEFT JOIN "),
547 exp.NaturalRightJoinType: []byte(" NATURAL RIGHT JOIN "),
548 exp.NaturalFullJoinType: []byte(" NATURAL FULL JOIN "),
549 exp.CrossJoinType: []byte(" CROSS JOIN "),
550 },
551
552 TimeFormat: time.RFC3339Nano,
553
554 BooleanDataTypeSupported: true,
555 UseLiteralIsBools: true,
556
557 EscapedRunes: map[rune][]byte{
558 '\'': []byte("''"),
559 },
560
561 SelectSQLOrder: []SQLFragmentType{
562 CommonTableSQLFragment,
563 SelectSQLFragment,
564 FromSQLFragment,
565 JoinSQLFragment,
566 WhereSQLFragment,
567 GroupBySQLFragment,
568 HavingSQLFragment,
569 WindowSQLFragment,
570 CompoundsSQLFragment,
571 OrderSQLFragment,
572 LimitSQLFragment,
573 OffsetSQLFragment,
574 ForSQLFragment,
575 },
576 UpdateSQLOrder: []SQLFragmentType{
577 CommonTableSQLFragment,
578 UpdateBeginSQLFragment,
579 SourcesSQLFragment,
580 UpdateSQLFragment,
581 UpdateFromSQLFragment,
582 WhereSQLFragment,
583 OrderSQLFragment,
584 LimitSQLFragment,
585 ReturningSQLFragment,
586 },
587 InsertSQLOrder: []SQLFragmentType{
588 CommonTableSQLFragment,
589 InsertBeingSQLFragment,
590 IntoSQLFragment,
591 InsertSQLFragment,
592 ReturningSQLFragment,
593 },
594 DeleteSQLOrder: []SQLFragmentType{
595 CommonTableSQLFragment,
596 DeleteBeginSQLFragment,
597 FromSQLFragment,
598 WhereSQLFragment,
599 OrderSQLFragment,
600 LimitSQLFragment,
601 ReturningSQLFragment,
602 },
603 TruncateSQLOrder: []SQLFragmentType{
604 TruncateSQLFragment,
605 },
606 }
607 }
608
View as plain text