mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 01:05:27 +08:00 
			
		
		
		
	- 完善 DuckDB 测试;
This commit is contained in:
		@@ -703,6 +703,7 @@ ManyToMany 级联删除中间表(注意不删除外部根)
 | 
			
		||||
                        case DataType.CustomPostgreSQL:
 | 
			
		||||
                        case DataType.KingbaseES:
 | 
			
		||||
                        case DataType.ShenTong:
 | 
			
		||||
                        case DataType.DuckDB:
 | 
			
		||||
                        case DataType.Firebird: //firebird 只支持单条插入 returning
 | 
			
		||||
                            if (_tableIdentitys.Length == 1 && _tableReturnColumns.Length == 1)
 | 
			
		||||
                            {
 | 
			
		||||
@@ -758,6 +759,7 @@ ManyToMany 级联删除中间表(注意不删除外部根)
 | 
			
		||||
                        case DataType.CustomPostgreSQL:
 | 
			
		||||
                        case DataType.KingbaseES:
 | 
			
		||||
                        case DataType.ShenTong:
 | 
			
		||||
                        case DataType.DuckDB:
 | 
			
		||||
                            var rets = OrmInsert(table).AppendData(data).ExecuteInserted();
 | 
			
		||||
                            _cascadeAffrows += rets.Count;
 | 
			
		||||
                            if (rets.Count != data.Count()) throw new Exception($"特别错误:批量添加失败,{_orm.Ado.DataType} 的返回数据,与添加的数目不匹配");
 | 
			
		||||
@@ -810,6 +812,7 @@ ManyToMany 级联删除中间表(注意不删除外部根)
 | 
			
		||||
                        case DataType.CustomPostgreSQL:
 | 
			
		||||
                        case DataType.KingbaseES:
 | 
			
		||||
                        case DataType.ShenTong:
 | 
			
		||||
                        case DataType.DuckDB:
 | 
			
		||||
                        case DataType.ClickHouse:
 | 
			
		||||
                            return true;
 | 
			
		||||
                        default:
 | 
			
		||||
 
 | 
			
		||||
@@ -344,6 +344,7 @@ namespace FreeSql
 | 
			
		||||
                    case DataType.CustomPostgreSQL:
 | 
			
		||||
                    case DataType.KingbaseES:
 | 
			
		||||
                    case DataType.ShenTong:
 | 
			
		||||
                    case DataType.DuckDB:
 | 
			
		||||
                    case DataType.ClickHouse:
 | 
			
		||||
                        return true;
 | 
			
		||||
                    default:
 | 
			
		||||
 
 | 
			
		||||
@@ -47,6 +47,7 @@ namespace FreeSql
 | 
			
		||||
                    case DataType.CustomPostgreSQL:
 | 
			
		||||
                    case DataType.KingbaseES:
 | 
			
		||||
                    case DataType.ShenTong:
 | 
			
		||||
                    case DataType.DuckDB:
 | 
			
		||||
                    case DataType.Firebird: //firebird 只支持单条插入 returning
 | 
			
		||||
                        if (_tableIdentitys.Length == 1 && _tableReturnColumns.Length == 1)
 | 
			
		||||
                        {
 | 
			
		||||
@@ -115,6 +116,7 @@ namespace FreeSql
 | 
			
		||||
                    case DataType.CustomPostgreSQL:
 | 
			
		||||
                    case DataType.KingbaseES:
 | 
			
		||||
                    case DataType.ShenTong:
 | 
			
		||||
                    case DataType.DuckDB:
 | 
			
		||||
                        await DbContextFlushCommandAsync(cancellationToken);
 | 
			
		||||
                        var rets = await this.OrmInsert(data).ExecuteInsertedAsync(cancellationToken);
 | 
			
		||||
                        if (rets.Count != data.Count()) throw new Exception(DbContextStrings.SpecialError_BatchAdditionFailed(_db.OrmOriginal.Ado.DataType));
 | 
			
		||||
 
 | 
			
		||||
@@ -46,6 +46,7 @@ namespace FreeSql
 | 
			
		||||
                    case DataType.CustomPostgreSQL:
 | 
			
		||||
                    case DataType.KingbaseES:
 | 
			
		||||
                    case DataType.ShenTong:
 | 
			
		||||
                    case DataType.DuckDB:
 | 
			
		||||
                    case DataType.Firebird: //firebird 只支持单条插入 returning
 | 
			
		||||
                        if (_tableIdentitys.Length == 1 && _tableReturnColumns.Length == 1)
 | 
			
		||||
                        {
 | 
			
		||||
@@ -118,6 +119,7 @@ namespace FreeSql
 | 
			
		||||
                    case DataType.CustomPostgreSQL:
 | 
			
		||||
                    case DataType.KingbaseES:
 | 
			
		||||
                    case DataType.ShenTong:
 | 
			
		||||
                    case DataType.DuckDB:
 | 
			
		||||
                        DbContextFlushCommand();
 | 
			
		||||
                        var rets = this.OrmInsert(data).ExecuteInserted();
 | 
			
		||||
                        if (rets.Count != data.Count()) throw new Exception(DbContextStrings.SpecialError_BatchAdditionFailed(_db.OrmOriginal.Ado.DataType));
 | 
			
		||||
 
 | 
			
		||||
@@ -1117,14 +1117,14 @@ FROM ""tb_topic"" a", subquery);
 | 
			
		||||
            var subquery = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
 | 
			
		||||
            Assert.Equal(@"SELECT a.""id"", a.""clicks"", a.""typeguid"", a.""title"", a.""createtime"" 
 | 
			
		||||
FROM ""tb_topic"" a 
 | 
			
		||||
WHERE (((cast(a.""id"" as text)) in (SELECT b.""title"" 
 | 
			
		||||
WHERE ((((a.""id"")::text) in (SELECT b.""title"" 
 | 
			
		||||
    FROM ""tb_topic"" b)))", subquery);
 | 
			
		||||
            var subqueryList = select.Where(a => select.As("b").ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
 | 
			
		||||
 | 
			
		||||
            subquery = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToSql();
 | 
			
		||||
            Assert.Equal(@"SELECT a.""id"", a.""clicks"", a.""typeguid"", a.""title"", a.""createtime"" 
 | 
			
		||||
FROM ""tb_topic"" a 
 | 
			
		||||
WHERE (((cast(a.""id"" as text)) in (SELECT b.""title"" 
 | 
			
		||||
WHERE ((((a.""id"")::text) in (SELECT b.""title"" 
 | 
			
		||||
    FROM ""tb_topic"" b 
 | 
			
		||||
    limit 10)))", subquery);
 | 
			
		||||
            subqueryList = select.Where(a => select.As("b").Limit(10).ToList(b => b.Title).Contains(a.Id.ToString())).ToList();
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@ using System.Collections.Generic;
 | 
			
		||||
using System.Collections.ObjectModel;
 | 
			
		||||
using System.Data;
 | 
			
		||||
using System.Data.Common;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Linq;
 | 
			
		||||
using System.Linq.Expressions;
 | 
			
		||||
using System.Numerics;
 | 
			
		||||
@@ -394,7 +395,7 @@ namespace FreeSql.Internal
 | 
			
		||||
					case DataType.CustomPostgreSQL:
 | 
			
		||||
					case DataType.KingbaseES:
 | 
			
		||||
					case DataType.ShenTong:
 | 
			
		||||
						if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}";
 | 
			
		||||
                        if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}";
 | 
			
		||||
						else colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m =>
 | 
			
		||||
							replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value);
 | 
			
		||||
						break;
 | 
			
		||||
@@ -416,7 +417,8 @@ namespace FreeSql.Internal
 | 
			
		||||
							replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value);
 | 
			
		||||
						break;
 | 
			
		||||
					case DataType.Sqlite:
 | 
			
		||||
						if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}";
 | 
			
		||||
                    case DataType.DuckDB:
 | 
			
		||||
                        if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}";
 | 
			
		||||
						else colattr.DbType = Regex.Replace(colattr.DbType, charPattern, m =>
 | 
			
		||||
							replaceCounter++ == 0 ? $"{m.Groups[1].Value}({strlen})" : m.Groups[0].Value);
 | 
			
		||||
						break;
 | 
			
		||||
@@ -477,7 +479,8 @@ namespace FreeSql.Internal
 | 
			
		||||
						colattr.DbType = $"BLOB{strNotNull}";
 | 
			
		||||
						break;
 | 
			
		||||
					case DataType.Sqlite:
 | 
			
		||||
						colattr.DbType = $"BLOB{strNotNull}";
 | 
			
		||||
                    case DataType.DuckDB:
 | 
			
		||||
                        colattr.DbType = $"BLOB{strNotNull}";
 | 
			
		||||
						break;
 | 
			
		||||
					case DataType.MsAccess:
 | 
			
		||||
						if (strlen < 0) colattr.DbType = $"BLOB{strNotNull}";
 | 
			
		||||
@@ -2137,7 +2140,12 @@ namespace FreeSql.Internal
 | 
			
		||||
        {
 | 
			
		||||
            if (obj == null) return null;
 | 
			
		||||
            if (obj is bool || obj is bool?) return (bool)obj == true ? "1" : "0";
 | 
			
		||||
            return string.Concat(obj);
 | 
			
		||||
            return string.Format(CultureInfo.InvariantCulture, "{0}", obj);
 | 
			
		||||
        }
 | 
			
		||||
        public static bool ValueIsEnumAndTargetIsNumber(object value, Type targetType)
 | 
			
		||||
        {
 | 
			
		||||
            if (value == null || targetType == null) return false;
 | 
			
		||||
            return value.GetType().IsEnum && targetType.IsNumberType();
 | 
			
		||||
        }
 | 
			
		||||
        public static byte[] GuidToBytes(Guid guid)
 | 
			
		||||
        {
 | 
			
		||||
@@ -2207,6 +2215,7 @@ namespace FreeSql.Internal
 | 
			
		||||
        static MethodInfo MethodDateTimeTryParse = typeof(DateTime).GetMethod("TryParse", new[] { typeof(string), typeof(DateTime).MakeByRefType() });
 | 
			
		||||
        static MethodInfo MethodDateTimeOffsetTryParse = typeof(DateTimeOffset).GetMethod("TryParse", new[] { typeof(string), typeof(DateTimeOffset).MakeByRefType() });
 | 
			
		||||
        static MethodInfo MethodToString = typeof(Utils).GetMethod("ToStringConcat", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(object) }, null);
 | 
			
		||||
        static MethodInfo MethodValueIsEnumAndTargetIsNumber = typeof(Utils).GetMethod("ValueIsEnumAndTargetIsNumber", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(object), typeof(Type) }, null);
 | 
			
		||||
        static MethodInfo MethodBigIntegerParse = typeof(Utils).GetMethod("ToBigInteger", BindingFlags.Public | BindingFlags.Static, null, new[] { typeof(string) }, null);
 | 
			
		||||
        static PropertyInfo PropertyDateTimeOffsetDateTime = typeof(DateTimeOffset).GetProperty("DateTime", BindingFlags.Instance | BindingFlags.Public);
 | 
			
		||||
        static PropertyInfo PropertyDateTimeTicks = typeof(DateTime).GetProperty("Ticks", BindingFlags.Instance | BindingFlags.Public);
 | 
			
		||||
@@ -2555,8 +2564,12 @@ namespace FreeSql.Internal
 | 
			
		||||
                            Expression.Constant(typeof(DateTime)), Expression.Constant(typeof(DateTimeOffset))
 | 
			
		||||
                        )
 | 
			
		||||
                    );
 | 
			
		||||
                    // BigInteger/bool -> int
 | 
			
		||||
                    //defaultRetExp = Expression.Return(returnTarget, Expression.Call(MethodGetDataReaderValue, Expression.Constant(type), Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(object))));
 | 
			
		||||
                    //BigInteger/bool/Enum -> int
 | 
			
		||||
                    defaultRetExp = Expression.IfThenElse(
 | 
			
		||||
                        Expression.Call(MethodValueIsEnumAndTargetIsNumber, valueExp, Expression.Constant(type)),
 | 
			
		||||
                        defaultRetExp,
 | 
			
		||||
                        Expression.Return(returnTarget, Expression.Call(MethodGetDataReaderValue, Expression.Constant(type), Expression.Convert(Expression.Call(MethodToString, valueExp), typeof(object))))
 | 
			
		||||
                    );
 | 
			
		||||
                }
 | 
			
		||||
                else if (tryparseBooleanExp != null)
 | 
			
		||||
                    switchExp = Expression.Switch(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user