Skip to content

Commit 643402c

Browse files
parse native param & fixed linter
1 parent 4f24c63 commit 643402c

File tree

5 files changed

+60
-32
lines changed

5 files changed

+60
-32
lines changed

examples/Ydb.Sdk.AdoNet.QuickStart/Program.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ private async Task InitTables()
5353

5454
var ydbCommand = connection.CreateCommand();
5555
ydbCommand.CommandText = """
56-
CREATE TABLE series
56+
CREATE TABLE IF NOT EXISTS series
5757
(
5858
series_id Uint64,
5959
title Text,
@@ -62,7 +62,7 @@ CREATE TABLE series
6262
PRIMARY KEY (series_id)
6363
);
6464
65-
CREATE TABLE seasons
65+
CREATE TABLE IF NOT EXISTS seasons
6666
(
6767
series_id Uint64,
6868
season_id Uint64,
@@ -72,7 +72,7 @@ CREATE TABLE seasons
7272
PRIMARY KEY (series_id, season_id)
7373
);
7474
75-
CREATE TABLE episodes
75+
CREATE TABLE IF NOT EXISTS episodes
7676
(
7777
series_id Uint64,
7878
season_id Uint64,

src/Ydb.Sdk/src/Ado/Internal/SqlParam.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ namespace Ydb.Sdk.Ado.Internal;
44

55
internal interface ISqlParam
66
{
7+
bool IsNative { get; }
8+
79
string Name { get; }
810

911
YdbValue YdbValueFetch(Dictionary<string, YdbValue> ydbParameters);
1012
}
1113

12-
internal record PrimitiveParam(string Name) : ISqlParam
14+
internal record PrimitiveParam(string Name, bool IsNative) : ISqlParam
1315
{
1416
public YdbValue YdbValueFetch(Dictionary<string, YdbValue> ydbParameters) =>
1517
ydbParameters.Get(Name);
@@ -27,6 +29,7 @@ public ListPrimitiveParam(IReadOnlyList<string> paramNames, int globalNumber)
2729
Name = $"{PrefixParamName}_{globalNumber}";
2830
}
2931

32+
public bool IsNative => false;
3033
public string Name { get; }
3134

3235
public YdbValue YdbValueFetch(Dictionary<string, YdbValue> ydbParameters) => YdbValue

src/Ydb.Sdk/src/Ado/Internal/SqlParser.cs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,20 @@ internal static ParsedResult Parse(string sql)
4545
break;
4646
}
4747

48-
var (name, nextToken) = ParseNameParam(sql, curToken);
48+
var parsedParam = ParseNameParam(sql, curToken);
49+
50+
newYql.Append(sql[fragmentToken .. curToken]).Append(parsedParam.Name);
51+
sqlParamsBuilder.AddPrimitiveParam(parsedParam.Name, false);
52+
fragmentToken = parsedParam.NextToken;
53+
curToken = parsedParam.NextToken;
54+
break;
55+
case '$':
56+
var parsedNativeParam = ParseNameParam(sql, curToken);
4957

50-
newYql.Append(sql[fragmentToken .. curToken]).Append(name);
51-
sqlParamsBuilder.AddPrimitiveParam(name);
52-
fragmentToken = nextToken;
53-
curToken = nextToken;
58+
newYql.Append(sql[fragmentToken .. curToken]).Append(parsedNativeParam.Name);
59+
sqlParamsBuilder.AddPrimitiveParam(parsedNativeParam.Name, true);
60+
fragmentToken = parsedNativeParam.NextToken;
61+
curToken = parsedNativeParam.NextToken;
5462
break;
5563
case var _ when ParseInKeyWord(sql, curToken):
5664
curToken += 2; // skip IN keyword
@@ -96,7 +104,7 @@ private static int ParseLineComment(string sql, int curToken)
96104
return curToken + 1;
97105
}
98106

99-
for (; sql[curToken] != '\r' && sql[curToken] != '\n'; curToken++)
107+
for (; curToken < sql.Length && sql[curToken] != '\r' && sql[curToken] != '\n'; curToken++)
100108
{
101109
}
102110

@@ -157,7 +165,8 @@ private static int ParseMultilineStringLiterals(string sql, int curToken)
157165
}
158166

159167
private static bool ParseInKeyWord(string sql, int keyWordStart) => sql.Length - keyWordStart >= 2 &&
160-
(sql[keyWordStart] | 0x20) == 'i' && (sql[keyWordStart + 1] | 0x20) == 'n';
168+
(sql[keyWordStart] | 0x20) == 'i' &&
169+
(sql[keyWordStart + 1] | 0x20) == 'n';
161170

162171

163172
private static int ParseInListParameters(
@@ -266,14 +275,14 @@ private class SqlParamsBuilder
266275

267276
private int _globalNumberListPrimitiveParam;
268277

269-
internal void AddPrimitiveParam(string paramName)
278+
internal void AddPrimitiveParam(string paramName, bool isNative)
270279
{
271280
if (_foundParamNames.Contains(paramName))
272281
{
273282
return;
274283
}
275284

276-
_sqlParams.Add(new PrimitiveParam(paramName));
285+
_sqlParams.Add(new PrimitiveParam(paramName, isNative));
277286
_foundParamNames.Add(paramName);
278287
}
279288

src/Ydb.Sdk/src/Ado/YdbCommand.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,12 +185,16 @@ protected override async Task<DbDataReader> ExecuteDbDataReaderAsync(CommandBeha
185185
);
186186
var preparedSql = new StringBuilder();
187187
var ydbParameters = new Dictionary<string, YdbValue>();
188-
188+
189189
foreach (var sqlParam in sqlParams)
190190
{
191191
var ydbValue = sqlParam.YdbValueFetch(ydbParameterCollection);
192-
193-
preparedSql.Append($"DECLARE {sqlParam.Name} AS {ydbValue.ToYql()};\n");
192+
193+
if (!sqlParam.IsNative)
194+
{
195+
preparedSql.Append($"DECLARE {sqlParam.Name} AS {ydbValue.ToYql()};\n");
196+
}
197+
194198
ydbParameters[sqlParam.Name] = ydbValue;
195199
}
196200

src/Ydb.Sdk/tests/Ado/Internal/SqlParserTests.cs

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,16 @@ public void Parse_WhenDigitOrLetterOrUnderliningInParamName_ReturnParsedSqlAndCa
1212
var (sql, sqlParams) = SqlParser.Parse("SELECT @p; SELECT @p2; SELECT @p_3;");
1313

1414
Assert.Equal("SELECT $p; SELECT $p2; SELECT $p_3;", sql);
15-
Assert.Equal(new PrimitiveParam[] { new("$p"), new("$p2"), new("$p_3") }, sqlParams);
15+
Assert.Equal(new PrimitiveParam[] { new("$p", false), new("$p2", false), new("$p_3", false) }, sqlParams);
16+
}
17+
18+
[Fact]
19+
public void Parse_WhenNativeParameterInQuery_ReturnParsedSql()
20+
{
21+
var (sql, sqlParams) = SqlParser.Parse("DECLARE $p2 AS Text; SELECT @p; SELECT $p2; SELECT @p_3;");
22+
23+
Assert.Equal("DECLARE $p2 AS Text; SELECT $p; SELECT $p2; SELECT $p_3;", sql);
24+
Assert.Equal(new PrimitiveParam[] { new("$p2", true), new("$p", false), new("$p_3", false) }, sqlParams);
1625
}
1726

1827
[Fact]
@@ -39,7 +48,7 @@ public void Parse_WhenLineComment_ReturnSqlWithComment()
3948

4049
Assert.Equal(@"-- Comment with params @param, @p2, @p_3
4150
SELECT $param; SELECT $p2; SELECT $p_3;", sql);
42-
Assert.Equal(new PrimitiveParam[] { new("$param"), new("$p2"), new("$p_3") }, sqlParams);
51+
Assert.Equal(new PrimitiveParam[] { new("$param", false), new("$p2", false), new("$p_3", false) }, sqlParams);
4352
}
4453

4554
[Fact]
@@ -76,10 +85,13 @@ INSERT INTO Table
7685
$name15, $name16, $name17, $name18, $name19, $name20);", sql);
7786
Assert.Equal(new PrimitiveParam[]
7887
{
79-
new("$name1"), new("$name2"), new("$name3"), new("$name4"), new("$name5"),
80-
new("$name6"), new("$name7"), new("$name8"), new("$name9"), new("$name10"),
81-
new("$name11"), new("$name12"), new("$name13"), new("$name14"), new("$name15"),
82-
new("$name16"), new("$name17"), new("$name18"), new("$name19"), new("$name20")
88+
new("$name1", false), new("$name2", false), new("$name3", false),
89+
new("$name4", false), new("$name5", false), new("$name6", false),
90+
new("$name7", false), new("$name8", false), new("$name9", false),
91+
new("$name10", false), new("$name11", false), new("$name12", false),
92+
new("$name13", false), new("$name14", false), new("$name15", false),
93+
new("$name16", false), new("$name17", false), new("$name18", false),
94+
new("$name19", false), new("$name20", false)
8395
}, sqlParams);
8496
}
8597

@@ -130,7 +142,7 @@ public void Parse_WhenDoubleQuotes_ReturnSql()
130142
-- View result:
131143
SELECT * FROM episodes WHERE series_id = ""123 @ \"" @ @"" AND season_id = $param;
132144
;", sql);
133-
Assert.Equal(new PrimitiveParam[] { new("$air_date"), new("$param") }, sqlParams);
145+
Assert.Equal(new PrimitiveParam[] { new("$air_date", false), new("$param", false) }, sqlParams);
134146
}
135147

136148
[Fact]
@@ -180,7 +192,7 @@ public void Parse_WhenSingleQuotes_ReturnSql()
180192
181193
-- View result:
182194
SELECT * FROM episodes WHERE series_id = '123 @ \' @ @' AND season_id = $param;", sql);
183-
Assert.Equal(new PrimitiveParam[] { new("$air_date"), new("$param") }, sqlParams);
195+
Assert.Equal(new PrimitiveParam[] { new("$air_date", false), new("$param", false) }, sqlParams);
184196
}
185197

186198
[Fact]
@@ -231,7 +243,7 @@ public void Parse_WhenBacktickQuotes_ReturnSql()
231243
232244
-- View result:
233245
SELECT * FROM episodes WHERE series_id = '123 @ \' @ @' AND season_id = $param;", sql);
234-
Assert.Equal(new PrimitiveParam[] { new("$air_date"), new("$param") }, sqlParams);
246+
Assert.Equal(new PrimitiveParam[] { new("$air_date", false), new("$param", false) }, sqlParams);
235247
}
236248

237249
[Fact]
@@ -250,7 +262,7 @@ public void Parse_WhenMultilineStringLiterals_ReturnSql()
250262
SELECT $text;
251263
-- Comment with params @param, @p2, @p_3
252264
SELECT $param; SELECT $p2; SELECT $p_3;", sql);
253-
Assert.Equal(new PrimitiveParam[] { new("$param"), new("$p2"), new("$p_3") }, sqlParams);
265+
Assert.Equal(new PrimitiveParam[] { new("$param", false), new("$p2", false), new("$p_3", false) }, sqlParams);
254266
}
255267

256268
[Fact]
@@ -259,7 +271,7 @@ public void Parse_WhenRepeatedOneParam_ReturnThisParamInParamNames()
259271
var (sql, sqlParams) = SqlParser.Parse("SELECT @a, @a, @a;");
260272

261273
Assert.Equal("SELECT $a, $a, $a;", sql);
262-
Assert.Equal(new PrimitiveParam[] { new("$a") }, sqlParams);
274+
Assert.Equal(new PrimitiveParam[] { new("$a", false) }, sqlParams);
263275
}
264276

265277
[Fact]
@@ -268,7 +280,7 @@ public void Parse_WhenParamHasNextStatementIsNotWhitespace_ReturnSql()
268280
var (sql, sqlParams) = SqlParser.Parse("SELECT @a/* this comment @ */");
269281

270282
Assert.Equal("SELECT $a/* this comment @ */", sql);
271-
Assert.Equal(new PrimitiveParam[] { new("$a") }, sqlParams);
283+
Assert.Equal(new PrimitiveParam[] { new("$a", false) }, sqlParams);
272284
}
273285

274286
[Theory]
@@ -358,17 +370,17 @@ public void Parse_WhenManySqlStatementWithListParameters_ReturnSqlWithListParam(
358370
Assert.Equal(5, listPrimitive1.Count);
359371
for (var i = 0; i < 5; i++)
360372
{
361-
Assert.Equal(i + 1, listPrimitive1[i].GetInt32());
373+
Assert.Equal(i + 1, listPrimitive1[i].GetInt32());
362374
}
363-
375+
364376
Assert.Equal("$Gen_List_Primitive_2", sqlParams[2].Name);
365377
var listPrimitive2 = sqlParams[2].YdbValueFetch(ydbParameters).GetList();
366378
Assert.Equal(4, listPrimitive2.Count);
367379
for (var i = 0; i < 4; i++)
368380
{
369-
Assert.Equal(i + 1, listPrimitive2[i].GetInt32());
381+
Assert.Equal(i + 1, listPrimitive2[i].GetInt32());
370382
}
371-
383+
372384
Assert.Equal("first", sqlParams[1].YdbValueFetch(ydbParameters).GetUtf8());
373385
Assert.Equal("second", sqlParams[5].YdbValueFetch(ydbParameters).GetUtf8());
374386
Assert.Equal(1, sqlParams[3].YdbValueFetch(ydbParameters).GetInt32());

0 commit comments

Comments
 (0)