@vetala/vetala 0.1.0-beta

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.

Potentially problematic release.


This version of @vetala/vetala might be problematic. Click here for more details.

Files changed (271) hide show
  1. package/CONTRIBUTING.md +77 -0
  2. package/LICENSE +184 -0
  3. package/README.md +136 -0
  4. package/THIRD_PARTY_LICENSES.md +17 -0
  5. package/dist/src/agent.d.ts +30 -0
  6. package/dist/src/agent.js +216 -0
  7. package/dist/src/agent.js.map +1 -0
  8. package/dist/src/approvals.d.ts +18 -0
  9. package/dist/src/approvals.js +81 -0
  10. package/dist/src/approvals.js.map +1 -0
  11. package/dist/src/cli.d.ts +2 -0
  12. package/dist/src/cli.js +87 -0
  13. package/dist/src/cli.js.map +1 -0
  14. package/dist/src/config.d.ts +12 -0
  15. package/dist/src/config.js +183 -0
  16. package/dist/src/config.js.map +1 -0
  17. package/dist/src/context-memory.d.ts +7 -0
  18. package/dist/src/context-memory.js +96 -0
  19. package/dist/src/context-memory.js.map +1 -0
  20. package/dist/src/ink/command-suggestions.d.ts +7 -0
  21. package/dist/src/ink/command-suggestions.js +179 -0
  22. package/dist/src/ink/command-suggestions.js.map +1 -0
  23. package/dist/src/ink/ink-terminal-ui.d.ts +36 -0
  24. package/dist/src/ink/ink-terminal-ui.js +79 -0
  25. package/dist/src/ink/ink-terminal-ui.js.map +1 -0
  26. package/dist/src/ink/repl-app.d.ts +9 -0
  27. package/dist/src/ink/repl-app.js +789 -0
  28. package/dist/src/ink/repl-app.js.map +1 -0
  29. package/dist/src/ink/transcript-cards.d.ts +6 -0
  30. package/dist/src/ink/transcript-cards.js +24 -0
  31. package/dist/src/ink/transcript-cards.js.map +1 -0
  32. package/dist/src/path-policy.d.ts +11 -0
  33. package/dist/src/path-policy.js +67 -0
  34. package/dist/src/path-policy.js.map +1 -0
  35. package/dist/src/process-utils.d.ts +13 -0
  36. package/dist/src/process-utils.js +52 -0
  37. package/dist/src/process-utils.js.map +1 -0
  38. package/dist/src/repl.d.ts +9 -0
  39. package/dist/src/repl.js +13 -0
  40. package/dist/src/repl.js.map +1 -0
  41. package/dist/src/sarvam/client.d.ts +15 -0
  42. package/dist/src/sarvam/client.js +208 -0
  43. package/dist/src/sarvam/client.js.map +1 -0
  44. package/dist/src/sarvam/models.d.ts +2 -0
  45. package/dist/src/sarvam/models.js +7 -0
  46. package/dist/src/sarvam/models.js.map +1 -0
  47. package/dist/src/search-provider.d.ts +6 -0
  48. package/dist/src/search-provider.js +8 -0
  49. package/dist/src/search-provider.js.map +1 -0
  50. package/dist/src/session-store.d.ts +19 -0
  51. package/dist/src/session-store.js +318 -0
  52. package/dist/src/session-store.js.map +1 -0
  53. package/dist/src/skills/runtime.d.ts +26 -0
  54. package/dist/src/skills/runtime.js +317 -0
  55. package/dist/src/skills/runtime.js.map +1 -0
  56. package/dist/src/skills/types.d.ts +25 -0
  57. package/dist/src/skills/types.js +2 -0
  58. package/dist/src/skills/types.js.map +1 -0
  59. package/dist/src/terminal-ui.d.ts +29 -0
  60. package/dist/src/terminal-ui.js +236 -0
  61. package/dist/src/terminal-ui.js.map +1 -0
  62. package/dist/src/tools/filesystem.d.ts +2 -0
  63. package/dist/src/tools/filesystem.js +622 -0
  64. package/dist/src/tools/filesystem.js.map +1 -0
  65. package/dist/src/tools/git.d.ts +2 -0
  66. package/dist/src/tools/git.js +326 -0
  67. package/dist/src/tools/git.js.map +1 -0
  68. package/dist/src/tools/index.d.ts +6 -0
  69. package/dist/src/tools/index.js +21 -0
  70. package/dist/src/tools/index.js.map +1 -0
  71. package/dist/src/tools/registry.d.ts +15 -0
  72. package/dist/src/tools/registry.js +59 -0
  73. package/dist/src/tools/registry.js.map +1 -0
  74. package/dist/src/tools/shell.d.ts +2 -0
  75. package/dist/src/tools/shell.js +97 -0
  76. package/dist/src/tools/shell.js.map +1 -0
  77. package/dist/src/tools/skill.d.ts +3 -0
  78. package/dist/src/tools/skill.js +130 -0
  79. package/dist/src/tools/skill.js.map +1 -0
  80. package/dist/src/tools/web.d.ts +3 -0
  81. package/dist/src/tools/web.js +144 -0
  82. package/dist/src/tools/web.js.map +1 -0
  83. package/dist/src/types.d.ts +236 -0
  84. package/dist/src/types.js +2 -0
  85. package/dist/src/types.js.map +1 -0
  86. package/dist/src/workspace-trust.d.ts +3 -0
  87. package/dist/src/workspace-trust.js +31 -0
  88. package/dist/src/workspace-trust.js.map +1 -0
  89. package/dist/src/xdg.d.ts +9 -0
  90. package/dist/src/xdg.js +77 -0
  91. package/dist/src/xdg.js.map +1 -0
  92. package/package.json +57 -0
  93. package/skill/agents-md-generator/SKILL.md +75 -0
  94. package/skill/agents-md-generator/references/agents_md_template.md +160 -0
  95. package/skill/agents-md-generator/references/loc_measurement.md +67 -0
  96. package/skill/agents-md-generator/references/monorepo_detection.md +78 -0
  97. package/skill/agents-md-generator/references/monorepo_strategy.md +60 -0
  98. package/skill/agents-md-generator/references/read_only_commands.md +151 -0
  99. package/skill/agents-md-generator/references/update_strategy.md +160 -0
  100. package/skill/agents-md-generator/references/working_agreements.md +53 -0
  101. package/skill/biz-opportunity-scout/SKILL.md +53 -0
  102. package/skill/biz-opportunity-scout/references/competitive_analysis.md +84 -0
  103. package/skill/biz-opportunity-scout/references/market_sizing.md +68 -0
  104. package/skill/biz-opportunity-scout/references/pmf_indicators.md +94 -0
  105. package/skill/biz-opportunity-scout/references/report_template.md +243 -0
  106. package/skill/biz-opportunity-scout/references/unit_economics.md +97 -0
  107. package/skill/code-review/SKILL.md +86 -0
  108. package/skill/code-review/references/change_analysis.md +116 -0
  109. package/skill/code-review/references/git_operations.md +115 -0
  110. package/skill/code-review/references/impact_detection.md +149 -0
  111. package/skill/code-review/references/output_format.md +137 -0
  112. package/skill/code-review/references/severity_criteria.md +100 -0
  113. package/skill/code-security-audit/SKILL.md +123 -0
  114. package/skill/code-security-audit/references/audit_process.md +277 -0
  115. package/skill/code-security-audit/references/remediation_patterns.md +599 -0
  116. package/skill/code-security-audit/references/report_format.md +391 -0
  117. package/skill/code-security-audit/references/security_domains.md +830 -0
  118. package/skill/code-security-audit/references/vulnerability_patterns.md +813 -0
  119. package/skill/composition-patterns/SKILL.md +83 -0
  120. package/skill/composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
  121. package/skill/composition-patterns/rules/architecture-compound-components.md +112 -0
  122. package/skill/composition-patterns/rules/patterns-children-over-render-props.md +87 -0
  123. package/skill/composition-patterns/rules/patterns-explicit-variants.md +100 -0
  124. package/skill/composition-patterns/rules/react19-no-forwardref.md +42 -0
  125. package/skill/composition-patterns/rules/state-context-interface.md +191 -0
  126. package/skill/composition-patterns/rules/state-decouple-implementation.md +113 -0
  127. package/skill/composition-patterns/rules/state-lift-state.md +125 -0
  128. package/skill/deploy-to-vercel/SKILL.md +293 -0
  129. package/skill/deploy-to-vercel/resources/deploy-sandbox.sh +301 -0
  130. package/skill/deploy-to-vercel/resources/deploy.sh +301 -0
  131. package/skill/doc/SKILL_GUIDELINES.md +138 -0
  132. package/skill/git-workflow/SKILL.md +94 -0
  133. package/skill/git-workflow/references/advanced-git.md +632 -0
  134. package/skill/git-workflow/references/branching-strategies.md +344 -0
  135. package/skill/git-workflow/references/ci-cd-integration.md +683 -0
  136. package/skill/git-workflow/references/code-quality-tools.md +351 -0
  137. package/skill/git-workflow/references/commit-conventions.md +439 -0
  138. package/skill/git-workflow/references/github-releases.md +288 -0
  139. package/skill/git-workflow/references/pull-request-workflow.md +773 -0
  140. package/skill/git-workflow/scripts/verify-git-workflow.sh +263 -0
  141. package/skill/jetbrains-vmoptions/SKILL.md +51 -0
  142. package/skill/jetbrains-vmoptions/references/common-options.md +357 -0
  143. package/skill/jetbrains-vmoptions/references/gc-options.md +350 -0
  144. package/skill/jetbrains-vmoptions/references/memory-options.md +339 -0
  145. package/skill/jetbrains-vmoptions/references/prerequisite-check.md +65 -0
  146. package/skill/kysely-converter/SKILL.md +62 -0
  147. package/skill/kysely-converter/references/delete.md +323 -0
  148. package/skill/kysely-converter/references/insert.md +386 -0
  149. package/skill/kysely-converter/references/operators.md +331 -0
  150. package/skill/kysely-converter/references/select.md +1000 -0
  151. package/skill/kysely-converter/references/update.md +349 -0
  152. package/skill/kysely-converter/references/window_function.md +537 -0
  153. package/skill/react-best-practices/SKILL.md +131 -0
  154. package/skill/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  155. package/skill/react-best-practices/rules/advanced-init-once.md +42 -0
  156. package/skill/react-best-practices/rules/advanced-use-latest.md +39 -0
  157. package/skill/react-best-practices/rules/async-api-routes.md +38 -0
  158. package/skill/react-best-practices/rules/async-defer-await.md +80 -0
  159. package/skill/react-best-practices/rules/async-dependencies.md +51 -0
  160. package/skill/react-best-practices/rules/async-parallel.md +28 -0
  161. package/skill/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  162. package/skill/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  163. package/skill/react-best-practices/rules/bundle-conditional.md +31 -0
  164. package/skill/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  165. package/skill/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  166. package/skill/react-best-practices/rules/bundle-preload.md +50 -0
  167. package/skill/react-best-practices/rules/client-event-listeners.md +74 -0
  168. package/skill/react-best-practices/rules/client-localstorage-schema.md +71 -0
  169. package/skill/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  170. package/skill/react-best-practices/rules/client-swr-dedup.md +56 -0
  171. package/skill/react-best-practices/rules/js-batch-dom-css.md +107 -0
  172. package/skill/react-best-practices/rules/js-cache-function-results.md +80 -0
  173. package/skill/react-best-practices/rules/js-cache-property-access.md +28 -0
  174. package/skill/react-best-practices/rules/js-cache-storage.md +70 -0
  175. package/skill/react-best-practices/rules/js-combine-iterations.md +32 -0
  176. package/skill/react-best-practices/rules/js-early-exit.md +50 -0
  177. package/skill/react-best-practices/rules/js-hoist-regexp.md +45 -0
  178. package/skill/react-best-practices/rules/js-index-maps.md +37 -0
  179. package/skill/react-best-practices/rules/js-length-check-first.md +49 -0
  180. package/skill/react-best-practices/rules/js-min-max-loop.md +82 -0
  181. package/skill/react-best-practices/rules/js-set-map-lookups.md +24 -0
  182. package/skill/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  183. package/skill/react-best-practices/rules/rendering-activity.md +26 -0
  184. package/skill/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  185. package/skill/react-best-practices/rules/rendering-conditional-render.md +40 -0
  186. package/skill/react-best-practices/rules/rendering-content-visibility.md +38 -0
  187. package/skill/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  188. package/skill/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  189. package/skill/react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
  190. package/skill/react-best-practices/rules/rendering-svg-precision.md +28 -0
  191. package/skill/react-best-practices/rules/rendering-usetransition-loading.md +75 -0
  192. package/skill/react-best-practices/rules/rerender-defer-reads.md +39 -0
  193. package/skill/react-best-practices/rules/rerender-dependencies.md +45 -0
  194. package/skill/react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
  195. package/skill/react-best-practices/rules/rerender-derived-state.md +29 -0
  196. package/skill/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  197. package/skill/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  198. package/skill/react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
  199. package/skill/react-best-practices/rules/rerender-memo.md +44 -0
  200. package/skill/react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
  201. package/skill/react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
  202. package/skill/react-best-practices/rules/rerender-transitions.md +40 -0
  203. package/skill/react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
  204. package/skill/react-best-practices/rules/server-after-nonblocking.md +73 -0
  205. package/skill/react-best-practices/rules/server-auth-actions.md +96 -0
  206. package/skill/react-best-practices/rules/server-cache-lru.md +41 -0
  207. package/skill/react-best-practices/rules/server-cache-react.md +76 -0
  208. package/skill/react-best-practices/rules/server-dedup-props.md +65 -0
  209. package/skill/react-best-practices/rules/server-hoist-static-io.md +142 -0
  210. package/skill/react-best-practices/rules/server-parallel-fetching.md +83 -0
  211. package/skill/react-best-practices/rules/server-serialization.md +38 -0
  212. package/skill/react-native-skills/SKILL.md +115 -0
  213. package/skill/react-native-skills/rules/animation-derived-value.md +53 -0
  214. package/skill/react-native-skills/rules/animation-gesture-detector-press.md +95 -0
  215. package/skill/react-native-skills/rules/animation-gpu-properties.md +65 -0
  216. package/skill/react-native-skills/rules/design-system-compound-components.md +66 -0
  217. package/skill/react-native-skills/rules/fonts-config-plugin.md +71 -0
  218. package/skill/react-native-skills/rules/imports-design-system-folder.md +68 -0
  219. package/skill/react-native-skills/rules/js-hoist-intl.md +61 -0
  220. package/skill/react-native-skills/rules/list-performance-callbacks.md +44 -0
  221. package/skill/react-native-skills/rules/list-performance-function-references.md +132 -0
  222. package/skill/react-native-skills/rules/list-performance-images.md +53 -0
  223. package/skill/react-native-skills/rules/list-performance-inline-objects.md +97 -0
  224. package/skill/react-native-skills/rules/list-performance-item-expensive.md +94 -0
  225. package/skill/react-native-skills/rules/list-performance-item-memo.md +82 -0
  226. package/skill/react-native-skills/rules/list-performance-item-types.md +104 -0
  227. package/skill/react-native-skills/rules/list-performance-virtualize.md +67 -0
  228. package/skill/react-native-skills/rules/monorepo-native-deps-in-app.md +46 -0
  229. package/skill/react-native-skills/rules/monorepo-single-dependency-versions.md +63 -0
  230. package/skill/react-native-skills/rules/navigation-native-navigators.md +188 -0
  231. package/skill/react-native-skills/rules/react-compiler-destructure-functions.md +50 -0
  232. package/skill/react-native-skills/rules/react-compiler-reanimated-shared-values.md +48 -0
  233. package/skill/react-native-skills/rules/react-state-dispatcher.md +91 -0
  234. package/skill/react-native-skills/rules/react-state-fallback.md +56 -0
  235. package/skill/react-native-skills/rules/react-state-minimize.md +65 -0
  236. package/skill/react-native-skills/rules/rendering-no-falsy-and.md +74 -0
  237. package/skill/react-native-skills/rules/rendering-text-in-text-component.md +36 -0
  238. package/skill/react-native-skills/rules/scroll-position-no-state.md +82 -0
  239. package/skill/react-native-skills/rules/state-ground-truth.md +80 -0
  240. package/skill/react-native-skills/rules/ui-expo-image.md +66 -0
  241. package/skill/react-native-skills/rules/ui-image-gallery.md +104 -0
  242. package/skill/react-native-skills/rules/ui-measure-views.md +78 -0
  243. package/skill/react-native-skills/rules/ui-menus.md +174 -0
  244. package/skill/react-native-skills/rules/ui-native-modals.md +77 -0
  245. package/skill/react-native-skills/rules/ui-pressable.md +61 -0
  246. package/skill/react-native-skills/rules/ui-safe-area-scroll.md +65 -0
  247. package/skill/react-native-skills/rules/ui-scrollview-content-inset.md +45 -0
  248. package/skill/react-native-skills/rules/ui-styling.md +87 -0
  249. package/skill/react-vite-guide/SKILL.md +101 -0
  250. package/skill/react-vite-guide/references/composition-patterns.md +709 -0
  251. package/skill/react-vite-guide/references/performance-optimization.md +1222 -0
  252. package/skill/react-vite-guide/references/vite-specific.md +385 -0
  253. package/skill/react-vite-guide/references/web-interface.md +146 -0
  254. package/skill/skill-maker/SKILL.md +52 -0
  255. package/skill/skill-maker/references/content_spec.md +67 -0
  256. package/skill/skill-maker/references/frontmatter_spec.md +96 -0
  257. package/skill/skill-maker/references/input_validation.md +90 -0
  258. package/skill/skill-maker/references/skill_structure.md +74 -0
  259. package/skill/system-prompt-creator/SKILL.md +50 -0
  260. package/skill/system-prompt-creator/references/data_format_selection.md +135 -0
  261. package/skill/system-prompt-creator/references/multi_prompt_architecture.md +386 -0
  262. package/skill/system-prompt-creator/references/prompt_structure.md +140 -0
  263. package/skill/system-prompt-creator/references/quality_criteria.md +83 -0
  264. package/skill/typst-creator/SKILL.md +51 -0
  265. package/skill/typst-creator/references/layout.md +401 -0
  266. package/skill/typst-creator/references/math.md +297 -0
  267. package/skill/typst-creator/references/scripting.md +237 -0
  268. package/skill/typst-creator/references/styling.md +217 -0
  269. package/skill/typst-creator/references/syntax.md +234 -0
  270. package/skill/web-design-guidelines/SKILL.md +35 -0
  271. package/terminal.png +0 -0
@@ -0,0 +1,1000 @@
1
+ # Kysely SELECT Reference
2
+
3
+ ## Basic SELECT
4
+ ```sql
5
+ SELECT id, name FROM person
6
+ ```
7
+ ```ts
8
+ db.selectFrom('person')
9
+ .select(['id', 'name'])
10
+ .execute()
11
+ ```
12
+
13
+ ## Select Single Column
14
+ ```sql
15
+ SELECT id FROM person WHERE first_name = 'Arnold'
16
+ ```
17
+ ```ts
18
+ db.selectFrom('person')
19
+ .select('id')
20
+ .where('first_name', '=', 'Arnold')
21
+ .execute()
22
+ ```
23
+
24
+ ## Select with Table Prefix
25
+ ```sql
26
+ SELECT person.id FROM person, pet
27
+ ```
28
+ ```ts
29
+ db.selectFrom(['person', 'pet'])
30
+ .select('person.id')
31
+ .execute()
32
+ ```
33
+
34
+ ## Select All Columns
35
+ ```sql
36
+ SELECT * FROM person
37
+ ```
38
+ ```ts
39
+ db.selectFrom('person')
40
+ .selectAll()
41
+ .execute()
42
+ ```
43
+
44
+ ## Select All from Specific Table
45
+ ```sql
46
+ SELECT person.* FROM person
47
+ ```
48
+ ```ts
49
+ db.selectFrom('person')
50
+ .selectAll('person')
51
+ .execute()
52
+ ```
53
+
54
+ ## Aliases
55
+ ```sql
56
+ SELECT first_name AS fn, p.last_name AS ln FROM person AS p
57
+ ```
58
+ ```ts
59
+ db.selectFrom('person as p')
60
+ .select(['first_name as fn', 'p.last_name as ln'])
61
+ .execute()
62
+ ```
63
+
64
+ ## DISTINCT
65
+ ```sql
66
+ SELECT DISTINCT first_name FROM person
67
+ ```
68
+ ```ts
69
+ db.selectFrom('person')
70
+ .select('first_name')
71
+ .distinct()
72
+ .execute()
73
+ ```
74
+
75
+ ## DISTINCT ON (PostgreSQL only)
76
+ ```sql
77
+ SELECT DISTINCT ON (person.id) person.* FROM person
78
+ INNER JOIN pet ON pet.owner_id = person.id
79
+ WHERE pet.name = 'Doggo'
80
+ ```
81
+ ```ts
82
+ db.selectFrom('person')
83
+ .innerJoin('pet', 'pet.owner_id', 'person.id')
84
+ .where('pet.name', '=', 'Doggo')
85
+ .distinctOn('person.id')
86
+ .selectAll('person')
87
+ .execute()
88
+ ```
89
+
90
+ ## WHERE Conditions
91
+
92
+ ### Simple Comparison
93
+ ```sql
94
+ WHERE status = 'active'
95
+ ```
96
+ ```ts
97
+ .where('status', '=', 'active')
98
+ ```
99
+
100
+ ### Multiple AND Conditions
101
+ ```sql
102
+ WHERE status = 'active' AND type = 'user'
103
+ ```
104
+ ```ts
105
+ .where('status', '=', 'active')
106
+ .where('type', '=', 'user')
107
+ ```
108
+
109
+ ### IN Operator
110
+ ```sql
111
+ WHERE id IN (1, 2, 3)
112
+ ```
113
+ ```ts
114
+ .where('id', 'in', [1, 2, 3])
115
+ ```
116
+
117
+ ### NOT IN Operator
118
+ ```sql
119
+ WHERE id NOT IN (1, 2, 3)
120
+ ```
121
+ ```ts
122
+ .where('id', 'not in', [1, 2, 3])
123
+ ```
124
+
125
+ ### IS NULL / IS NOT NULL
126
+ ```sql
127
+ WHERE deleted_at IS NULL AND name IS NOT NULL
128
+ ```
129
+ ```ts
130
+ .where('deleted_at', 'is', null)
131
+ .where('name', 'is not', null)
132
+ ```
133
+
134
+ ### LIKE / NOT LIKE
135
+ ```sql
136
+ WHERE name LIKE '%john%'
137
+ ```
138
+ ```ts
139
+ .where('name', 'like', '%john%')
140
+ ```
141
+
142
+ ### ILIKE (PostgreSQL only)
143
+ ```sql
144
+ WHERE name ILIKE '%john%'
145
+ ```
146
+ ```ts
147
+ .where('name', 'ilike', '%john%')
148
+ ```
149
+
150
+ ### BETWEEN
151
+ ```sql
152
+ WHERE age BETWEEN 18 AND 65
153
+ ```
154
+ ```ts
155
+ .where('age', 'between', [18, 65])
156
+ ```
157
+
158
+ ### Column to Column Comparison (whereRef)
159
+ ```sql
160
+ WHERE log.created_at >= enrollment.start_dt
161
+ ```
162
+ ```ts
163
+ .whereRef('log.created_at', '>=', 'enrollment.start_dt')
164
+ ```
165
+
166
+ ### Complex WHERE (OR/AND)
167
+ ```sql
168
+ WHERE (status = 'active' AND type = 'a') OR (status = 'pending' AND type = 'b')
169
+ ```
170
+ ```ts
171
+ .where((eb) =>
172
+ eb.or([
173
+ eb.and([
174
+ eb('status', '=', 'active'),
175
+ eb('type', '=', 'a'),
176
+ ]),
177
+ eb.and([
178
+ eb('status', '=', 'pending'),
179
+ eb('type', '=', 'b'),
180
+ ]),
181
+ ])
182
+ )
183
+ ```
184
+
185
+ ### EXISTS Subquery
186
+ ```sql
187
+ WHERE EXISTS (SELECT 1 FROM pet WHERE pet.owner_id = person.id)
188
+ ```
189
+ ```ts
190
+ .where((eb) =>
191
+ eb.exists(
192
+ eb.selectFrom('pet')
193
+ .whereRef('pet.owner_id', '=', 'person.id')
194
+ .select(sql.lit(1))
195
+ )
196
+ )
197
+ ```
198
+
199
+
200
+ ## JOIN
201
+
202
+ ### INNER JOIN
203
+ ```sql
204
+ SELECT * FROM person INNER JOIN pet ON pet.owner_id = person.id
205
+ ```
206
+ ```ts
207
+ db.selectFrom('person')
208
+ .innerJoin('pet', 'pet.owner_id', 'person.id')
209
+ .selectAll()
210
+ .execute()
211
+ ```
212
+
213
+ ### LEFT JOIN
214
+ ```sql
215
+ SELECT * FROM person LEFT JOIN pet ON pet.owner_id = person.id
216
+ ```
217
+ ```ts
218
+ db.selectFrom('person')
219
+ .leftJoin('pet', 'pet.owner_id', 'person.id')
220
+ .selectAll()
221
+ .execute()
222
+ ```
223
+
224
+ ### RIGHT JOIN
225
+ ```sql
226
+ SELECT * FROM person RIGHT JOIN pet ON pet.owner_id = person.id
227
+ ```
228
+ ```ts
229
+ db.selectFrom('person')
230
+ .rightJoin('pet', 'pet.owner_id', 'person.id')
231
+ .selectAll()
232
+ .execute()
233
+ ```
234
+
235
+ ### FULL JOIN
236
+ ```sql
237
+ SELECT * FROM person FULL JOIN pet ON pet.owner_id = person.id
238
+ ```
239
+ ```ts
240
+ db.selectFrom('person')
241
+ .fullJoin('pet', 'pet.owner_id', 'person.id')
242
+ .selectAll()
243
+ .execute()
244
+ ```
245
+
246
+ ### CROSS JOIN
247
+ ```sql
248
+ SELECT * FROM person CROSS JOIN pet
249
+ ```
250
+ ```ts
251
+ db.selectFrom('person')
252
+ .crossJoin('pet')
253
+ .selectAll()
254
+ .execute()
255
+ ```
256
+
257
+ ### Complex JOIN Conditions
258
+ ```sql
259
+ SELECT * FROM person
260
+ INNER JOIN pet ON pet.owner_id = person.id AND pet.name = 'Doggo'
261
+ ```
262
+ ```ts
263
+ db.selectFrom('person')
264
+ .innerJoin('pet', (join) => join
265
+ .onRef('pet.owner_id', '=', 'person.id')
266
+ .on('pet.name', '=', 'Doggo')
267
+ )
268
+ .selectAll()
269
+ .execute()
270
+ ```
271
+
272
+ ### JOIN with Subquery
273
+ ```sql
274
+ SELECT * FROM person
275
+ INNER JOIN (SELECT owner_id, name FROM pet WHERE name = 'Doggo') AS doggos
276
+ ON doggos.owner_id = person.id
277
+ ```
278
+ ```ts
279
+ db.selectFrom('person')
280
+ .innerJoin(
281
+ (eb) => eb
282
+ .selectFrom('pet')
283
+ .select(['owner_id', 'name'])
284
+ .where('name', '=', 'Doggo')
285
+ .as('doggos'),
286
+ (join) => join.onRef('doggos.owner_id', '=', 'person.id')
287
+ )
288
+ .selectAll()
289
+ .execute()
290
+ ```
291
+
292
+ ### LATERAL JOIN (PostgreSQL, MySQL)
293
+ ```sql
294
+ SELECT person.first_name, p.name FROM person
295
+ INNER JOIN LATERAL (SELECT name FROM pet WHERE pet.owner_id = person.id) AS p ON true
296
+ ```
297
+ ```ts
298
+ db.selectFrom('person')
299
+ .innerJoinLateral(
300
+ (eb) => eb
301
+ .selectFrom('pet')
302
+ .select('name')
303
+ .whereRef('pet.owner_id', '=', 'person.id')
304
+ .as('p'),
305
+ (join) => join.onTrue()
306
+ )
307
+ .select(['first_name', 'p.name'])
308
+ .execute()
309
+ ```
310
+
311
+ ## GROUP BY
312
+ ```sql
313
+ SELECT type, COUNT(*) AS cnt FROM items GROUP BY type
314
+ ```
315
+ ```ts
316
+ db.selectFrom('items')
317
+ .select(['type', (eb) => eb.fn.countAll().as('cnt')])
318
+ .groupBy('type')
319
+ .execute()
320
+ ```
321
+
322
+ ### Multiple GROUP BY
323
+ ```sql
324
+ SELECT first_name, last_name, COUNT(*) FROM person GROUP BY first_name, last_name
325
+ ```
326
+ ```ts
327
+ db.selectFrom('person')
328
+ .select(['first_name', 'last_name', (eb) => eb.fn.countAll().as('count')])
329
+ .groupBy(['first_name', 'last_name'])
330
+ .execute()
331
+ ```
332
+
333
+ ## HAVING
334
+ ```sql
335
+ SELECT type, COUNT(*) FROM items GROUP BY type HAVING COUNT(*) > 5
336
+ ```
337
+ ```ts
338
+ db.selectFrom('items')
339
+ .select(['type', (eb) => eb.fn.countAll().as('cnt')])
340
+ .groupBy('type')
341
+ .having((eb) => eb(eb.fn.countAll(), '>', 5))
342
+ .execute()
343
+ ```
344
+
345
+ ## ORDER BY
346
+ ```sql
347
+ ORDER BY created_at DESC, id ASC
348
+ ```
349
+ ```ts
350
+ .orderBy('created_at', 'desc')
351
+ .orderBy('id', 'asc')
352
+ ```
353
+
354
+ ### ORDER BY with NULLS
355
+ ```sql
356
+ ORDER BY created_at DESC NULLS LAST
357
+ ```
358
+ ```ts
359
+ .orderBy('created_at', (ob) => ob.desc().nullsLast())
360
+ ```
361
+
362
+ ## LIMIT / OFFSET
363
+ ```sql
364
+ SELECT * FROM person LIMIT 10 OFFSET 20
365
+ ```
366
+ ```ts
367
+ db.selectFrom('person')
368
+ .selectAll()
369
+ .limit(10)
370
+ .offset(20)
371
+ .execute()
372
+ ```
373
+
374
+ ## Aggregate Functions
375
+ ```sql
376
+ SELECT COUNT(*), SUM(amount), AVG(price), MIN(age), MAX(age) FROM orders
377
+ ```
378
+ ```ts
379
+ db.selectFrom('orders')
380
+ .select((eb) => [
381
+ eb.fn.countAll().as('count'),
382
+ eb.fn.sum('amount').as('total'),
383
+ eb.fn.avg('price').as('avg_price'),
384
+ eb.fn.min('age').as('min_age'),
385
+ eb.fn.max('age').as('max_age'),
386
+ ])
387
+ .execute()
388
+ ```
389
+
390
+ ### COUNT with Column
391
+ ```sql
392
+ SELECT COUNT(id) FROM person
393
+ ```
394
+ ```ts
395
+ db.selectFrom('person')
396
+ .select((eb) => eb.fn.count('id').as('count'))
397
+ .execute()
398
+ ```
399
+
400
+ ## Window Functions
401
+
402
+ ### ROW_NUMBER
403
+ ```sql
404
+ SELECT *, ROW_NUMBER() OVER (PARTITION BY type ORDER BY created_at DESC) AS rn FROM items
405
+ ```
406
+ ```ts
407
+ db.selectFrom('items')
408
+ .selectAll()
409
+ .select((eb) =>
410
+ eb.fn
411
+ .agg<number>('ROW_NUMBER')
412
+ .over((ob) => ob.partitionBy('type').orderBy('created_at', 'desc'))
413
+ .as('rn')
414
+ )
415
+ .execute()
416
+ ```
417
+
418
+ ### COUNT/SUM/AVG OVER
419
+ ```sql
420
+ SELECT *, COUNT(1) OVER (PARTITION BY type) AS cnt FROM items
421
+ ```
422
+ ```ts
423
+ db.selectFrom('items')
424
+ .selectAll()
425
+ .select((eb) =>
426
+ eb.fn.count(sql.lit(1))
427
+ .over((ob) => ob.partitionBy('type'))
428
+ .as('cnt')
429
+ )
430
+ .execute()
431
+ ```
432
+
433
+ ### Multiple PARTITION BY
434
+ ```sql
435
+ PARTITION BY enrollment_id, monitoring_type
436
+ ```
437
+ ```ts
438
+ .over((ob) => ob.partitionBy(['enrollment_id', 'monitoring_type']))
439
+ ```
440
+
441
+ ## CASE WHEN
442
+ ```sql
443
+ CASE
444
+ WHEN type = 'a' THEN col1
445
+ WHEN type = 'b' THEN col2
446
+ ELSE col3
447
+ END AS result
448
+ ```
449
+ ```ts
450
+ eb.case()
451
+ .when('type', '=', 'a')
452
+ .then(eb.ref('col1'))
453
+ .when('type', '=', 'b')
454
+ .then(eb.ref('col2'))
455
+ .else(eb.ref('col3'))
456
+ .end()
457
+ .as('result')
458
+ ```
459
+
460
+ ### Simple CASE
461
+ ```sql
462
+ CASE status WHEN 'active' THEN 1 WHEN 'inactive' THEN 0 ELSE -1 END
463
+ ```
464
+ ```ts
465
+ eb.case('status')
466
+ .when('active')
467
+ .then(1)
468
+ .when('inactive')
469
+ .then(0)
470
+ .else(-1)
471
+ .end()
472
+ ```
473
+
474
+ ## WITH (CTE)
475
+ ```sql
476
+ WITH filtered AS (SELECT id FROM person WHERE age > 18)
477
+ SELECT * FROM filtered
478
+ ```
479
+ ```ts
480
+ db.with('filtered', (db) =>
481
+ db.selectFrom('person')
482
+ .select('id')
483
+ .where('age', '>', 18)
484
+ )
485
+ .selectFrom('filtered')
486
+ .selectAll()
487
+ .execute()
488
+ ```
489
+
490
+ ### Multiple CTEs
491
+ ```sql
492
+ WITH cte1 AS (SELECT id FROM t1),
493
+ cte2 AS (SELECT id FROM cte1)
494
+ SELECT * FROM cte2
495
+ ```
496
+ ```ts
497
+ db.with('cte1', (db) => db.selectFrom('t1').select('id'))
498
+ .with('cte2', (db) => db.selectFrom('cte1').select('id'))
499
+ .selectFrom('cte2')
500
+ .selectAll()
501
+ .execute()
502
+ ```
503
+
504
+ ## UNION / INTERSECT / EXCEPT
505
+ ```sql
506
+ SELECT id, first_name AS name FROM person
507
+ UNION
508
+ SELECT id, name FROM pet
509
+ ```
510
+ ```ts
511
+ db.selectFrom('person')
512
+ .select(['id', 'first_name as name'])
513
+ .union(db.selectFrom('pet').select(['id', 'name']))
514
+ .execute()
515
+ ```
516
+
517
+ ### UNION ALL
518
+ ```sql
519
+ SELECT id FROM person UNION ALL SELECT id FROM pet
520
+ ```
521
+ ```ts
522
+ db.selectFrom('person')
523
+ .select('id')
524
+ .unionAll(db.selectFrom('pet').select('id'))
525
+ .execute()
526
+ ```
527
+
528
+ ### INTERSECT
529
+ ```ts
530
+ db.selectFrom('person')
531
+ .select('id')
532
+ .intersect(db.selectFrom('pet').select('id'))
533
+ .execute()
534
+ ```
535
+
536
+ ### EXCEPT
537
+ ```ts
538
+ db.selectFrom('person')
539
+ .select('id')
540
+ .except(db.selectFrom('pet').select('id'))
541
+ .execute()
542
+ ```
543
+
544
+ ## Subquery in SELECT
545
+ ```sql
546
+ SELECT name, (SELECT COUNT(*) FROM pet WHERE pet.owner_id = person.id) AS pet_count
547
+ FROM person
548
+ ```
549
+ ```ts
550
+ db.selectFrom('person')
551
+ .select((eb) => [
552
+ 'name',
553
+ eb.selectFrom('pet')
554
+ .whereRef('pet.owner_id', '=', 'person.id')
555
+ .select((eb2) => eb2.fn.countAll().as('count'))
556
+ .as('pet_count')
557
+ ])
558
+ .execute()
559
+ ```
560
+
561
+ ## FOR UPDATE / FOR SHARE (Locking)
562
+ ```sql
563
+ SELECT * FROM person WHERE id = 1 FOR UPDATE
564
+ ```
565
+ ```ts
566
+ db.selectFrom('person')
567
+ .selectAll()
568
+ .where('id', '=', 1)
569
+ .forUpdate()
570
+ .execute()
571
+ ```
572
+
573
+ ### FOR SHARE
574
+ ```ts
575
+ db.selectFrom('person')
576
+ .selectAll()
577
+ .forShare()
578
+ .execute()
579
+ ```
580
+
581
+ ### SKIP LOCKED
582
+ ```ts
583
+ db.selectFrom('person')
584
+ .selectAll()
585
+ .forUpdate()
586
+ .skipLocked()
587
+ .execute()
588
+ ```
589
+
590
+ ### NOWAIT
591
+ ```ts
592
+ db.selectFrom('person')
593
+ .selectAll()
594
+ .forUpdate()
595
+ .noWait()
596
+ .execute()
597
+ ```
598
+
599
+ ## Raw SQL
600
+ ```ts
601
+ import { sql } from 'kysely'
602
+
603
+ // Raw expression in select
604
+ db.selectFrom('person')
605
+ .select([
606
+ 'id',
607
+ sql<string>`CONCAT(first_name, ' ', last_name)`.as('full_name')
608
+ ])
609
+ .execute()
610
+ ```
611
+
612
+ ### Literal Value
613
+ ```ts
614
+ sql.lit(1)
615
+ sql.lit('active')
616
+ ```
617
+
618
+ ## Dynamic Column Reference
619
+ ```ts
620
+ const { ref } = db.dynamic
621
+ const columnName = 'first_name'
622
+
623
+ db.selectFrom('person')
624
+ .select(ref(columnName))
625
+ .execute()
626
+ ```
627
+
628
+ ## Conditional Query Building ($if)
629
+ ```ts
630
+ async function getPeople(includeAge: boolean) {
631
+ return await db
632
+ .selectFrom('person')
633
+ .select(['id', 'first_name'])
634
+ .$if(includeAge, (qb) => qb.select('age'))
635
+ .execute()
636
+ }
637
+ ```
638
+
639
+ ## WITH RECURSIVE (Recursive CTE)
640
+ ```sql
641
+ WITH RECURSIVE subordinates AS (
642
+ SELECT id, name, manager_id FROM employees WHERE id = 1
643
+ UNION ALL
644
+ SELECT e.id, e.name, e.manager_id
645
+ FROM employees e
646
+ INNER JOIN subordinates s ON s.id = e.manager_id
647
+ )
648
+ SELECT * FROM subordinates
649
+ ```
650
+ ```ts
651
+ db.withRecursive('subordinates', (db) =>
652
+ db.selectFrom('employees')
653
+ .select(['id', 'name', 'manager_id'])
654
+ .where('id', '=', 1)
655
+ .unionAll(
656
+ db.selectFrom('employees as e')
657
+ .innerJoin('subordinates as s', 's.id', 'e.manager_id')
658
+ .select(['e.id', 'e.name', 'e.manager_id'])
659
+ )
660
+ )
661
+ .selectFrom('subordinates')
662
+ .selectAll()
663
+ .execute()
664
+ ```
665
+
666
+ ## CTE Materialization (PostgreSQL)
667
+ ```sql
668
+ WITH filtered AS MATERIALIZED (SELECT id FROM person WHERE age > 18)
669
+ SELECT * FROM filtered
670
+ ```
671
+ ```ts
672
+ db.with(
673
+ (cte) => cte('filtered').materialized(),
674
+ (db) => db.selectFrom('person')
675
+ .select('id')
676
+ .where('age', '>', 18)
677
+ )
678
+ .selectFrom('filtered')
679
+ .selectAll()
680
+ .execute()
681
+ ```
682
+
683
+ ### NOT MATERIALIZED
684
+ ```ts
685
+ db.with(
686
+ (cte) => cte('filtered').notMaterialized(),
687
+ (db) => db.selectFrom('person')
688
+ .select('id')
689
+ .where('age', '>', 18)
690
+ )
691
+ .selectFrom('filtered')
692
+ .selectAll()
693
+ .execute()
694
+ ```
695
+
696
+ ## INTERSECT ALL / EXCEPT ALL
697
+ ### INTERSECT ALL
698
+ ```sql
699
+ SELECT id FROM person INTERSECT ALL SELECT id FROM pet
700
+ ```
701
+ ```ts
702
+ db.selectFrom('person')
703
+ .select('id')
704
+ .intersectAll(db.selectFrom('pet').select('id'))
705
+ .execute()
706
+ ```
707
+
708
+ ### EXCEPT ALL
709
+ ```sql
710
+ SELECT id FROM person EXCEPT ALL SELECT id FROM pet
711
+ ```
712
+ ```ts
713
+ db.selectFrom('person')
714
+ .select('id')
715
+ .exceptAll(db.selectFrom('pet').select('id'))
716
+ .execute()
717
+ ```
718
+
719
+ ## Data Type Casting (CAST)
720
+ ```sql
721
+ SELECT CAST(age AS integer) AS age FROM person
722
+ ```
723
+ ```ts
724
+ db.selectFrom('person')
725
+ .select((eb) => [
726
+ eb.cast<number>('age', 'integer').as('age')
727
+ ])
728
+ .execute()
729
+ ```
730
+
731
+ ### PostgreSQL Shorthand (::) - Raw SQL
732
+ ```sql
733
+ SELECT age::integer FROM person
734
+ ```
735
+ ```ts
736
+ import { sql } from 'kysely'
737
+
738
+ db.selectFrom('person')
739
+ .select(sql<number>`age::integer`.as('age'))
740
+ .execute()
741
+ ```
742
+
743
+ ## JSON Data Processing
744
+
745
+ ### JSON Extraction (->)
746
+ ```sql
747
+ -- PostgreSQL: address->'city'
748
+ -- MySQL: JSON_EXTRACT(address, '$.city')
749
+ SELECT address->'city' AS city FROM person
750
+ ```
751
+ ```ts
752
+ db.selectFrom('person')
753
+ .select((eb) =>
754
+ eb.ref('address', '->').key('city').as('city')
755
+ )
756
+ .execute()
757
+ ```
758
+
759
+ ### JSON Text Extraction (->>)
760
+ ```sql
761
+ -- PostgreSQL: address->>'city'
762
+ -- MySQL: JSON_UNQUOTE(JSON_EXTRACT(address, '$.city'))
763
+ SELECT address->>'city' AS city FROM person
764
+ ```
765
+ ```ts
766
+ db.selectFrom('person')
767
+ .select((eb) =>
768
+ eb.ref('address', '->>').key('city').as('city')
769
+ )
770
+ .execute()
771
+ ```
772
+
773
+ ### Nested JSON Access
774
+ ```sql
775
+ SELECT profile->'address'->'city' AS city FROM person
776
+ ```
777
+ ```ts
778
+ db.selectFrom('person')
779
+ .select((eb) =>
780
+ eb.ref('profile', '->').key('address').key('city').as('city')
781
+ )
782
+ .execute()
783
+ ```
784
+
785
+ ### JSON Array Access
786
+ ```sql
787
+ SELECT nicknames->0 AS first_nickname FROM person
788
+ ```
789
+ ```ts
790
+ db.selectFrom('person')
791
+ .select((eb) =>
792
+ eb.ref('nicknames', '->').at(0).as('first_nickname')
793
+ )
794
+ .execute()
795
+ ```
796
+
797
+ ### JSON Aggregation - Raw SQL
798
+ ```sql
799
+ -- PostgreSQL: json_agg(pet)
800
+ -- MySQL: JSON_ARRAYAGG(pet.name)
801
+ ```
802
+ ```ts
803
+ // PostgreSQL
804
+ db.selectFrom('person')
805
+ .innerJoin('pet', 'pet.owner_id', 'person.id')
806
+ .select((eb) => [
807
+ 'person.id',
808
+ eb.fn.agg<string>('json_agg', ['pet']).as('pets')
809
+ ])
810
+ .groupBy('person.id')
811
+ .execute()
812
+
813
+ // MySQL
814
+ db.selectFrom('person')
815
+ .innerJoin('pet', 'pet.owner_id', 'person.id')
816
+ .select((eb) => [
817
+ 'person.id',
818
+ eb.fn.agg<string>('JSON_ARRAYAGG', ['pet.name']).as('pet_names')
819
+ ])
820
+ .groupBy('person.id')
821
+ .execute()
822
+ ```
823
+
824
+ ## Full Text Search
825
+
826
+ ### PostgreSQL (@@)
827
+ ```sql
828
+ SELECT * FROM documents WHERE to_tsvector('english', content) @@ to_tsquery('search')
829
+ ```
830
+ ```ts
831
+ import { sql } from 'kysely'
832
+
833
+ db.selectFrom('documents')
834
+ .selectAll()
835
+ .where(
836
+ sql`to_tsvector('english', ${sql.ref('content')})`,
837
+ '@@',
838
+ sql`to_tsquery(${sql.lit('search')})`
839
+ )
840
+ .execute()
841
+ ```
842
+
843
+ ### MySQL (MATCH AGAINST)
844
+ ```sql
845
+ SELECT * FROM articles WHERE MATCH(title, body) AGAINST('search terms')
846
+ ```
847
+ ```ts
848
+ import { sql } from 'kysely'
849
+
850
+ db.selectFrom('articles')
851
+ .selectAll()
852
+ .where(
853
+ sql`MATCH(title, body) AGAINST(${sql.lit('search terms')})`,
854
+ '>',
855
+ 0
856
+ )
857
+ .execute()
858
+ ```
859
+
860
+ ## BETWEEN SYMMETRIC (PostgreSQL)
861
+ ```sql
862
+ SELECT * FROM person WHERE age BETWEEN SYMMETRIC 60 AND 18
863
+ ```
864
+ ```ts
865
+ db.selectFrom('person')
866
+ .selectAll()
867
+ .where((eb) => eb.betweenSymmetric('age', 60, 18))
868
+ .execute()
869
+ ```
870
+
871
+ ## Advanced Grouping (Raw SQL Required)
872
+
873
+ ### ROLLUP
874
+ > **Note**: Kysely에서 직접 지원하지 않음 - Raw SQL 사용
875
+ ```sql
876
+ SELECT type, region, SUM(amount) FROM sales GROUP BY ROLLUP(type, region)
877
+ ```
878
+ ```ts
879
+ import { sql } from 'kysely'
880
+
881
+ db.selectFrom('sales')
882
+ .select(['type', 'region', (eb) => eb.fn.sum('amount').as('total')])
883
+ .groupBy(sql`ROLLUP(type, region)`)
884
+ .execute()
885
+ ```
886
+
887
+ ### CUBE
888
+ > **Note**: Kysely에서 직접 지원하지 않음 - Raw SQL 사용
889
+ ```sql
890
+ SELECT type, region, SUM(amount) FROM sales GROUP BY CUBE(type, region)
891
+ ```
892
+ ```ts
893
+ import { sql } from 'kysely'
894
+
895
+ db.selectFrom('sales')
896
+ .select(['type', 'region', (eb) => eb.fn.sum('amount').as('total')])
897
+ .groupBy(sql`CUBE(type, region)`)
898
+ .execute()
899
+ ```
900
+
901
+ ### GROUPING SETS
902
+ > **Note**: Kysely에서 직접 지원하지 않음 - Raw SQL 사용
903
+ ```sql
904
+ SELECT type, region, SUM(amount) FROM sales
905
+ GROUP BY GROUPING SETS ((type), (region), ())
906
+ ```
907
+ ```ts
908
+ import { sql } from 'kysely'
909
+
910
+ db.selectFrom('sales')
911
+ .select(['type', 'region', (eb) => eb.fn.sum('amount').as('total')])
912
+ .groupBy(sql`GROUPING SETS ((type), (region), ())`)
913
+ .execute()
914
+ ```
915
+
916
+ ## Window Frame Clause (Raw SQL Required)
917
+
918
+ ### ROWS BETWEEN
919
+ > **Note**: Kysely에서 프레임 절 직접 지원하지 않음 - Raw SQL 사용
920
+ ```sql
921
+ SELECT id, amount,
922
+ SUM(amount) OVER (ORDER BY id ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS running_sum
923
+ FROM transactions
924
+ ```
925
+ ```ts
926
+ import { sql } from 'kysely'
927
+
928
+ db.selectFrom('transactions')
929
+ .select([
930
+ 'id',
931
+ 'amount',
932
+ sql<number>`SUM(amount) OVER (ORDER BY id ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)`.as('running_sum')
933
+ ])
934
+ .execute()
935
+ ```
936
+
937
+ ### RANGE BETWEEN
938
+ ```sql
939
+ SELECT id, amount,
940
+ AVG(amount) OVER (ORDER BY created_at RANGE BETWEEN INTERVAL '1 day' PRECEDING AND CURRENT ROW)
941
+ FROM transactions
942
+ ```
943
+ ```ts
944
+ import { sql } from 'kysely'
945
+
946
+ db.selectFrom('transactions')
947
+ .select([
948
+ 'id',
949
+ 'amount',
950
+ sql<number>`AVG(amount) OVER (ORDER BY created_at RANGE BETWEEN INTERVAL '1 day' PRECEDING AND CURRENT ROW)`.as('avg_amount')
951
+ ])
952
+ .execute()
953
+ ```
954
+
955
+ ## DBMS-Specific Features (Raw SQL Required)
956
+
957
+ ### MySQL Index Hints
958
+ > **Note**: Kysely에서 직접 지원하지 않음 - Raw SQL 사용
959
+ ```sql
960
+ SELECT * FROM person USE INDEX (idx_name) WHERE name = 'John'
961
+ ```
962
+ ```ts
963
+ import { sql } from 'kysely'
964
+
965
+ sql`SELECT * FROM person USE INDEX (idx_name) WHERE name = ${sql.lit('John')}`
966
+ .execute(db)
967
+ ```
968
+
969
+ ### PostgreSQL TABLESAMPLE
970
+ > **Note**: Kysely에서 직접 지원하지 않음 - Raw SQL 사용
971
+ ```sql
972
+ SELECT * FROM large_table TABLESAMPLE BERNOULLI(10)
973
+ ```
974
+ ```ts
975
+ import { sql } from 'kysely'
976
+
977
+ sql`SELECT * FROM large_table TABLESAMPLE BERNOULLI(10)`
978
+ .execute(db)
979
+ ```
980
+
981
+ ## Dialect Differences
982
+
983
+ ### MySQL
984
+ - Uses backticks for identifiers: \`table\`.\`column\`
985
+ - `LIMIT offset, count` syntax supported
986
+ - Supports `REGEXP` operator
987
+ - JSON: `->`, `->>` maps to `JSON_EXTRACT`, `JSON_UNQUOTE`
988
+ - Full-Text: `MATCH (...) AGAINST (...)`
989
+
990
+ ### PostgreSQL
991
+ - Uses double quotes for identifiers: "table"."column"
992
+ - `DISTINCT ON` supported
993
+ - `ILIKE` for case-insensitive LIKE
994
+ - `~`, `~*`, `!~`, `!~*` regex operators
995
+ - `NULLS FIRST` / `NULLS LAST` in ORDER BY
996
+ - JSON: Native `->`, `->>`, `#>`, `#>>` operators
997
+ - Full-Text: `to_tsvector`, `to_tsquery`, `@@` operator
998
+ - Type casting: `::type` shorthand (use raw SQL)
999
+ - CTE: `MATERIALIZED` / `NOT MATERIALIZED` hints supported
1000
+ - `BETWEEN SYMMETRIC` supported