[ 
https://issues.apache.org/jira/browse/IGNITE-16806?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Mikhail Petrov updated IGNITE-16806:
------------------------------------
    Release Note: Fixed insertion of values with java LocalDate, LocalTime  and 
LocalDateTime types via SQL.  (was: Fixed insertion of values with java 
LocalDate, LocalTime  and LocalDateTime types in SQL table.)

> Cache put/SQL table insert fails if SQL index created and LocalDateTime is 
> used as value.
> -----------------------------------------------------------------------------------------
>
>                 Key: IGNITE-16806
>                 URL: https://issues.apache.org/jira/browse/IGNITE-16806
>             Project: Ignite
>          Issue Type: Bug
>            Reporter: Mikhail Petrov
>            Assignee: Mikhail Petrov
>            Priority: Major
>              Labels: ise.lts
>             Fix For: 2.14
>
>          Time Spent: 1h
>  Remaining Estimate: 0h
>
> Reproducer:
> {code:java}
> /** */
> public class LocalDateIndexTest extends AbstractIndexingCommonTest {
>     /** */
>     @Test
>     public void test() throws Exception {
>         IgniteEx ignite = startGrids(2);
>         SqlFieldsQuery qry = new SqlFieldsQuery(
>             "CREATE TABLE DATA (STR VARCHAR PRIMARY KEY, LOCDATETIME 
> TIMESTAMP) WITH" +
>                 " \"KEY_TYPE=java.lang.String" +
>                 ", 
> VALUE_TYPE=org.apache.ignite.internal.processors.query.LocalDateIndexTest$Data"
>  +
>                 ", CACHE_NAME=" + DEFAULT_CACHE_NAME + "\"");
>         ignite.context().query().querySqlFields(qry, false).getAll();
>         qry = new SqlFieldsQuery("CREATE INDEX TEST_IDX ON DATA(LOCDATETIME 
> DESC);");
>         ignite.context().query().querySqlFields(qry, false).getAll();
> //        ignite.cache(DEFAULT_CACHE_NAME).put("0", new Data("0", 
> LocalDateTime.MAX));
>         qry = new SqlFieldsQuery("INSERT INTO DATA(_key, str, locDateTime) 
> values(?, ?, ?)").setArgs("0", "0", LocalDateTime.MAX);
>         ignite.context().query().querySqlFields(qry, false).getAll();
>     }
>     public static class Data implements Serializable {
>         /** Serial version UID. */
>         private static final long serialVersionUID = 1L;
>         /** */
>         public String str;
>         /** */
>         public LocalDateTime locDateTime;
>         /** */
>         public Data(String str, LocalDateTime locDateTime) {
>             this.str = str;
>             this.locDateTime = locDateTime;
>         }
>     }
> }
> {code}
> Exception:
> {code:java}
> class org.apache.ignite.internal.processors.query.IgniteSQLException: Type 
> for a column 'LOCDATETIME' is not compatible with index definition. Expected 
> 'Timestamp', actual type 'LocalDateTime'
>       at 
> org.apache.ignite.internal.processors.query.QueryTypeDescriptorImpl.validateIndexes(QueryTypeDescriptorImpl.java:735)
>       at 
> org.apache.ignite.internal.processors.query.QueryTypeDescriptorImpl.validateKeyAndValue(QueryTypeDescriptorImpl.java:606)
>       at 
> org.apache.ignite.internal.processors.query.h2.dml.UpdatePlan.processRow(UpdatePlan.java:295)
>       at 
> org.apache.ignite.internal.processors.query.h2.dml.DmlUtils.dmlDoInsert(DmlUtils.java:212)
>       at 
> org.apache.ignite.internal.processors.query.h2.dml.DmlUtils.processSelectResult(DmlUtils.java:185)
>       at 
> org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.executeUpdateNonTransactional(IgniteH2Indexing.java:2902)
>       at 
> org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.executeUpdate(IgniteH2Indexing.java:2747)
>       at 
> org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.executeUpdateDistributed(IgniteH2Indexing.java:2673)
>       at 
> org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.executeDml(IgniteH2Indexing.java:1263)
>       at 
> org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.querySqlFields(IgniteH2Indexing.java:1185)
>       at 
> org.apache.ignite.internal.processors.query.GridQueryProcessor$2.applyx(GridQueryProcessor.java:3005)
>       at 
> org.apache.ignite.internal.processors.query.GridQueryProcessor$2.applyx(GridQueryProcessor.java:2988)
>       at 
> org.apache.ignite.internal.util.lang.IgniteOutClosureX.apply(IgniteOutClosureX.java:36)
>       at 
> org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:3650)
>       at 
> org.apache.ignite.internal.processors.query.GridQueryProcessor.lambda$querySqlFields$3(GridQueryProcessor.java:3022)
>       at 
> org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuerySafe(GridQueryProcessor.java:3094)
>       at 
> org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:2982)
>       at 
> org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:2909)
>       at 
> org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:2882)
>       at 
> org.apache.ignite.internal.processors.query.LocalDateIndexTest.test(LocalDateIndexTest.java:50)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>       at java.lang.reflect.Method.invoke(Method.java:498)
>       at 
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
>       at 
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
>       at 
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
>       at 
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
>       at 
> org.apache.ignite.testframework.junits.GridAbstractTest$6.run(GridAbstractTest.java:2431)
>       at java.lang.Thread.run(Thread.java:748)
> {code}
> The root cause of this issue:
> During cache insertion (whether through SQL or the cache API), we check that 
> the type of the inserted value matches the type of the table column. The same 
> is done for indexed columns (see QueryTypeDescriptorImpl#validateProps and 
> QueryTypeDescriptorImpl#validateIndexes) As 
> QueryTypeDescriptorImpl#validateProps validation is disabled by default the 
> mentioned above reproducer is not affected by this check. It means that if 
> this check is enabled we could not insert LocalDateTime instance to Timestamp 
> column even indexes are not created.
> H2 determines locDateTime column type as java.sql.Timestamp which does not 
> match with java.time.LocalDateTime class and 
> QueryTypeDescriptorImpl#validateIndexes validation fails.
> The problem also reproduces for DATE and TIME SQL types if LocalDate or 
> LocalTime is used as inserted value.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to