Commit Graph

333 Commits (00c79ae5415ea4871b890159beebe1469a0dd18a)

Author SHA1 Message Date
Christopher Jolly 0bfa24998f
Fix string methods related to LastOrDefault and Contains (#175)
* Fix string methods related to LastOrDefault and Contains
2 years ago
Christopher Jolly dbe3bf7e89 The DELETE statement in Jet doesn't take the TOP clause like SQL server. Limit the valid select expressions to those that do not use TOP. EF Core will then rewrite it into a WHERE EXISTS clause to use in the DELETE. Valid select expressions are able to be used directly in the DELETE/UPDATE 2 years ago
Christopher Jolly 2f69290f44 Generate proper SQL for UPDATE and DELETE when we have multiple tables, select expression, joins 2 years ago
Christopher Jolly 21b07705ce Return empty list for state indices when having parsed an empty string 2 years ago
Christopher Jolly 559cdc6d3c Some updates to the migration/update sql. Main change is if we are doing an INSERT, if there is no values to be read back we don't have to follow it up with a 'SELECT @@ROWCOUNT' 2 years ago
Christopher Jolly c73f4a3013 Add the onDelete convention so that we match the behaviour of sql server when configuring self-referencing skip navigations. Ends up configured as ClientCascade instead of Cascade 2 years ago
Christopher Jolly 6fe74929cf Remove tag lines/comments from the sql to be executed 2 years ago
Christopher Jolly 4bdd001eda Add the default warning config in. Some of the defaults set warnings to throw instead of Log 2 years ago
Christopher Jolly caeb6db77b
Lift subqueries from the ORDER BY clause into their own projection (#173)
* Lift scalar subqueries out of order by and into a projection

* Add back in missed verifier for skip without order by in split query

* [GitHub Actions] Update green tests.

* Scalar expressions within a function or case expression, within the ORDER BY also need to be lifted

* [GitHub Actions] Update green tests.

---------

Co-authored-by: github-actions <github-actions@github.com>
2 years ago
Christopher Jolly 7caea4dcdb
Provide a valid count argument to LEFT,RIGHT,MID (#172)
* Coalesce the result of LEN on a string to 0 when within a LEFT/RIGHT/MID function as it cannot take NULL for the count of characters
2 years ago
Christopher Jolly d9f2c8eb2c
Interception tests (#171)
* Allow unconfigured dataaccessproviderfactory and null connection string

* [GitHub Actions] Update green tests.

---------
2 years ago
Christopher Jolly b389b88705
Further built in types fixes (#170) 2 years ago
Christopher Jolly 6ccebae028
Db model factory updates (#166) 2 years ago
Laurents Meyer a95017e38b
Auto skip statements that are not supported by Jet. Track unsupported statements in log files. (#169) 2 years ago
Christopher Jolly e70f682c0c
Fix BuiltInDataTypes tests (#163)
* Update the BuiltInDataTypes set of tests

* Update JetTypeMappingSource.cs

Add back `alphanumeric` as its line somehow got deleted

* Add Element Type Mapping check back in
2 years ago
Laurents Meyer 2e23e60dad Remove duplicate string entry. 2 years ago
Christopher Jolly fcb97a4e63
Improve support for primitive collections and Json Types (#159) 2 years ago
Laurents Meyer d32eae0867
Update project in regards to new organization and CI. (#160) 2 years ago
Laurents Meyer 9babf78263
Revert "Type MApping: a long gets mapped to integer in Jet" (#151)
This reverts commit 05b10ea856.
2 years ago
Christopher Jolly 0d5676a4e5
Merge pull request #158 from ChrisJollyAU/fixdecint64param
Fix using decimal and Int64 in parameters
2 years ago
Christopher Jolly d359492662 Use reflection so we don't have to reference Odbc or OleDb in main package 2 years ago
Christopher Jolly 8c64a29730 Fix using decimal and Int64 in parameters 2 years ago
Laurents Meyer 43d0002123 Fix automatic test skipping. 2 years ago
Laurents Meyer ca8472c96e Fix ExecuteNonQuery() return value logic to be case sensitivity proof. 2 years ago
Christopher Jolly b4c07a382c Merge branch 'master' of https://github.com/bubibubi/EntityFrameworkCore.Jet 2 years ago
Christopher Jolly 67f98ee8ac More test updates 2 years ago
Laurents Meyer 7bc7ee3708
Revert pull-in of GearsOfWar related classes and remove constraint (#145)
* Revert pull-in of GearsOfWar related classes.

* Clean-up GearsOfWar fixtures.

* Drop constraint to workaround Jet limitation regarding compound foreign keys and NULL.

* Fix SQL assertions.

* Revert "Add code to add a "MatchSimple" annotation to a foreign key", because it doesn't do anything at the moment.

This reverts commit 76408338e0.
2 years ago
Christopher Jolly 0ddfe1ce3b Update to .Net 8 RC2 2 years ago
Christopher Jolly 331da3810e Forgot the case of the parameter having NullTypeMapping. In that case go with adding the conversion 2 years ago
Christopher Jolly 6f31403f13 Merge branch 'master' of https://github.com/bubibubi/EntityFrameworkCore.Jet 2 years ago
Christopher Jolly a16569f65b Add some further testbases 2 years ago
Christopher Jolly ed50bb0dfa Only add the date conversion if the type mapping is also a datetime 2 years ago
Laurents Meyer f086526d02
Fix and update dependencies and project files. (#144) 2 years ago
Christopher Jolly 01775d1b2f Implement Degrees to Radians and Radians to Degrees by first principal as there is no inbulilt function. Thankfully it is not a difficult calculation 2 years ago
Christopher Jolly bb90784c11 If we can get a numeric out of the ComputedColumnSql string then we know it is a numeric constant. We can transfer that to DefaultValue in this case 2 years ago
Christopher Jolly a6d9058c05 Some date and time updates
- Don't derive Timespan and DateTimeOffset type mapping from our JetDateTimeTypeMapping. We can derive from the normal base class for those types
- DateTimeOffset is now mapped to a string. This allows us to round-trip all the details, however any calculations or queries for any components do not work
2 years ago
Christopher Jolly 0d4f61e3fd The dateAdd function can not take null for the amount to add. Coalesce to 0 2 years ago
Christopher Jolly 80973bb3c8 When generating the SELECT, to select the values of the newly inserted row we only are able to use the first key column with @@identity 2 years ago
Christopher Jolly 08718b8165 Convert a null constant in a projection to a variant. We only do this if the type is meant to be a numeric. This is because NULL on its own has some issues when unioning with int values. Some joins with this issue were fixed in an earlier commit 2 years ago
Christopher Jolly 4fc2cb55b7 Extract column expression from UnaryExpression as well 2 years ago
Christopher Jolly ab3449349f No need to wrap an expression in a CaseExpression (generating IIF...) if the expression we are meant to be checking is a non-null constant expression 2 years ago
Christopher Jolly c1d263aedc Initial support for DateOnly/TimeOnly 2 years ago
Christopher Jolly ba913012ce The default value for DateTime in Jet is 30/12/1899 . When we save if we get a 1/1/001 we translate to this value. When reading we need to do the reverse translation 2 years ago
Christopher Jolly 76408338e0 Add code to add a "MatchSimple" annotation to a foreign key 2 years ago
Christopher Jolly 5b591b73fd UNIONing projection with a numeric column to another projection that specifically projects NULL the the same name as a numeric field, the JOINING that to another table can leave that numeric field as another data type (NULL is not a numeric data type). Hence when using that supposedly numeric field in the join predicat against another numeric field we get a data type mismatch.
We try to detect this and when visiting the column (but only if we are within a binary expression and not a projection) we quickly wrap it in a convert function to make it properly numeric

The top/outer projection of this field can still be in a non numeric format, but JetDataReader is able to handle that. Would be better to produce the correctly converted data output anyway
2 years ago
Christopher Jolly cae7f8372b Add Check_all_tests_overridden to more test classes and ensure that it passes 2 years ago
Christopher Jolly 3191ca6851 Fix some conversion errors when getting a numeric value. See detailed notes in the GetInt32 function 2 years ago
Christopher Jolly a594e2f81f DISTINCT AND TOP can't be in the same stateement with Jet. Push DISTINCT into a subquery 2 years ago
Christopher Jolly 2281916b88 Fix generating sets (union, intersect). The code was originally executing and returning before it could handle adding the SQL for the Alias in (including wrapping the section in brackets). This realigns with how the parent VisitSelect works 2 years ago
Christopher Jolly a2dc62d12d Fix the formatting for a string literal of a byte 2 years ago
Christopher Jolly 1090ee3b8f Make sure the start index for Instr is set. Normally is optional but it seems some sections seem to prefer it to be defined 2 years ago
Christopher Jolly 34f124c0f8 Update to .Net 8 2 years ago
Christopher Jolly db7a513b64 Remove the DeepSkip tag on FirstOrDefault. When generating the sql it was preventing the TOP expression from being generated 2 years ago
Christopher Jolly fbf0f794a7 use .GetMAppStoreObjects to try get the correct table (this is especially needed for properties in split tables). Default to the original storeObject if can't find anything 2 years ago
Christopher Jolly 2dbd0fde32 Rewrite some INNER JOIN's. According to the docs Jet doesn't support an INNER JOIN being nested under a LEFT JOIN. We try to figure out which one's they are and rewrite it. As an INNER JOIN is a join where both sides have a value, we can rewrite it as a LEFT JOIN and then filter out the rows where the columns the join is on is not NULL 2 years ago
Christopher Jolly c46f980c09 Start work on some support for sequence value generation. Still under investigation if possible 2 years ago
Christopher Jolly 944843bfad Some datetime parameters don't work unless they have been properly converted 2 years ago
Christopher Jolly 3ef1503bb9 Translate the Atan2 function 3 years ago
Christopher Jolly 5e32650f6d Dispose of any new JetCommands created when splitting commands properly. This were not being disposed of and still holding a link to the database thereby preventing some file access e.g. Deleting a file 3 years ago
Christopher Jolly 3f5c1b6005 Make sure a DateTime in a constant has a DateTime Type Mapping 3 years ago
Christopher Jolly 429c67ca3a Some skip...take optimization and fix using multiple take after a skip 3 years ago
Christopher Jolly 8c9dff5d36 Initial support for Skip....Take. Take...Skip and Skip currently do not work properly 3 years ago
Christopher Jolly fd57f4a3bd Rename some extension methods so that it doesn't interfere with other providers (namely sql server) 3 years ago
Christopher Jolly fd6c2aec01 Revert ca0feb49 . Same name extensions when using sql server and jet 3 years ago
Christopher Jolly 84e40f5085 Fix some string resources 3 years ago
Cédric Luthi cbb3f94440 Remove unnecessary references in `EntityFrameworkCore.Jet.Data`
Now that `EntityFrameworkCore.Jet.Data` targets `net6.0` those references are not required anymore.

Note that the `Microsoft.Win32.Registry` package reference was the root cause of the failure to publish the `EntityFrameworkCore.Jet.Data` 7.0.0 package because of [warning NU5104][1] (treated as error):
> A stable release of a package should not have a prerelease dependency. Either modify the version spec of dependency "Microsoft.Win32.Registry [6.0.0-preview.5.21301.5, )" or update the version field in the nuspec.

[1]: https://bubibubi.visualstudio.com/EntityFrameworkCore.Jet/_build/results?buildId=280&view=logs&j=67ea8d94-b5a7-504b-2d4b-07baddfad3f1&t=1e07b7f6-b7a1-55f6-9cca-c04683790a41&l=37
3 years ago
Christopher Jolly a9c2f36da5 Jet conversion functions like Cdbl/Csng/CLng don't accept or propogate null values. Normally we can just use an IIF to check if the expression is null or not. That does work fine but here we also check if the base expression is nullable. If the base expression will never return null we can simplify and just use the base expression rather than test for null 3 years ago
Christopher Jolly 6963a165e5 The result of the Round function is never null 3 years ago
Christopher Jolly c8e109fb94 Jet can't candle a left join straight after a cross join. We have to push the cross join specifically down into its own subquery and then do a left join on that 3 years ago
Cédric Luthi 83c29e4c43 Introduce a new typed JetConnectionStringBuilder
This makes it easier to use than the extensions (EntityFrameworkCore.Jet.Data.DbConnectionStringBuilderExtensions) with Get/Set methods.

With the new `JetConnectionStringBuilder` class:

```csharp
var csb = new JetConnectionStringBuilder(DataAccessProviderType.OleDb)
{
    Provider = "Microsoft.ACE.OLEDB.12.0",
    DataSource = @"C:\myFolder\myAccessFile.accdb",
    DatabasePassword = "hunter2",
};
var connectionString = csb.ConnectionString;
```

Without the new `JetConnectionStringBuilder` class:

```csharp
var csb = new OleDbConnectionStringBuilder();
csb.SetProvider("Microsoft.ACE.OLEDB.12.0");
csb.SetDataSource(@"C:\myFolder\myAccessFile.accdb");
csb.SetDatabasePassword("hunter2");
var connectionString = csb.ConnectionString;
```
3 years ago
Cédric Luthi c795ce6228 Make EntityFrameworkCore.Jet available on `net6.0`
By using `[SupportedOSPlatform("windows")]` at assembly level instead of targeting `net6.0-windows`.

This will enable taking a dependency on the EntityFrameworkCore.Jet* NuGet packages on Linux and macOS. The consumer of EntityFrameworkCore.Jet can then decide how to handle [CA1416][1] either by adding `[SupportedOSPlatform("windows")]`, by targeting `net6.0-windows` or by testing `OperatingSystem.IsWindows()` at runtime.

[1]: https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1416
3 years ago
Christopher Jolly 12aca42198 Add option to use the normal short text type when mapping against an unbounded System.String instead of long text/memo. Jet has limitations when using memo (e.g. joins are not supported) 3 years ago
Christopher Jolly 950089a113 Set the precision to be maximum of 28 (Jet limit).
When using property.HasConversion<decimal>() the default for EF Core is with precision 38 and scale 17 which is passed Jet's limit
3 years ago
Christopher Jolly acc3fd5223 Revert "Set the precision to be maximum of 28 (Jet limit)."
This reverts commit a1904bf113.
3 years ago
Christopher Jolly a1904bf113 Set the precision to be maximum of 28 (Jet limit).
When using property.HasConversion<decimal>() the default for EF Core is with precision 38 and scale 17 which is passed Jet's limit
3 years ago
Christopher Jolly dc049d804d Do the same clr type check when mapping "text" as what we do for other store type mappings. This allows conversions do work better (e.g. originally a mappingInfo with a System.Char type was passed in with store type of "text" and a variable length or unbounded string type was returned but with clr type of System.String. Going with the extra checked returns null and gets EF Core to find a converter and then do the mapping again on the converted type 3 years ago
Christopher Jolly ee54f1fac0 Use MidB/InstrB for the byte versions. (still doesnt produce correct results yet) 3 years ago
Christopher Jolly ee30910fa9 Update the ValueGeneratorSelector to current ef core style. Don't rely on sequential guid's as Jet doesn't order them properly (treats them as string as sorts them numerically/alphabetically) 3 years ago
Christopher Jolly 0eb8baefa9 Add a clause/filter to the index to ignore nulls 3 years ago
Christopher Jolly 306585af13 When dealing with convert, if we don't have a specific conversion function, try just send the original operand and let Jet work with the types. Seems to be fairly lenient 3 years ago
Christopher Jolly 6cb1748237 Remove sbyte from clr mappings. Not needed as EF Core will use automatic conversions for those types. EF Core SQL Server behaves the same 3 years ago
Christopher Jolly 9489bc4564 Jet seems to output bytes only as an array. so a single byte becomes a byte[1] array. Return the first byte of that array in this instance 3 years ago
Christopher Jolly 3b0bc7d5ad Fix the GetValueGenerated function. Was not being called and as such for an identity the ValueGenerated.OnAdd was not being set 3 years ago
Christopher Jolly 78f3dbae15 Use our own Byte type mapping for generating the correct string literal 3 years ago
Christopher Jolly bc5b51fa4a Fix check against typeof JetBoolTypeMapping. For the tests Everything is Bytes/Strings all type mappings are the same which makes the check not behave correctly 3 years ago
Christopher Jolly f15d60aaab Fix escaping wild chars. Use the correct form to escape. Also the LIKE clause does nt have an ESCAPE clause to set the escape char so set that to null 3 years ago
Christopher Jolly 73ef68188f Ordering of boolean: Rather order by the NOT expression rather than change the ascending or descending order. NULL values are handled in the correct order now
Division: If the result of the binary is meant to be integer, use the Jet binary divide operatior '\'
3 years ago
Christopher Jolly 87aa0dbe93 Fix incorrect check for whether ordering expression is boolean typeexpression if it is a boolean type. 3 years ago
Christopher Jolly 03579d380c Add a JetGuidTypeMapping class. We need to override the template for the SQL literal. Jet uses the format with th curly braces at the beginning and end. Default (and same as sql server) is the format without curly braces 3 years ago
Christopher Jolly d7033125be Properly read a TimeSpan value from the database.
Add member translator for timespan so SQL works
3 years ago
Christopher Jolly 096a0955e2 Add JetQueryableMethodTranslatingExpressionVisitorFactory if needed to override anything from it 3 years ago
Christopher Jolly e01686d4b5 MID doesn't allow a null value for the length parameter. Add a IIF wrapper around it if that argument is marked as nullable.
Added here instead of stringmethodtranslator as we need the nullability optimizations on the sqlfunctionexpression. When wrapped in a caseexpression we get some different optimizations. Produces the correct result on the test case but is different to SQL Server. This way we keep it closer to SQL Server
3 years ago
Christopher Jolly 9355ddb293 LEN propagates nullability 3 years ago
Christopher Jolly a11ca0198d Add SqlTranslatingExpressionVisitor:
- Handles array index of byte[] (currently not working)
- Returns a not translated if we have arithmetic between dates/times. See Projection_containing_DateTime_subtraction in NorthwindSelectQueryJetTest
3 years ago
Christopher Jolly 2b0f468421 Fix conversion translator: only need to translate Convert.To... functions. Was trying to convert other tostring methods and was picking the methods that required an argument which was typically the tostring functions with arguments of the format string or the format provider 3 years ago
Christopher Jolly a2db5066e1 The object tostring translator was doing it on the server. It needs to be handled on the client to get the actual name of the enum rather than its int value
Also handles the boolean special cases
3 years ago
Christopher Jolly b107b2235d SqlExpressionSimplifyingExpressionVisitor simplifies nested coalesce calls into the form of COALESCE(arg1,arg2,...argn)
Jet doesn't have any equivalent so unroll into nest iif calls
3 years ago
Christopher Jolly 3e376ff106 Fix byte array stuff 3 years ago
Christopher Jolly ccef0d4f49 Add Math functions to translate Floor and Ceiling 3 years ago
Christopher Jolly 458197e582 Pass the current dataaccessproviderfactory type to CreateDatabase. Preference will take place using this type before going to the default in case it can't find the type via the connection string.
Fixes #135 and #122
3 years ago