Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 2c3d50f

Browse files
committed
Fix InsertIntoSelect field resolution
1 parent f34f3c0 commit 2c3d50f

File tree

4 files changed

+105
-5
lines changed

4 files changed

+105
-5
lines changed

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -584,12 +584,20 @@ public virtual SelectItem[] GetColumnNames(ModelDefinition modelDef, string tabl
584584
protected virtual bool ShouldSkipInsert(FieldDefinition fieldDef) =>
585585
fieldDef.ShouldSkipInsert();
586586

587+
public virtual string ColumnNameOnly(string columnExpr)
588+
{
589+
var nameOnly = columnExpr.LastRightPart('.');
590+
var ret = nameOnly.StripDbQuotes();
591+
return ret;
592+
}
593+
587594
public virtual FieldDefinition[] GetInsertFieldDefinitions(ModelDefinition modelDef, ICollection<string> insertFields)
588595
{
589-
return insertFields != null
596+
var insertColumns = insertFields?.Map(ColumnNameOnly);
597+
return insertColumns != null
590598
? NamingStrategy.GetType() == typeof(OrmLiteNamingStrategyBase)
591-
? modelDef.GetOrderedFieldDefinitions(insertFields)
592-
: modelDef.GetOrderedFieldDefinitions(insertFields, name => NamingStrategy.GetColumnName(name))
599+
? modelDef.GetOrderedFieldDefinitions(insertColumns)
600+
: modelDef.GetOrderedFieldDefinitions(insertColumns, name => NamingStrategy.GetColumnName(name))
593601
: modelDef.FieldDefinitionsArray;
594602
}
595603

src/ServiceStack.OrmLite/OrmLiteUtils.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,12 @@ public static string StripTablePrefixes(this string selectExpression)
812812

813813
public static char[] QuotedChars = { '"', '`', '[', ']' };
814814

815+
public static string AliasOrColumn(this string quotedExpr)
816+
{
817+
var aliasOrSelectColumn = quotedExpr.LastRightPart(" AS ");
818+
return aliasOrSelectColumn;
819+
}
820+
815821
public static string StripDbQuotes(this string quotedExpr)
816822
{
817823
return quotedExpr.Trim(QuotedChars);

src/ServiceStack.OrmLite/OrmLiteWriteCommandExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -831,7 +831,7 @@ internal static void Insert<T>(this IDbCommand dbCmd, Action<IDbCommand> command
831831

832832
internal static long InsertIntoSelect<T>(this IDbCommand dbCmd, ISqlExpression query, Action<IDbCommand> commandFilter) =>
833833
dbCmd.InsertIntoSelectInternal<T>(query, commandFilter).ExecNonQuery();
834-
834+
835835
internal static IDbCommand InsertIntoSelectInternal<T>(this IDbCommand dbCmd, ISqlExpression query, Action<IDbCommand> commandFilter)
836836
{
837837
var dialectProvider = dbCmd.GetDialectProvider();
@@ -843,7 +843,7 @@ internal static IDbCommand InsertIntoSelectInternal<T>(this IDbCommand dbCmd, IS
843843
.ParseCommands();
844844

845845
var fieldsOrAliases = selectFields
846-
.Map(x => x.Original.ToString().LastRightPart(" AS ").Trim().StripDbQuotes());
846+
.Map(x => x.Original.ToString().AliasOrColumn());
847847

848848
dialectProvider.PrepareParameterizedInsertStatement<T>(dbCmd, insertFields: fieldsOrAliases);
849849

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using System;
2+
using System.Net;
3+
using NUnit.Framework;
4+
using ServiceStack.DataAnnotations;
5+
6+
namespace ServiceStack.OrmLite.Tests.Issues
7+
{
8+
public class InsertIntoSource
9+
{
10+
[AutoIncrement]
11+
public long Id { get; set; }
12+
13+
public string Url { get; set; }
14+
public string Provider { get; set; }
15+
public string DomainKey { get; set; }
16+
public bool NoFollow { get; set; }
17+
public HttpStatusCode HttpStatusCode { get; set; }
18+
public DateTime? LastScanTime { get; set; }
19+
public string Anchors { get; set; }
20+
public int? OutboundLinks { get; set; }
21+
public long TargetDomainRecordId { get; set; }
22+
public long UserAuthCustomId { get; set; }
23+
}
24+
25+
public class InertIntoTarget
26+
{
27+
[PrimaryKey]
28+
public long WatchedUrlRecordId { get; set; }
29+
30+
public string Url { get; set; }
31+
public string DomainKey { get; set; }
32+
public long TargetDomainRecordId { get; set; }
33+
public string TargetDomainKey { get; set; }
34+
public DateTime CreateDate { get; set; } = DateTime.UtcNow;
35+
public int Tries { get; set; }
36+
public DateTime? DeferUntil { get; set; }
37+
public long UserAuthCustomId { get; set; }
38+
public bool FirstScan { get; set; }
39+
}
40+
41+
public class InsertIntoJoin
42+
{
43+
[AutoIncrement]
44+
public long Id { get; set; }
45+
46+
public string Url { get; set; }
47+
public string DomainKey { get; set; }
48+
public DateTime CreateDate { get; set; } = DateTime.Now;
49+
public DateTime? DeleteDate { get; set; }
50+
public bool IsDeleted { get; set; }
51+
public bool Active { get; set; } = true;
52+
public long UserAuthCustomId { get; set; }
53+
}
54+
55+
public class CustomInsertIntoSelectJoinIssue : OrmLiteTestBase
56+
{
57+
[Test]
58+
public void Can_custom_join_into_select()
59+
{
60+
using var db = OpenDbConnection();
61+
62+
db.DropAndCreateTable<InsertIntoSource>();
63+
db.DropAndCreateTable<InsertIntoJoin>();
64+
db.DropAndCreateTable<InertIntoTarget>();
65+
66+
var ids = new[] {1, 2, 3};
67+
// OrmLiteUtils.PrintSql();
68+
69+
var q = db.From<InsertIntoSource>()
70+
.Join<InsertIntoJoin>((w, t) => w.TargetDomainRecordId == t.Id)
71+
.Where(x => Sql.In(x.Id, ids))
72+
.Select<InsertIntoSource, InsertIntoJoin>((w, t) => new {
73+
UserAuthCustomId = w.UserAuthCustomId,
74+
DomainKey = w.DomainKey,
75+
CreateDate = DateTime.UtcNow,
76+
TargetDomainKey = t.DomainKey,
77+
Tries = 0,
78+
TargetDomainRecordId = w.TargetDomainRecordId,
79+
Url = w.Url,
80+
WatchedUrlRecordId = w.Id
81+
});
82+
83+
var inserted = db.InsertIntoSelect<InertIntoTarget>(q, dbCmd => dbCmd.OnConflictIgnore());
84+
}
85+
}
86+
}

0 commit comments

Comments
 (0)