Skip to content

Commit c56b2e4

Browse files
committed
Add types; get it all working
1 parent b0c8830 commit c56b2e4

29 files changed

+255
-103
lines changed

SqlDataComparison.proj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
</Target>
3131

3232
<ItemGroup>
33-
<InstallFiles Include="$(SourcePath)CreateSqlUtilsDb.sql;$(SourcePath)types\*.sql;$(SourcePath)internals\*.sql;$(SourcePath)core\*.sql;$(SourcePath)main\*.sql"/>
33+
<InstallFiles Include="$(SourcePath)CreateSqlUtilsDb.sql;$(SourcePath)types\*.sql;$(SourcePath)preInternals\*.sql;$(SourcePath)internals\*.sql;$(SourcePath)core\*.sql;$(SourcePath)main\*.sql"/>
3434
</ItemGroup>
3535

3636
<!-- Concatenate files https://stackoverflow.com/a/29557615/795690 -->
@@ -99,7 +99,7 @@
9999
</Target>
100100

101101
<ItemGroup>
102-
<InstallTestsFiles Include="$(TestsPath)test-dbs\DropTestDatabases.sql;$(TestsPath)test-dbs\CreateTestDatabases.sql;$(TestsPath)test-dbs\RecreateTestTables.sql;$(TestsPath)*.sql"/>
102+
<InstallTestsFiles Include="$(TestsPath)test-dbs\DropTestDatabases.sql;$(TestsPath)test-dbs\CreateTestDatabases.sql;$(TestsPath)test-dbs\CreateTestTables.sql;$(TestsPath)test-dbs\CreateCrazyTables.sql;$(TestsPath)*.sql"/>
103103
</ItemGroup>
104104

105105
<Target Name="CreateInstallTests" Inputs="SqlDataComparison.proj;$(SourcePath)$(LicenseFile);@(InstallTestsFiles)" Outputs="$(OutputPath)$(OutputInstallTests)">

src/core/SqlDataComparison.sql

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ BEGIN
118118
*/
119119
DECLARE @our_columns internals.ColumnsTable
120120

121-
INSERT INTO @our_columns (column_id, quotedName)
121+
INSERT INTO @our_columns (column_id, quoted_name)
122122
EXEC @retval = internals.GetColumns
123123
@database_part = @our_database_part,
124124
@schema = @our_schema,
@@ -132,7 +132,7 @@ BEGIN
132132
*/
133133
DECLARE @use_columns internals.ColumnsTable
134134

135-
INSERT INTO @use_columns (column_id, quotedName)
135+
INSERT INTO @use_columns (column_id, quoted_name)
136136
EXEC @retval = internals.ProcessUseParam
137137
@use = @use,
138138
@our_columns = @our_columns,
@@ -145,7 +145,7 @@ BEGIN
145145
*/
146146
DECLARE @their_columns internals.ColumnsTable
147147

148-
INSERT INTO @their_columns (column_id, quotedName)
148+
INSERT INTO @their_columns (column_id, quoted_name)
149149
EXEC @retval = internals.GetColumns
150150
@database_part = @their_database_part,
151151
@schema = @their_schema,
@@ -160,7 +160,7 @@ BEGIN
160160
-- NB @mapped_columns contains local column id with mapped remote column name
161161
DECLARE @mapped_columns internals.ColumnsTable
162162

163-
INSERT INTO @mapped_columns (column_id, quotedName)
163+
INSERT INTO @mapped_columns (column_id, quoted_name)
164164
EXEC @retval = internals.ProcessMapParam
165165
@map = @map,
166166
@our_columns = @our_columns,
@@ -191,7 +191,7 @@ BEGIN
191191
/*
192192
* Use @join for join instead of table primary keys, if provided
193193
*/
194-
INSERT INTO @key_columns (column_id, quotedName)
194+
INSERT INTO @key_columns (column_id, quoted_name)
195195
EXEC @retval = internals.ProcessJoinParam
196196
@join = @join,
197197
@use_columns = @use_columns,
@@ -204,7 +204,7 @@ BEGIN
204204
/*
205205
* Load our table primary key columns
206206
*/
207-
INSERT INTO @key_columns (column_id, quotedName)
207+
INSERT INTO @key_columns (column_id, quoted_name)
208208
EXEC @retval = internals.GetPrimaryKeyColumns
209209
@database_part = @our_database_part,
210210
@schema = @our_schema,
@@ -244,7 +244,7 @@ BEGIN
244244

245245
SET @i = 0
246246
SELECT
247-
@join_sql = @join_sql + CASE WHEN @i = 0 THEN 'ON' ELSE 'AND' END + ' [ours].' + kc.quotedName + ' = [theirs].' + m.quotedName + '' + @CRLF,
247+
@join_sql = @join_sql + CASE WHEN @i = 0 THEN 'ON' ELSE 'AND' END + ' [ours].' + kc.quoted_name + ' = [theirs].' + m.quoted_name + '' + @CRLF,
248248
@i = @i + 1
249249
FROM @key_columns kc
250250
INNER JOIN @mapped_columns m
@@ -265,13 +265,13 @@ BEGIN
265265
IF @added_rows = 1 OR @changed_rows = 1
266266
BEGIN
267267
IF @import > 0
268-
INSERT INTO @identity_columns (column_id, quotedName)
268+
INSERT INTO @identity_columns (column_id, quoted_name)
269269
EXEC @retval = internals.GetIdentityColumns
270270
@database_part = @our_database_part,
271271
@schema = @our_schema,
272272
@table = @our_table
273273
ELSE
274-
INSERT INTO @identity_columns (column_id, quotedName)
274+
INSERT INTO @identity_columns (column_id, quoted_name)
275275
EXEC @retval = internals.GetIdentityColumns
276276
@database_part = @their_database_part,
277277
@schema = @their_schema,
@@ -300,7 +300,7 @@ BEGIN
300300

301301
SET @sql = @sql + 'INSERT INTO %0 (' + @CRLF
302302

303-
SELECT @sql = @sql + @TAB + CASE WHEN @import > 0 THEN uc.quotedName ELSE m.quotedName END + ',' + @CRLF
303+
SELECT @sql = @sql + @TAB + CASE WHEN @import > 0 THEN uc.quoted_name ELSE m.quoted_name END + ',' + @CRLF
304304
FROM @use_columns uc
305305
INNER JOIN @mapped_columns m
306306
ON uc.column_id = m.column_id
@@ -311,7 +311,7 @@ BEGIN
311311

312312
SELECT @sql = @sql + 'SELECT' + @CRLF
313313

314-
SELECT @sql = @sql + @TAB + '%2.' + CASE WHEN @import > 0 THEN m.quotedName ELSE uc.quotedName END + ',' + @CRLF
314+
SELECT @sql = @sql + @TAB + '%2.' + CASE WHEN @import > 0 THEN m.quoted_name ELSE uc.quoted_name END + ',' + @CRLF
315315
FROM @use_columns uc
316316
INNER JOIN @mapped_columns m
317317
ON uc.column_id = m.column_id
@@ -330,7 +330,7 @@ BEGIN
330330
SELECT
331331
@sql = @sql +
332332
CASE WHEN @i = 0 THEN ' ' ELSE ' AND ' END +
333-
'%1.' + CASE WHEN @import > 0 THEN kc.quotedName ELSE m.quotedName END + ' IS NULL' + @CRLF,
333+
'%1.' + CASE WHEN @import > 0 THEN kc.quoted_name ELSE m.quoted_name END + ' IS NULL' + @CRLF,
334334
@i = @i + 1
335335
FROM @key_columns kc
336336
INNER JOIN @mapped_columns m
@@ -374,7 +374,7 @@ BEGIN
374374
SELECT
375375
@sql = @sql +
376376
CASE WHEN @i = 0 THEN ' ' ELSE ' OR ' END +
377-
'(%1.' + CASE WHEN @import > 0 THEN kc.quotedName ELSE m.quotedName END + ' IS NOT NULL AND %2.' + CASE WHEN @import > 0 THEN m.quotedName ELSE kc.quotedName END + ' IS NULL)' + @CRLF,
377+
'(%1.' + CASE WHEN @import > 0 THEN kc.quoted_name ELSE m.quoted_name END + ' IS NOT NULL AND %2.' + CASE WHEN @import > 0 THEN m.quoted_name ELSE kc.quoted_name END + ' IS NULL)' + @CRLF,
378378
@i = @i + 1
379379
FROM @key_columns kc
380380
INNER JOIN @mapped_columns m
@@ -408,8 +408,8 @@ BEGIN
408408
SELECT
409409
@sql = @sql +
410410
@TAB + CASE WHEN @i = 0 THEN 'SET ' ELSE @TAB END +
411-
CASE WHEN @import > 0 THEN uc.quotedName ELSE m.quotedName END + ' = ' +
412-
'%2.' + CASE WHEN @import > 0 THEN m.quotedName ELSE uc.quotedName END +
411+
CASE WHEN @import > 0 THEN uc.quoted_name ELSE m.quoted_name END + ' = ' +
412+
'%2.' + CASE WHEN @import > 0 THEN m.quoted_name ELSE uc.quoted_name END +
413413
',' + @CRLF,
414414
@i = @i + 1
415415
FROM @use_columns uc
@@ -433,9 +433,9 @@ BEGIN
433433
SELECT
434434
@sql = @sql +
435435
CASE WHEN @i = 0 THEN ' ' ELSE ' OR ' END +
436-
'([ours].' + uc.quotedName + ' IS NULL AND [theirs].' + m.quotedName + ' IS NOT NULL)' + @CRLF +
437-
' OR ([ours].' + uc.quotedName + ' IS NOT NULL AND [theirs].' + m.quotedName + ' IS NULL)' + @CRLF +
438-
' OR [ours].' + uc.quotedName + ' <> [theirs].' + m.quotedName + '' + @CRLF,
436+
'([ours].' + uc.quoted_name + ' IS NULL AND [theirs].' + m.quoted_name + ' IS NOT NULL)' + @CRLF +
437+
' OR ([ours].' + uc.quoted_name + ' IS NOT NULL AND [theirs].' + m.quoted_name + ' IS NULL)' + @CRLF +
438+
' OR [ours].' + uc.quoted_name + ' <> [theirs].' + m.quoted_name + '' + @CRLF,
439439
@i = @i + 1
440440
FROM @use_columns uc
441441
INNER JOIN @mapped_columns m
@@ -474,22 +474,22 @@ BEGIN
474474
IF @interleave = 1
475475
BEGIN
476476
SELECT @sql = @sql +
477-
@TAB + ' [ours].' + uc.quotedName + ' AS [<<< ' + uc.quotedName + '],' + @CRLF +
478-
@TAB + ' [theirs].' + m.quotedName + ' AS [>>> ' + m.quotedName + '],' + @CRLF
477+
@TAB + ' [ours].' + uc.quoted_name + ' AS [<<< ' + uc.quoted_name + '],' + @CRLF +
478+
@TAB + ' [theirs].' + m.quoted_name + ' AS [>>> ' + m.quoted_name + '],' + @CRLF
479479
FROM @use_columns uc
480480
INNER JOIN @mapped_columns m
481-
ON u.column_id = m.column_id
481+
ON uc.column_id = m.column_id
482482
END
483483
ELSE
484484
BEGIN
485485
SET @sql = @sql + '''OURS <<<'' AS [ ],' + @CRLF
486486

487-
SELECT @sql = @sql + @TAB + ' [ours].' + quotedName + ',' + @CRLF
487+
SELECT @sql = @sql + @TAB + ' [ours].' + quoted_name + ',' + @CRLF
488488
FROM @our_columns
489489

490490
SET @sql = @sql + @TAB + ' ''THEIRS >>>'' AS [ ],' + @CRLF
491491

492-
SELECT @sql = @sql + @TAB + ' [theirs].' + quotedName + ',' + @CRLF
492+
SELECT @sql = @sql + @TAB + ' [theirs].' + quoted_name + ',' + @CRLF
493493
FROM @their_columns
494494
END
495495

@@ -507,18 +507,18 @@ BEGIN
507507
SELECT
508508
@sql = @sql +
509509
CASE WHEN @i = 0 THEN ' ' ELSE ' OR ' END +
510-
'([ours].' + kc.quotedName + ' IS NULL AND [theirs].' + m.quotedName + ' IS NOT NULL)' + @CRLF +
511-
' OR ([ours].' + kc.quotedName + ' IS NOT NULL AND [theirs].' + m.quotedName + ' IS NULL)' + @CRLF,
510+
'([ours].' + kc.quoted_name + ' IS NULL AND [theirs].' + m.quoted_name + ' IS NOT NULL)' + @CRLF +
511+
' OR ([ours].' + kc.quoted_name + ' IS NOT NULL AND [theirs].' + m.quoted_name + ' IS NULL)' + @CRLF,
512512
@i = @i + 1
513513
FROM @key_columns kc
514514
INNER JOIN @mapped_columns m
515515
ON kc.column_id = m.column_id
516516

517517
SELECT
518518
@sql = @sql +
519-
' OR ([ours].' + uc.quotedName + ' IS NULL AND [theirs].' + m.quotedName + ' IS NOT NULL)' + @CRLF +
520-
' OR ([ours].' + uc.quotedName + ' IS NOT NULL AND [theirs].' + m.quotedName + ' IS NULL)' + @CRLF +
521-
' OR [ours].' + uc.quotedName + ' <> [theirs].' + m.quotedName + '' + @CRLF
519+
' OR ([ours].' + uc.quoted_name + ' IS NULL AND [theirs].' + m.quoted_name + ' IS NOT NULL)' + @CRLF +
520+
' OR ([ours].' + uc.quoted_name + ' IS NOT NULL AND [theirs].' + m.quoted_name + ' IS NULL)' + @CRLF +
521+
' OR [ours].' + uc.quoted_name + ' <> [theirs].' + m.quoted_name + '' + @CRLF
522522
FROM @use_columns uc
523523
INNER JOIN @mapped_columns m
524524
ON uc.column_id = m.column_id

src/internals/CheckTheirColumnsExist.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ BEGIN
1717

1818
DECLARE @mapped_use_columns internals.ColumnsTable
1919

20-
INSERT INTO @mapped_use_columns (quotedName)
21-
SELECT m.quotedName
20+
INSERT INTO @mapped_use_columns (quoted_name)
21+
SELECT m.quoted_name
2222
FROM @use_columns uc
2323
INNER JOIN @mapped_columns m
2424
ON uc.column_id = m.column_id

src/internals/GetColumns.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ BEGIN
3030
'@schema sysname,' + @CRLF +
3131
'@table sysname'
3232
SET @sql =
33-
'SELECT c.column_id, QUOTENAME(c.name) as quotedName' + @CRLF +
33+
'SELECT c.column_id, QUOTENAME(c.name) as quoted_name' + @CRLF +
3434
'FROM ' + @database_part + '.sys.objects o' + @CRLF +
3535
'INNER JOIN ' + @database_part + '.sys.schemas s' + @CRLF +
3636
'ON o.schema_id = s.schema_id' + @CRLF +

src/internals/GetIdentityColumns.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ BEGIN
2222
'@schema sysname,' + @CRLF +
2323
'@table sysname'
2424
SET @sql =
25-
'SELECT c.column_id, QUOTENAME(c.name) AS quotedName' + @CRLF +
25+
'SELECT c.column_id, QUOTENAME(c.name) AS quoted_name' + @CRLF +
2626
'FROM ' + @database_part + '.sys.schemas s' + @CRLF +
2727
'INNER JOIN ' + @database_part + '.sys.objects o' + @CRLF +
2828
'ON o.schema_id = s.schema_id' + @CRLF +

src/internals/GetPrimaryKeyColumns.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ BEGIN
2222
'@schema sysname,' + @CRLF +
2323
'@table sysname'
2424
SET @sql =
25-
'SELECT c.column_id, QUOTENAME(c.name) as quotedName' + @CRLF +
25+
'SELECT c.column_id, QUOTENAME(c.name) as quoted_name' + @CRLF +
2626
'FROM ' + @database_part + '.sys.objects o' + @CRLF +
2727
'INNER JOIN ' + @database_part + '.sys.schemas s' + @CRLF +
2828
'ON o.schema_id = s.schema_id' + @CRLF +

src/internals/ProcessIdsParam.sql

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ BEGIN
3434
BEGIN TRY
3535
INSERT INTO #ids (orderBy, id)
3636
SELECT orderBy, id
37-
FROM internals.splitIds(@ids, '-')
37+
FROM internals.SplitIds(@ids, '-')
3838

3939
SELECT @rowcount = @@ROWCOUNT, @error = @@ERROR
4040
END TRY
@@ -50,15 +50,15 @@ BEGIN
5050

5151
SELECT @i = 0, @idsWhere = '('
5252

53-
SELECT @idsWhere = @idsWhere + CASE WHEN @i = 0 THEN '' ELSE ' AND ' END + '[ours].' + kc.quotedName + CASE WHEN @i = 0 THEN ' >= ' ELSE ' <= ' END + CAST(i.id AS NVARCHAR(MAX)), @i = @i + 1
53+
SELECT @idsWhere = @idsWhere + CASE WHEN @i = 0 THEN '' ELSE ' AND ' END + '[ours].' + kc.quoted_name + CASE WHEN @i = 0 THEN ' >= ' ELSE ' <= ' END + CAST(i.id AS NVARCHAR(MAX)), @i = @i + 1
5454
FROM #ids i
5555
FULL OUTER JOIN @key_columns kc
5656
ON 1 = 1
5757
ORDER BY i.orderBy
5858

5959
SELECT @i = 0, @idsWhere = @idsWhere + ') OR ('
6060

61-
SELECT @idsWhere = @idsWhere + CASE WHEN @i = 0 THEN '' ELSE ' AND ' END + '[theirs].' + m.quotedName + CASE WHEN @i = 0 THEN ' >= ' ELSE ' <= ' END + CAST(i.id AS NVARCHAR(MAX)), @i = @i + 1
61+
SELECT @idsWhere = @idsWhere + CASE WHEN @i = 0 THEN '' ELSE ' AND ' END + '[theirs].' + m.quoted_name + CASE WHEN @i = 0 THEN ' >= ' ELSE ' <= ' END + CAST(i.id AS NVARCHAR(MAX)), @i = @i + 1
6262
FROM #ids i
6363
FULL OUTER JOIN @key_columns kc
6464
ON 1 = 1
@@ -73,7 +73,7 @@ BEGIN
7373
BEGIN TRY
7474
INSERT INTO #ids (orderBy, id)
7575
SELECT orderBy, id
76-
FROM internals.splitIds(@ids, ',')
76+
FROM internals.SplitIds(@ids, ',')
7777

7878
SELECT @rowcount = @@ROWCOUNT, @error = @@ERROR
7979
END TRY
@@ -92,9 +92,9 @@ BEGIN
9292
SELECT @idsWhere =
9393
@idsWhere +
9494
CASE WHEN @i = 0 THEN '' ELSE ' OR ' END +
95-
'[ours].' + kc.quotedName + ' = ' + CAST(i.id AS NVARCHAR(MAX)) +
95+
'[ours].' + kc.quoted_name + ' = ' + CAST(i.id AS NVARCHAR(MAX)) +
9696
' OR ' +
97-
'[theirs].' + m.quotedName + ' = ' + CAST(i.id AS NVARCHAR(MAX)),
97+
'[theirs].' + m.quoted_name + ' = ' + CAST(i.id AS NVARCHAR(MAX)),
9898
@i = @i + 1
9999
FROM #ids i
100100
FULL OUTER JOIN @key_columns kc

src/internals/ProcessJoinParam.sql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ BEGIN
2020

2121
DECLARE @join_columns internals.ColumnsTable
2222

23-
INSERT INTO @join_columns (quotedName)
24-
SELECT QUOTENAME(name) FROM internals.SplitColumnNames(@join)
23+
INSERT INTO @join_columns (quoted_name)
24+
SELECT quoted_name FROM internals.SplitColumnNames(@join)
2525
SELECT @rowcount = @@ROWCOUNT, @error = @@ERROR
2626

2727
IF @error <> 0
@@ -39,10 +39,10 @@ BEGIN
3939

4040
IF @retval <> 0 OR @@ERROR <> 0 GOTO error
4141

42-
SELECT uc.column_id, uc.quotedName
42+
SELECT uc.column_id, uc.quoted_name
4343
FROM @use_columns uc
4444
INNER JOIN @join_columns jc
45-
ON uc.quotedName = jc.quotedName
45+
ON uc.quoted_name = jc.quoted_name
4646

4747
RETURN 0
4848

src/internals/ProcessMapParam.sql

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,16 @@ BEGIN
2222

2323
IF @map IS NULL
2424
BEGIN
25-
SELECT column_id, quotedName
25+
SELECT column_id, quoted_name
2626
FROM @our_columns
2727
END
2828
ELSE
2929
BEGIN
30-
CREATE TABLE #column_mapping
31-
(
32-
quotedName internals.QuotedName,
33-
quotedRename internals.QuotedName
34-
)
30+
DECLARE @column_mapping internals.ColumnsMap
3531

3632
BEGIN TRY
37-
INSERT INTO #column_mapping (quotedName, quotedRename)
38-
SELECT QUOTENAME([name]) AS quotedName, QUOTENAME(rename) AS quotedRename
33+
INSERT INTO @column_mapping (quoted_name, quoted_rename)
34+
SELECT quoted_name, quoted_rename
3935
FROM internals.SplitColumnMap(@map)
4036

4137
SELECT @rowcount = @@ROWCOUNT, @error = @@ERROR
@@ -46,17 +42,16 @@ BEGIN
4642

4743
IF @error <> 0
4844
BEGIN
49-
-- names passed to @map param should NOT be quoted, and (as currently coded) cannot contain , or ;
50-
RAISERROR('Illegal @map parameter ''%s''; use ''our_col1, their_col1; our_col2, their_col2''', 16, 1, @map)
45+
RAISERROR('Illegal @map parameter ''%s''; use ''our_col1, their_col1; our_col2, their_col2'' quoting column names using [...] if necessary', 16, 1, @map)
5146
GOTO error
5247
END
5348

5449
-- validate mapping source columns
5550
DECLARE @map_source internals.ColumnsTable
5651

57-
INSERT INTO @map_source (quotedName)
58-
SELECT quotedName
59-
FROM #column_mapping
52+
INSERT INTO @map_source (quoted_name)
53+
SELECT quoted_name
54+
FROM @column_mapping
6055

6156
EXEC @retval = internals.ValidateColumns
6257
@map_source, @our_columns,
@@ -70,9 +65,9 @@ BEGIN
7065
-- validate mapping target columns
7166
DECLARE @map_target internals.ColumnsTable
7267

73-
INSERT INTO @map_target (quotedName)
74-
SELECT quotedRename
75-
FROM #column_mapping
68+
INSERT INTO @map_target (quoted_name)
69+
SELECT quoted_rename
70+
FROM @column_mapping
7671

7772
EXEC @retval = internals.ValidateColumns
7873
@map_target, @their_columns,
@@ -84,12 +79,12 @@ BEGIN
8479
IF @retval <> 0 OR @@ERROR <> 0 GOTO error
8580

8681
-- we already know that mapped columns do map, so we can safely convert to the canoncial remote name here
87-
SELECT lc.column_id, ISNULL(rc.quotedName, lc.quotedName) AS quotedName
82+
SELECT lc.column_id, ISNULL(rc.quoted_name, lc.quoted_name) AS quoted_name
8883
FROM @our_columns lc
89-
LEFT OUTER JOIN #column_mapping m
90-
ON lc.quotedName = m.quotedName
84+
LEFT OUTER JOIN @column_mapping m
85+
ON lc.quoted_name = m.quoted_name
9186
LEFT OUTER JOIN @their_columns rc
92-
ON m.rename = rc.quotedName
87+
ON m.quoted_rename = rc.quoted_name
9388
END
9489

9590
RETURN 0

0 commit comments

Comments
 (0)