textbringer-tree-sitter 1.2.0 → 1.2.2

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.
@@ -0,0 +1,352 @@
1
+ -- Line comment
2
+ /* Block comment */
3
+
4
+ /*
5
+ * Multi-line
6
+ * block comment
7
+ */
8
+
9
+ -- ============================================
10
+ -- DDL: CREATE / ALTER / DROP
11
+ -- ============================================
12
+
13
+ -- --- Create schema ---
14
+ CREATE SCHEMA IF NOT EXISTS sample_schema;
15
+
16
+ -- --- Create tables ---
17
+ CREATE TABLE users (
18
+ id SERIAL PRIMARY KEY,
19
+ username VARCHAR(50) NOT NULL UNIQUE,
20
+ email VARCHAR(255) NOT NULL,
21
+ password TEXT NOT NULL,
22
+ age INTEGER CHECK (age >= 0),
23
+ salary DECIMAL(10, 2) DEFAULT 0.00,
24
+ is_active BOOLEAN DEFAULT TRUE,
25
+ role VARCHAR(20) DEFAULT 'user',
26
+ metadata JSONB,
27
+ avatar BYTEA,
28
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
29
+ updated_at TIMESTAMPTZ,
30
+ birth_date DATE,
31
+ login_time TIME,
32
+ uuid_col UUID DEFAULT gen_random_uuid()
33
+ );
34
+
35
+ CREATE TABLE posts (
36
+ id BIGSERIAL PRIMARY KEY,
37
+ user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
38
+ title VARCHAR(200) NOT NULL,
39
+ body TEXT,
40
+ published BOOLEAN DEFAULT FALSE,
41
+ view_count INTEGER DEFAULT 0,
42
+ tags TEXT[],
43
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
44
+ CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id)
45
+ );
46
+
47
+ CREATE TABLE comments (
48
+ id SERIAL PRIMARY KEY,
49
+ post_id INTEGER NOT NULL REFERENCES posts(id) ON DELETE CASCADE,
50
+ user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE SET NULL,
51
+ body TEXT NOT NULL,
52
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
53
+ );
54
+
55
+ -- --- Indexes ---
56
+ CREATE INDEX idx_users_email ON users(email);
57
+ CREATE UNIQUE INDEX idx_users_username ON users(username);
58
+ CREATE INDEX idx_posts_user ON posts(user_id);
59
+ CREATE INDEX idx_posts_tags ON posts USING GIN(tags);
60
+
61
+ -- --- Views ---
62
+ CREATE VIEW active_users AS
63
+ SELECT id, username, email, created_at
64
+ FROM users
65
+ WHERE is_active = TRUE;
66
+
67
+ CREATE VIEW post_summary AS
68
+ SELECT
69
+ p.id,
70
+ p.title,
71
+ u.username AS author,
72
+ p.view_count,
73
+ COUNT(c.id) AS comment_count
74
+ FROM posts p
75
+ LEFT JOIN users u ON p.user_id = u.id
76
+ LEFT JOIN comments c ON c.post_id = p.id
77
+ GROUP BY p.id, p.title, u.username, p.view_count;
78
+
79
+ -- --- Alter table ---
80
+ ALTER TABLE users ADD COLUMN phone VARCHAR(20);
81
+ ALTER TABLE users ALTER COLUMN email SET NOT NULL;
82
+ ALTER TABLE users DROP COLUMN IF EXISTS phone;
83
+
84
+ -- --- Drop ---
85
+ DROP INDEX IF EXISTS idx_temp;
86
+ DROP VIEW IF EXISTS temp_view;
87
+ -- DROP TABLE IF EXISTS temp_table CASCADE;
88
+
89
+ -- ============================================
90
+ -- DML: INSERT / UPDATE / DELETE
91
+ -- ============================================
92
+
93
+ -- --- Insert ---
94
+ INSERT INTO users (username, email, password, age, salary, is_active)
95
+ VALUES
96
+ ('alice', 'alice@example.com', 'hashed_pw1', 30, 75000.00, TRUE),
97
+ ('bob', 'bob@example.com', 'hashed_pw2', 25, 60000.00, TRUE),
98
+ ('charlie', 'charlie@example.com', 'hashed_pw3', 35, 90000.00, FALSE);
99
+
100
+ INSERT INTO posts (user_id, title, body, published, tags)
101
+ VALUES
102
+ (1, 'First Post', 'Hello, World!', TRUE, ARRAY['intro', 'hello']),
103
+ (1, 'Second Post', 'More content here.', FALSE, ARRAY['draft']),
104
+ (2, 'Bobs Post', 'Bob writes too.', TRUE, ARRAY['blog']);
105
+
106
+ INSERT INTO comments (post_id, user_id, body)
107
+ VALUES
108
+ (1, 2, 'Great post!'),
109
+ (1, 1, 'Thanks!'),
110
+ (3, 1, 'Nice one, Bob.');
111
+
112
+ -- --- Update ---
113
+ UPDATE users
114
+ SET salary = salary * 1.10,
115
+ updated_at = CURRENT_TIMESTAMP
116
+ WHERE is_active = TRUE
117
+ AND age >= 25;
118
+
119
+ -- --- Delete ---
120
+ DELETE FROM comments
121
+ WHERE created_at < CURRENT_TIMESTAMP - INTERVAL '1 year';
122
+
123
+ -- ============================================
124
+ -- DQL: SELECT (various forms)
125
+ -- ============================================
126
+
127
+ -- --- Basic select ---
128
+ SELECT * FROM users;
129
+ SELECT DISTINCT role FROM users;
130
+ SELECT id, username, email FROM users WHERE is_active = TRUE;
131
+
132
+ -- --- Operators ---
133
+ SELECT * FROM users WHERE age BETWEEN 20 AND 40;
134
+ SELECT * FROM users WHERE username LIKE 'a%';
135
+ SELECT * FROM users WHERE username ILIKE '%LIC%';
136
+ SELECT * FROM users WHERE role IN ('admin', 'user');
137
+ SELECT * FROM users WHERE metadata IS NOT NULL;
138
+ SELECT * FROM users WHERE age >= 18 AND salary > 50000 OR role = 'admin';
139
+ SELECT * FROM users WHERE NOT is_active;
140
+
141
+ -- --- Aggregate functions ---
142
+ SELECT
143
+ COUNT(*) AS total_users,
144
+ AVG(age) AS avg_age,
145
+ MIN(salary) AS min_salary,
146
+ MAX(salary) AS max_salary,
147
+ SUM(salary) AS total_salary
148
+ FROM users
149
+ WHERE is_active = TRUE;
150
+
151
+ -- --- GROUP BY / HAVING ---
152
+ SELECT
153
+ role,
154
+ COUNT(*) AS user_count,
155
+ AVG(salary) AS avg_salary
156
+ FROM users
157
+ GROUP BY role
158
+ HAVING COUNT(*) > 1
159
+ ORDER BY avg_salary DESC;
160
+
161
+ -- --- ORDER BY / LIMIT / OFFSET ---
162
+ SELECT * FROM users
163
+ ORDER BY created_at DESC NULLS LAST
164
+ LIMIT 10
165
+ OFFSET 20;
166
+
167
+ -- --- FETCH (SQL standard) ---
168
+ SELECT * FROM users
169
+ ORDER BY id
170
+ FETCH FIRST 5 ROWS ONLY;
171
+
172
+ -- --- JOINs ---
173
+ SELECT u.username, p.title, p.created_at
174
+ FROM users u
175
+ INNER JOIN posts p ON u.id = p.user_id
176
+ WHERE p.published = TRUE;
177
+
178
+ SELECT u.username, p.title
179
+ FROM users u
180
+ LEFT JOIN posts p ON u.id = p.user_id;
181
+
182
+ SELECT u.username, p.title
183
+ FROM users u
184
+ RIGHT JOIN posts p ON u.id = p.user_id;
185
+
186
+ SELECT u.username, p.title
187
+ FROM users u
188
+ FULL OUTER JOIN posts p ON u.id = p.user_id;
189
+
190
+ SELECT u1.username, u2.username
191
+ FROM users u1
192
+ CROSS JOIN users u2
193
+ WHERE u1.id < u2.id;
194
+
195
+ -- --- Subqueries ---
196
+ SELECT * FROM users
197
+ WHERE id IN (
198
+ SELECT DISTINCT user_id FROM posts WHERE published = TRUE
199
+ );
200
+
201
+ SELECT u.*, (
202
+ SELECT COUNT(*) FROM posts p WHERE p.user_id = u.id
203
+ ) AS post_count
204
+ FROM users u;
205
+
206
+ -- --- CTE (Common Table Expressions) ---
207
+ WITH active_posters AS (
208
+ SELECT user_id, COUNT(*) AS post_count
209
+ FROM posts
210
+ WHERE published = TRUE
211
+ GROUP BY user_id
212
+ ),
213
+ ranked AS (
214
+ SELECT
215
+ u.username,
216
+ ap.post_count,
217
+ RANK() OVER (ORDER BY ap.post_count DESC) AS rank
218
+ FROM users u
219
+ JOIN active_posters ap ON u.id = ap.user_id
220
+ )
221
+ SELECT * FROM ranked WHERE rank <= 3;
222
+
223
+ -- --- Recursive CTE ---
224
+ WITH RECURSIVE fibonacci(n, a, b) AS (
225
+ VALUES (1, 0, 1)
226
+ UNION ALL
227
+ SELECT n + 1, b, a + b
228
+ FROM fibonacci
229
+ WHERE n < 10
230
+ )
231
+ SELECT n, a AS fib FROM fibonacci;
232
+
233
+ -- --- Set operations ---
234
+ SELECT username FROM users WHERE role = 'admin'
235
+ UNION
236
+ SELECT username FROM users WHERE age > 30;
237
+
238
+ SELECT id FROM users
239
+ INTERSECT
240
+ SELECT user_id FROM posts;
241
+
242
+ SELECT id FROM users
243
+ EXCEPT
244
+ SELECT user_id FROM comments;
245
+
246
+ -- --- CASE expression ---
247
+ SELECT
248
+ username,
249
+ CASE
250
+ WHEN age < 18 THEN 'minor'
251
+ WHEN age BETWEEN 18 AND 65 THEN 'adult'
252
+ ELSE 'senior'
253
+ END AS age_group,
254
+ CASE role
255
+ WHEN 'admin' THEN 'Administrator'
256
+ WHEN 'user' THEN 'Regular User'
257
+ ELSE 'Unknown'
258
+ END AS role_label
259
+ FROM users;
260
+
261
+ -- --- Window functions ---
262
+ SELECT
263
+ username,
264
+ salary,
265
+ AVG(salary) OVER () AS avg_salary,
266
+ salary - AVG(salary) OVER () AS diff_from_avg,
267
+ ROW_NUMBER() OVER (ORDER BY salary DESC) AS salary_rank,
268
+ LAG(salary) OVER (ORDER BY salary) AS prev_salary,
269
+ LEAD(salary) OVER (ORDER BY salary) AS next_salary
270
+ FROM users;
271
+
272
+ -- --- String functions ---
273
+ SELECT
274
+ UPPER(username) AS upper_name,
275
+ LOWER(email) AS lower_email,
276
+ LENGTH(username) AS name_length,
277
+ CONCAT(username, ' <', email, '>') AS display
278
+ FROM users;
279
+
280
+ -- ============================================
281
+ -- Functions / Procedures
282
+ -- ============================================
283
+
284
+ -- --- Function ---
285
+ CREATE OR REPLACE FUNCTION calculate_bonus(
286
+ base_salary DECIMAL,
287
+ performance_rating INTEGER
288
+ )
289
+ RETURNS DECIMAL
290
+ LANGUAGE SQL
291
+ IMMUTABLE
292
+ AS $$
293
+ SELECT base_salary * (performance_rating / 10.0);
294
+ $$;
295
+
296
+ -- --- Procedure ---
297
+ CREATE OR REPLACE PROCEDURE deactivate_user(
298
+ target_user_id INTEGER
299
+ )
300
+ LANGUAGE SQL
301
+ AS $$
302
+ UPDATE users SET is_active = FALSE WHERE id = target_user_id;
303
+ $$;
304
+
305
+ -- --- Trigger ---
306
+ CREATE OR REPLACE FUNCTION update_timestamp()
307
+ RETURNS TRIGGER
308
+ LANGUAGE SQL
309
+ AS $$
310
+ SELECT NEW.updated_at = CURRENT_TIMESTAMP;
311
+ $$;
312
+
313
+ CREATE TRIGGER users_update_timestamp
314
+ BEFORE UPDATE ON users
315
+ FOR EACH ROW
316
+ EXECUTE FUNCTION update_timestamp();
317
+
318
+ -- ============================================
319
+ -- Transactions
320
+ -- ============================================
321
+
322
+ BEGIN;
323
+ UPDATE users SET salary = salary + 5000 WHERE username = 'alice';
324
+ INSERT INTO posts (user_id, title, body) VALUES (1, 'Raise!', 'Got a raise!');
325
+ COMMIT;
326
+
327
+ -- ROLLBACK example
328
+ BEGIN;
329
+ DELETE FROM users WHERE username = 'charlie';
330
+ ROLLBACK;
331
+
332
+ -- ============================================
333
+ -- Privileges
334
+ -- ============================================
335
+
336
+ GRANT SELECT, INSERT ON users TO readonly_role;
337
+ REVOKE DELETE ON users FROM readonly_role;
338
+
339
+ -- ============================================
340
+ -- Function calls
341
+ -- ============================================
342
+ SELECT
343
+ NOW(),
344
+ CURRENT_DATE,
345
+ COALESCE(NULL, 'fallback'),
346
+ NULLIF(1, 1),
347
+ GREATEST(1, 2, 3),
348
+ LEAST(1, 2, 3),
349
+ ABS(-42),
350
+ ROUND(3.14159, 2),
351
+ CEIL(3.14),
352
+ FLOOR(3.99);