Nikolay Izhikov created IGNITE-8516:
---------------------------------------

             Summary: Not null constraint doesn't checked
                 Key: IGNITE-8516
                 URL: https://issues.apache.org/jira/browse/IGNITE-8516
             Project: Ignite
          Issue Type: Bug
          Components: sql
    Affects Versions: 2.4
            Reporter: Nikolay Izhikov
             Fix For: 2.6


User are able to insert null into the not null column through cache-api.

Reproducer:
{code:java}
package org.apache.ignite.internal.processors.sql;

public class IgniteNotNullBug extends GridCommonAbstractTest {
    @Override protected void beforeTestsStarted() throws Exception {
        startGrid(0);

        Set<String> nn = new HashSet<>();
        nn.add("address");

        jcache(grid(0), cacheConfiguration(new 
QueryEntity(Organization.class.getName(), Address.class.getName())
            .addQueryField("address", "java.lang.String", "address")
            .setNotNullFields(nn)), "ORG_ADDRESS");
    }

    public void testPutNullField() throws Exception {
        Map<Organization, Address> entries = new HashMap<>();

        entries.put(new Organization("1"), new Address(null));
        //entries.put(new Organization("2"), new Address("Some address"));

        IgniteCache<Organization, Address> cache = jcache(0, "ORG_ADDRESS");

        cache.putAll(entries);

        System.out.println("cache.getConfiguration(CacheConfiguration) = " + 
cache.getConfiguration(CacheConfiguration.class).getQueryEntities());

        List<?> objects = execSql("SELECT address FROM ORG_ADDRESS.ADDRESS");
        
        assert ((List)objects.get(0)).get(0) == null;
    }

    protected CacheConfiguration cacheConfiguration(QueryEntity qryEntity) {
        CacheConfiguration<?, ?> cache = defaultCacheConfiguration();

        cache.setCacheMode(CacheMode.PARTITIONED);
        cache.setAtomicityMode(CacheAtomicityMode.ATOMIC);
        cache.setBackups(1);
        cache.setWriteSynchronizationMode(FULL_SYNC);

        cache.setQueryEntities(Collections.singletonList(qryEntity));

        return cache;
    }

    private List<?> execSql(String sql, Object... args) {
        SqlFieldsQuery qry = new SqlFieldsQuery(sql)
            .setArgs(args);

        return grid(0).context().query().querySqlFields(qry, true).getAll();
    }

    private static class Organization implements Serializable {
        private final String name;
        private Organization(String name) { this.name = name; }
    }

    private static class Address implements Serializable {
        private final String address;
        private Address(String address) { this.address = address; }
    }
}
{code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to