-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathpreprocess-sql.test.ts
160 lines (124 loc) · 4.24 KB
/
preprocess-sql.test.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import assert from 'node:assert';
import { hasAnnotation, preprocessSql } from '../src/describe-query';
import type { PreprocessedSql } from '../src/types';
describe('preprocess-sql', () => {
it('preprocess sql with one parameter', async () => {
const sql = 'select * from mytable1 where :id = 10';
const actual = preprocessSql(sql, 'mysql');
const expected: PreprocessedSql = {
sql: 'select * from mytable1 where ? = 10',
namedParameters: ['id']
};
assert.deepStrictEqual(actual, expected);
});
it('preprocess sql with several parameters', async () => {
const sql = 'select * from mytable1 where :id = 10 or :id=1 or : name > 10or:param1>0and :PARAM>0 and :PARAM1>0 and 10>20';
const actual = preprocessSql(sql, 'mysql');
const expected: PreprocessedSql = {
sql: 'select * from mytable1 where ? = 10 or ?=1 or : name > 10or?>0and ?>0 and ?>0 and 10>20',
namedParameters: ['id', 'id', 'param1', 'PARAM', 'PARAM1']
};
assert.deepStrictEqual(actual, expected);
});
it('preprocess sql with undescore and dollar in the param name', async () => {
const sql = 'select * from mytable1 where id = :emp_id or id = :$1';
const actual = preprocessSql(sql, 'mysql');
const expected: PreprocessedSql = {
sql: 'select * from mytable1 where id = ? or id = ?',
namedParameters: ['emp_id', '$1']
};
assert.deepStrictEqual(actual, expected);
});
it('preprocess sql without parameters', async () => {
const sql = 'select * from mytable1';
const actual = preprocessSql(sql, 'mysql');
const expected: PreprocessedSql = {
sql: 'select * from mytable1',
namedParameters: []
};
assert.deepStrictEqual(actual, expected);
});
it('preprocess with string literal', async () => {
const sql = `SELECT HOUR('13:01:02')`;
const actual = preprocessSql(sql, 'mysql');
const expected: PreprocessedSql = {
sql: `SELECT HOUR('13:01:02')`,
namedParameters: []
};
assert.deepStrictEqual(actual, expected);
});
it('preprocess with string literal', async () => {
const sql = `SELECT HOUR("13:01:02")`;
const actual = preprocessSql(sql, 'mysql');
const expected: PreprocessedSql = {
sql: `SELECT HOUR("13:01:02")`,
namedParameters: []
};
assert.deepStrictEqual(actual, expected);
});
it.skip('preprocess sql with invalid parameter names', async () => {
const sql = 'select * from mytable1 where :1 > 0 or :=0 or :111 > 0';
const actual = preprocessSql(sql, 'mysql');
const expected: PreprocessedSql = {
sql: 'select * from mytable1',
namedParameters: []
};
assert.deepStrictEqual(actual, expected);
});
it('verify @nested comment', async () => {
const sql = `
-- @nested
`;
const actual = hasAnnotation(sql, '@nested');
assert.deepStrictEqual(actual, true);
});
it('verify without @nested comment', async () => {
const sql = `
SELECT * FROM mytable1
`;
const actual = hasAnnotation(sql, '@nested');
assert.deepStrictEqual(actual, false);
});
it('verify without @nested not int comment', async () => {
const sql = `
SELECT id as @nested FROM mytable1
`;
const actual = hasAnnotation(sql, '@nested');
assert.deepStrictEqual(actual, false);
});
it('@safeIntegers:true in comments', async () => {
const sql = `
-- @safeIntegers:true
select * from mytable1`;
const actual = preprocessSql(sql, 'mysql');
const expected: PreprocessedSql = {
sql: `
-- @safeIntegers:true
select * from mytable1`,
namedParameters: []
};
assert.deepStrictEqual(actual, expected);
});
it('postgres-replace named paramters', async () => {
const sql = `
select :value1, :value1, :value2, :value3, :value2 from mytable1`;
const actual = preprocessSql(sql, 'postgres');
const expected: PreprocessedSql = {
sql: `
select $1, $1, $2, $3, $2 from mytable1`,
namedParameters: ['value1', 'value1', 'value2', 'value3', 'value2']
};
assert.deepStrictEqual(actual, expected);
});
it('handle type-cast id::int2', async () => {
const sql = `
select id::int2 from mytable1`;
const actual = preprocessSql(sql, 'postgres');
const expected: PreprocessedSql = {
sql: `
select id::int2 from mytable1`,
namedParameters: []
};
assert.deepStrictEqual(actual, expected);
});
});