Skip to content

Commit b0c8830

Browse files
committed
Initial pass at using QUOTENAME/PARSENAME and the correct lengths to hold quoted names everywhere
1 parent 42c0668 commit b0c8830

36 files changed

+180
-161
lines changed

SqlDataComparison.proj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<PackageId>MightyOrm.SqlDataComparison</PackageId>
5-
<Version>1.0.3</Version>
5+
<Version>1.2.0-alpha1</Version>
66
<OutputPath>build\</OutputPath>
77
<OutputInstall>Install.sql</OutputInstall>
88
<OutputInstallMaster>InstallMaster.sql</OutputInstallMaster>

src/core/SqlDataComparison.sql

Lines changed: 39 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ SET QUOTED_IDENTIFIER ON
44
GO
55
/*[[LICENSE]]*/
66
CREATE PROCEDURE [core].[SqlDataComparison]
7-
@ourTableName sysname,
8-
@theirTableName sysname,
9-
@defaultDbName sysname = null,
7+
@ourTableName internals.FourPartQuotedName, -- 4 part name, all parts quoted, worst case length
8+
@theirTableName internals.FourPartQuotedName,
9+
@default_db_name sysname = null,
1010
@map nvarchar(max) = null,
1111
@join nvarchar(max) = null,
1212
@use nvarchar(max) = null,
@@ -54,12 +54,12 @@ BEGIN
5454
DECLARE @our_database sysname
5555
DECLARE @our_schema sysname
5656
DECLARE @our_table sysname
57-
DECLARE @our_database_part sysname
58-
DECLARE @our_full_table_name sysname
57+
DECLARE @our_database_part internals.QuotedServerPlusTableName
58+
DECLARE @our_full_table_name internals.FourPartQuotedName
5959

6060
EXEC @retval = internals.ValidateQualifiedTableName
6161
@qualified_table_name = @ourTableName,
62-
@defaultDbName = @defaultDbName,
62+
@default_db_name = @default_db_name,
6363
@server = @our_server OUTPUT,
6464
@database = @our_database OUTPUT,
6565
@schema = @our_schema OUTPUT,
@@ -87,8 +87,8 @@ BEGIN
8787
DECLARE @their_database sysname
8888
DECLARE @their_schema sysname
8989
DECLARE @their_table sysname
90-
DECLARE @their_database_part sysname
91-
DECLARE @their_full_table_name sysname
90+
DECLARE @their_database_part internals.QuotedServerPlusTableName
91+
DECLARE @their_full_table_name internals.FourPartQuotedName
9292

9393
-- do not apply default database name to theirs (it becomes more confusing than helpful when user sends db.table instead of db..table by mistake)
9494
EXEC @retval = internals.ValidateQualifiedTableName
@@ -118,7 +118,7 @@ BEGIN
118118
*/
119119
DECLARE @our_columns internals.ColumnsTable
120120

121-
INSERT INTO @our_columns (column_id, name)
121+
INSERT INTO @our_columns (column_id, quotedName)
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, name)
135+
INSERT INTO @use_columns (column_id, quotedName)
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, name)
148+
INSERT INTO @their_columns (column_id, quotedName)
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, name)
163+
INSERT INTO @mapped_columns (column_id, quotedName)
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, name)
194+
INSERT INTO @key_columns (column_id, quotedName)
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, name)
207+
INSERT INTO @key_columns (column_id, quotedName)
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.name + '] = [theirs].[' + m.name + ']' + @CRLF,
247+
@join_sql = @join_sql + CASE WHEN @i = 0 THEN 'ON' ELSE 'AND' END + ' [ours].' + kc.quotedName + ' = [theirs].' + m.quotedName + '' + @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, name)
268+
INSERT INTO @identity_columns (column_id, quotedName)
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, name)
274+
INSERT INTO @identity_columns (column_id, quotedName)
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.name ELSE m.name END + '],' + @CRLF
303+
SELECT @sql = @sql + @TAB + CASE WHEN @import > 0 THEN uc.quotedName ELSE m.quotedName 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.name ELSE uc.name END + '],' + @CRLF
314+
SELECT @sql = @sql + @TAB + '%2.' + CASE WHEN @import > 0 THEN m.quotedName ELSE uc.quotedName 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.name ELSE m.name END + '] IS NULL' + @CRLF,
333+
'%1.' + CASE WHEN @import > 0 THEN kc.quotedName ELSE m.quotedName 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.name ELSE m.name END + '] IS NOT NULL AND %2.[' + CASE WHEN @import > 0 THEN m.name ELSE kc.name END + '] IS NULL)' + @CRLF,
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,
378378
@i = @i + 1
379379
FROM @key_columns kc
380380
INNER JOIN @mapped_columns m
@@ -406,7 +406,11 @@ BEGIN
406406

407407
SET @i = 0
408408
SELECT
409-
@sql = @sql + @TAB + CASE WHEN @i = 0 THEN 'SET ' ELSE @TAB END + '[' + CASE WHEN @import > 0 THEN uc.name ELSE m.name END + '] = %2.[' + CASE WHEN @import > 0 THEN m.name ELSE uc.name END + '],' + @CRLF,
409+
@sql = @sql +
410+
@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 +
413+
',' + @CRLF,
410414
@i = @i + 1
411415
FROM @use_columns uc
412416
INNER JOIN @mapped_columns m
@@ -429,9 +433,9 @@ BEGIN
429433
SELECT
430434
@sql = @sql +
431435
CASE WHEN @i = 0 THEN ' ' ELSE ' OR ' END +
432-
'([ours].[' + uc.name + '] IS NULL AND [theirs].[' + m.name + '] IS NOT NULL)' + @CRLF +
433-
' OR ([ours].[' + uc.name + '] IS NOT NULL AND [theirs].[' + m.name + '] IS NULL)' + @CRLF +
434-
' OR [ours].[' + uc.name + '] <> [theirs].[' + m.name + ']' + @CRLF,
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,
435439
@i = @i + 1
436440
FROM @use_columns uc
437441
INNER JOIN @mapped_columns m
@@ -470,22 +474,22 @@ BEGIN
470474
IF @interleave = 1
471475
BEGIN
472476
SELECT @sql = @sql +
473-
@TAB + ' [ours].[' + u.name + '] AS [<<< ' + u.name + '],' + @CRLF +
474-
@TAB + ' [theirs].[' + m.name + '] AS [>>> ' + m.name + '],' + @CRLF
475-
FROM @use_columns u
477+
@TAB + ' [ours].' + uc.quotedName + ' AS [<<< ' + uc.quotedName + '],' + @CRLF +
478+
@TAB + ' [theirs].' + m.quotedName + ' AS [>>> ' + m.quotedName + '],' + @CRLF
479+
FROM @use_columns uc
476480
INNER JOIN @mapped_columns m
477481
ON u.column_id = m.column_id
478482
END
479483
ELSE
480484
BEGIN
481485
SET @sql = @sql + '''OURS <<<'' AS [ ],' + @CRLF
482486

483-
SELECT @sql = @sql + @TAB + ' [ours].[' + name + '],' + @CRLF
487+
SELECT @sql = @sql + @TAB + ' [ours].' + quotedName + ',' + @CRLF
484488
FROM @our_columns
485489

486490
SET @sql = @sql + @TAB + ' ''THEIRS >>>'' AS [ ],' + @CRLF
487491

488-
SELECT @sql = @sql + @TAB + ' [theirs].[' + name + '],' + @CRLF
492+
SELECT @sql = @sql + @TAB + ' [theirs].' + quotedName + ',' + @CRLF
489493
FROM @their_columns
490494
END
491495

@@ -503,18 +507,18 @@ BEGIN
503507
SELECT
504508
@sql = @sql +
505509
CASE WHEN @i = 0 THEN ' ' ELSE ' OR ' END +
506-
'([ours].[' + kc.name + '] IS NULL AND [theirs].[' + m.name + '] IS NOT NULL)' + @CRLF +
507-
' OR ([ours].[' + kc.name + '] IS NOT NULL AND [theirs].[' + m.name + '] IS NULL)' + @CRLF,
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,
508512
@i = @i + 1
509513
FROM @key_columns kc
510514
INNER JOIN @mapped_columns m
511515
ON kc.column_id = m.column_id
512516

513517
SELECT
514518
@sql = @sql +
515-
' OR ([ours].[' + uc.name + '] IS NULL AND [theirs].[' + m.name + '] IS NOT NULL)' + @CRLF +
516-
' OR ([ours].[' + uc.name + '] IS NOT NULL AND [theirs].[' + m.name + '] IS NULL)' + @CRLF +
517-
' OR [ours].[' + uc.name + '] <> [theirs].[' + m.name + ']' + @CRLF
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
518522
FROM @use_columns uc
519523
INNER JOIN @mapped_columns m
520524
ON uc.column_id = m.column_id

src/internals/CheckTheirColumnsExist.sql

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ CREATE PROCEDURE [internals].[CheckTheirColumnsExist]
77
@use_columns internals.ColumnsTable READONLY,
88
@mapped_columns internals.ColumnsTable READONLY,
99
@their_columns internals.ColumnsTable READONLY,
10-
@their_full_table_name SYSNAME
10+
@their_full_table_name internals.FourPartQuotedName
1111
AS
1212
BEGIN
1313
SET NOCOUNT ON;
@@ -17,15 +17,15 @@ BEGIN
1717

1818
DECLARE @mapped_use_columns internals.ColumnsTable
1919

20-
INSERT INTO @mapped_use_columns (name)
21-
SELECT m.name
22-
FROM @use_columns u
20+
INSERT INTO @mapped_use_columns (quotedName)
21+
SELECT m.quotedName
22+
FROM @use_columns uc
2323
INNER JOIN @mapped_columns m
24-
ON u.column_id = m.column_id
24+
ON uc.column_id = m.column_id
2525

2626
EXEC @retval = internals.ValidateColumns
2727
@mapped_use_columns, @their_columns,
28-
'[', ']', -- use [] to quote these names, as we know they exist locally
28+
'', '', -- don't 'air-quote' the names in the warning in this case, as we know they exist locally
2929
'Required column %s does not exist in %s',
3030
'Required columns %s do not exist in %s',
3131
@their_full_table_name

src/internals/GetColumns.sql

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ SET QUOTED_IDENTIFIER ON
44
GO
55
/*[[LICENSE]]*/
66
CREATE PROCEDURE [internals].[GetColumns]
7-
@database_part SYSNAME,
7+
@database_part internals.QuotedServerPlusTableName,
88
@schema SYSNAME,
99
@table SYSNAME,
10-
@full_table_name SYSNAME
10+
@full_table_name internals.FourPartQuotedName
1111
AS
1212
BEGIN
1313
SET NOCOUNT ON;
@@ -30,7 +30,7 @@ BEGIN
3030
'@schema sysname,' + @CRLF +
3131
'@table sysname'
3232
SET @sql =
33-
'SELECT c.column_id, c.name' + @CRLF +
33+
'SELECT c.column_id, QUOTENAME(c.name) as quotedName' + @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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ SET QUOTED_IDENTIFIER ON
44
GO
55
/*[[LICENSE]]*/
66
CREATE PROCEDURE [internals].[GetIdentityColumns]
7-
@database_part SYSNAME,
7+
@database_part internals.QuotedServerPlusTableName,
88
@schema SYSNAME,
99
@table SYSNAME
1010
AS
@@ -22,7 +22,7 @@ BEGIN
2222
'@schema sysname,' + @CRLF +
2323
'@table sysname'
2424
SET @sql =
25-
'SELECT c.column_id, c.name' + @CRLF +
25+
'SELECT c.column_id, QUOTENAME(c.name) AS quotedName' + @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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ SET QUOTED_IDENTIFIER ON
44
GO
55
/*[[LICENSE]]*/
66
CREATE PROCEDURE [internals].[GetPrimaryKeyColumns]
7-
@database_part SYSNAME,
7+
@database_part internals.QuotedServerPlusTableName,
88
@schema SYSNAME,
99
@table SYSNAME
1010
AS
@@ -22,7 +22,7 @@ BEGIN
2222
'@schema sysname,' + @CRLF +
2323
'@table sysname'
2424
SET @sql =
25-
'SELECT c.column_id, c.name' + @CRLF +
25+
'SELECT c.column_id, QUOTENAME(c.name) as quotedName' + @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: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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].' + QUOTENAME(kc.name) + 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.quotedName + 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].' + QUOTENAME(m.name) + 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.quotedName + 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
@@ -92,9 +92,9 @@ BEGIN
9292
SELECT @idsWhere =
9393
@idsWhere +
9494
CASE WHEN @i = 0 THEN '' ELSE ' OR ' END +
95-
'[ours].' + QUOTENAME(kc.name) + ' = ' + CAST(i.id AS NVARCHAR(MAX)) +
95+
'[ours].' + kc.quotedName + ' = ' + CAST(i.id AS NVARCHAR(MAX)) +
9696
' OR ' +
97-
'[theirs].' + QUOTENAME(m.name) + ' = ' + CAST(i.id AS NVARCHAR(MAX)),
97+
'[theirs].' + m.quotedName + ' = ' + 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: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ GO
66
CREATE PROCEDURE [internals].[ProcessJoinParam]
77
@join NVARCHAR(MAX),
88
@use_columns internals.ColumnsTable READONLY,
9-
@our_full_table_name SYSNAME
9+
@our_full_table_name internals.FourPartQuotedName
1010
AS
1111
BEGIN
1212
SET NOCOUNT ON;
@@ -20,8 +20,8 @@ BEGIN
2020

2121
DECLARE @join_columns internals.ColumnsTable
2222

23-
INSERT INTO @join_columns (name)
24-
SELECT name FROM internals.SplitColumnNames(@join)
23+
INSERT INTO @join_columns (quotedName)
24+
SELECT QUOTENAME(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 c.column_id, c.name
43-
FROM @use_columns c
42+
SELECT uc.column_id, uc.quotedName
43+
FROM @use_columns uc
4444
INNER JOIN @join_columns jc
45-
ON c.name = jc.name
45+
ON uc.quotedName = jc.quotedName
4646

4747
RETURN 0
4848

0 commit comments

Comments
 (0)