Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Implement the Substring method for LINQ using the 'substr' core SQL function. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
52085afe231b9e3e07d6319fcfca46fe |
User & Date: | mistachkin 2015-05-30 21:38:48.939 |
Context
2015-05-30
| ||
22:45 | Update SQLite core library to the latest trunk code. check-in: b994e3c790 user: mistachkin tags: trunk | |
21:38 | Implement the Substring method for LINQ using the 'substr' core SQL function. check-in: 52085afe23 user: mistachkin tags: trunk | |
21:37 | Bump all version numbers to 1.0.98.0. Update version history docs. check-in: ff1cdfc19c user: mistachkin tags: trunk | |
Changes
Changes to System.Data.SQLite.Linq/SQL Generation/SqlGenerator.cs.
︙ | ︙ | |||
347 348 349 350 351 352 353 354 355 356 357 358 359 360 | functionHandlers.Add("NewGuid", HandleCanonicalFunctionNewGuid); functionHandlers.Add("Round", HandleCanonicalFunctionRound); functionHandlers.Add("ToLower", HandleCanonicalFunctionToLower); functionHandlers.Add("ToUpper", HandleCanonicalFunctionToUpper); functionHandlers.Add("Trim", HandleCanonicalFunctionTrim); functionHandlers.Add("Left", HandleCanonicalFunctionLeft); functionHandlers.Add("Right", HandleCanonicalFunctionRight); functionHandlers.Add("CurrentDateTime", HandleGetDateFunction); functionHandlers.Add("CurrentUtcDateTime", HandleGetUtcDateFunction); //DatePartFunctions functionHandlers.Add("Year", HandleCanonicalFunctionDatepart); functionHandlers.Add("Month", HandleCanonicalFunctionDatepart); functionHandlers.Add("Day", HandleCanonicalFunctionDatepart); | > | 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 | functionHandlers.Add("NewGuid", HandleCanonicalFunctionNewGuid); functionHandlers.Add("Round", HandleCanonicalFunctionRound); functionHandlers.Add("ToLower", HandleCanonicalFunctionToLower); functionHandlers.Add("ToUpper", HandleCanonicalFunctionToUpper); functionHandlers.Add("Trim", HandleCanonicalFunctionTrim); functionHandlers.Add("Left", HandleCanonicalFunctionLeft); functionHandlers.Add("Right", HandleCanonicalFunctionRight); functionHandlers.Add("Substring", HandleCanonicalFunctionSubstring); functionHandlers.Add("CurrentDateTime", HandleGetDateFunction); functionHandlers.Add("CurrentUtcDateTime", HandleGetUtcDateFunction); //DatePartFunctions functionHandlers.Add("Year", HandleCanonicalFunctionDatepart); functionHandlers.Add("Month", HandleCanonicalFunctionDatepart); functionHandlers.Add("Day", HandleCanonicalFunctionDatepart); |
︙ | ︙ | |||
3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 | Debug.Assert(e.Arguments.Count == 2, "Right should have two arguments"); result.Append(e.Arguments[0].Accept(sqlgen)); result.Append(", -("); result.Append(e.Arguments[1].Accept(sqlgen)); result.Append("), "); result.Append(e.Arguments[1].Accept(sqlgen)); result.Append(")"); return result; } /// <summary> /// Function rename ToLower -> LOWER | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 | Debug.Assert(e.Arguments.Count == 2, "Right should have two arguments"); result.Append(e.Arguments[0].Accept(sqlgen)); result.Append(", -("); result.Append(e.Arguments[1].Accept(sqlgen)); result.Append("), "); result.Append(e.Arguments[1].Accept(sqlgen)); result.Append(")"); return result; } /// <summary> /// SUBSTRING(string, start) -> SUBSTR(string, start) /// SUBSTRING(string, start, length) -> SUBSTR(string, start, length) /// </summary> /// <param name="sqlgen"></param> /// <param name="e"></param> /// <returns></returns> private static ISqlFragment HandleCanonicalFunctionSubstring(SqlGenerator sqlgen, DbFunctionExpression e) { SqlBuilder result = new SqlBuilder(); result.Append("SUBSTR("); Debug.Assert(e.Arguments.Count == 2 || e.Arguments.Count == 3, "Substring should have two or three arguments"); result.Append(e.Arguments[0].Accept(sqlgen)); result.Append(", "); result.Append(e.Arguments[1].Accept(sqlgen)); if (e.Arguments.Count == 3) { result.Append(", "); result.Append(e.Arguments[2].Accept(sqlgen)); } result.Append(")"); return result; } /// <summary> /// Function rename ToLower -> LOWER |
︙ | ︙ |
Changes to Tests/basic.eagle.
︙ | ︙ | |||
3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 | System.Data.SQLite} -result {{DetectTextAffinity, DetectStringType}\ {DetectTextAffinity, DetectStringType}}} ############################################################################### rename restoreSQLiteConnectionEnvironment "" rename saveSQLiteConnectionEnvironment "" ############################################################################### reportSQLiteResources $test_channel ############################################################################### | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 | System.Data.SQLite} -result {{DetectTextAffinity, DetectStringType}\ {DetectTextAffinity, DetectStringType}}} ############################################################################### rename restoreSQLiteConnectionEnvironment "" rename saveSQLiteConnectionEnvironment "" ############################################################################### runTest {test data-1.70 {LINQ w/String.Substring Method} -body { # # NOTE: Re-copy the reference database file used for this unit test to the # build directory in case it has been changed by a previous test run. # file copy -force $northwindEfDbFile \ [file join [getBuildDirectory] [file tail $northwindEfDbFile]] set result [list] set output "" set code [catch { testClrExec $testLinqExeFile [list -eventflags Wait -directory \ [file dirname $testLinqExeFile] -nocarriagereturns -stdout output \ -success 0] -substring } error] tlog "---- BEGIN STDOUT OUTPUT\n" tlog $output tlog "\n---- END STDOUT OUTPUT\n" lappend result $code if {$code == 0} then { lappend result [string trim $output] } else { lappend result [string trim $error] } set result } -cleanup { unset -nocomplain code output error result } -constraints {eagle monoToDo SQLite file_System.Data.SQLite.dll testExec\ file_System.Data.SQLite.Linq.dll file_testlinq.exe file_northwindEF.db} \ -result {0 {True True True True True True True True True True True True True\ True True True True True True True True True True True True True True True True\ True True True True True True True True True True True True True True True True\ True True True True True True True True True True True True True True True True\ True True True True True True True True True True True True True True True True\ True True True True True True True True True True True True True True}}} ############################################################################### reportSQLiteResources $test_channel ############################################################################### |
︙ | ︙ |
Changes to testlinq/Program.cs.
︙ | ︙ | |||
86 87 88 89 90 91 92 93 94 95 96 97 98 99 | if (arg != null) pageSize = int.Parse(arg.Trim()); } return SkipTest(pageSize); } case "unionall": { return UnionAllTest(); } case "endswith": { string value = null; | > > > > | 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | if (arg != null) pageSize = int.Parse(arg.Trim()); } return SkipTest(pageSize); } case "substring": { return SubStringTest(); } case "unionall": { return UnionAllTest(); } case "endswith": { string value = null; |
︙ | ︙ | |||
226 227 228 229 230 231 232 233 234 235 236 237 238 239 | // NOTE: If the field is not found, just return null. // if (fieldInfo == null) return null; return fieldInfo.GetValue(entityConnection) as DbConnection; } // // NOTE: Used to test the fix for ticket [8b7d179c3c]. // private static int SkipTest(int pageSize) { using (northwindEFEntities db = new northwindEFEntities()) | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 | // NOTE: If the field is not found, just return null. // if (fieldInfo == null) return null; return fieldInfo.GetValue(entityConnection) as DbConnection; } // // NOTE: Used to verify that the SUBSTR function is used to // implement the Substring method. // private static int SubStringTest() { using (northwindEFEntities db = new northwindEFEntities()) { try { bool once = false; var query = db.Customers.Select( p => "test".Substring(1) != null); foreach (var result in query) { if (once) Console.Write(' '); Console.Write(result); once = true; } return 0; } catch (Exception e) { Console.WriteLine(e); } } return 1; } // // NOTE: Used to test the fix for ticket [8b7d179c3c]. // private static int SkipTest(int pageSize) { using (northwindEFEntities db = new northwindEFEntities()) |
︙ | ︙ |