Uploaded image for project: 'Infinispan'
  1. Infinispan
  2. ISPN-16354

Unable to use camelCase table names and columns in cache configuration file

This issue belongs to an archived project. You can view it, but you can't modify it. Learn more

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Done
    • Icon: Major Major
    • 15.1.0.Dev03, 15.0.8.Final
    • None
    • Core
    • None
    • Hide
      1. Navigate to the Server Management Console
      2. Press the Create Cache button to create a cache
      3. Give the cache a name and select the "Add cache configuration" radio button
      4. Using XML, JSON, or YAML format, attempt to add a cache configuration file which has  sql in the queries section (select-all, select-single, etc.) that has camelCase table names and column names.
      5. Example:  
        "select-all": "select * from sde.\"ProductPlan\";" 

         

      1. You can also try doing this programmatically through the CacheConfigurationBuilder 
      Show
      Navigate to the Server Management Console Press the Create Cache button to create a cache Give the cache a name and select the "Add cache configuration" radio button Using XML, JSON, or YAML format, attempt to add a cache configuration file which has  sql in the queries section (select-all, select-single, etc.) that has camelCase table names and column names. Example:   "select-all" : "select * from sde.\" ProductPlan\ ";"   You can also try doing this programmatically through the CacheConfigurationBuilder 

      I have a remote cache that uses an xml file to define the config properties for a persistent replicated cache. For the persistence component I am using <query-jdbc-store>. The database I am trying to connect to is a Postgres database with camelCase table names. Because the tables and columns are camelCase, the sql that is used for the <queries> section of the config file (like select-single, select-all, size, etc.) needs to use double quotes in the sql syntax. For example: 'SELECT plan."systemAccount", plan."yearMonth" FROM sde."ProductPlan"'; 

      Currently, Infinispan is unable to parse these double quotes even if the parameter value is enclosed in a single quote. Example: `"select-all": 'select c."systemAccount"...`

      This is the error that I get from the Infinispan server (you get this using xml, json, or yaml file formats for the config since these are all converted to xml on runtime): 

      Caused by: org.infinispan.commons.CacheListenerException: ISPN000280: Caught exception [org.infinispan.commons.configuration.io.xml.XmlPullParserException] while invoking method [public java.util.concurrent.CompletionStage org.infinispan.globalstate.impl.GlobalConfigurationStateListener.handleCreate(org.infinispan.notifications.cachelistener.event.CacheEntryCreatedEvent)] on listener instance: org.infinispan.globalstate.impl.GlobalConfigurationStateListener@4b3206df
              at org.infinispan.notifications.impl.AbstractListenerImpl$ListenerInvocationImpl.lambda$invoke$1(AbstractListenerImpl.java:437)
              at org.infinispan.notifications.impl.AbstractListenerImpl$ListenerInvocationImpl.invoke(AbstractListenerImpl.java:457)
              at org.infinispan.notifications.cachelistener.CacheNotifierImpl$BaseCacheEntryListenerInvocation.doRealInvocation(CacheNotifierImpl.java:1793)
              at org.infinispan.notifications.cachelistener.CacheNotifierImpl$BaseCacheEntryListenerInvocation.doRealInvocation(CacheNotifierImpl.java:1789)
              at org.infinispan.notifications.cachelistener.CacheNotifierImpl$BaseCacheEntryListenerInvocation.invokeNoChecks(CacheNotifierImpl.java:1784)
              at org.infinispan.notifications.cachelistener.CacheNotifierImpl$BaseCacheEntryListenerInvocation.invoke(CacheNotifierImpl.java:1757)
              at org.infinispan.notifications.cachelistener.CacheNotifierImpl.doNotifyCreated(CacheNotifierImpl.java:428)
              at org.infinispan.notifications.cachelistener.CacheNotifierImpl.notifyCacheEntryCreated(CacheNotifierImpl.java:410)
              at org.infinispan.notifications.cachelistener.NotifyHelper.entryCommitted(NotifyHelper.java:63)
              at org.infinispan.interceptors.locking.ClusteringDependentLogic$ReplicationLogic.commitSingleEntry(ClusteringDependentLogic.java:505)
              at org.infinispan.interceptors.locking.ClusteringDependentLogic$AbstractClusteringDependentLogic.commitEntry(ClusteringDependentLogic.java:239)
              at org.infinispan.interceptors.impl.EntryWrappingInterceptor.commitContextEntry(EntryWrappingInterceptor.java:611)
              at org.infinispan.interceptors.impl.EntryWrappingInterceptor.commitEntryIfNeeded(EntryWrappingInterceptor.java:884)
              at org.infinispan.interceptors.impl.EntryWrappingInterceptor.commitContextEntries(EntryWrappingInterceptor.java:591)
              at org.infinispan.interceptors.impl.EntryWrappingInterceptor.applyChanges(EntryWrappingInterceptor.java:685)
              at org.infinispan.interceptors.impl.EntryWrappingInterceptor.applyAndFixVersion(EntryWrappingInterceptor.java:737)
              at org.infinispan.interceptors.SyncInvocationStage.thenApply(SyncInvocationStage.java:44)
              at org.infinispan.interceptors.impl.EntryWrappingInterceptor.setSkipRemoteGetsAndInvokeNextForDataCommand(EntryWrappingInterceptor.java:732)
              at org.infinispan.interceptors.impl.EntryWrappingInterceptor.visitPutKeyValueCommand(EntryWrappingInterceptor.java:335)
              at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:65)
              at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndFinally(BaseAsyncInterceptor.java:154)
              at org.infinispan.interceptors.locking.AbstractLockingInterceptor.lambda$nonTxLockAndInvokeNext$3(AbstractLockingInterceptor.java:318)
              at org.infinispan.interceptors.SyncInvocationStage.andHandle(SyncInvocationStage.java:69)
              at org.infinispan.interceptors.locking.AbstractLockingInterceptor.nonTxLockAndInvokeNext(AbstractLockingInterceptor.java:313)
              at org.infinispan.interceptors.locking.AbstractLockingInterceptor.visitNonTxDataWriteCommand(AbstractLockingInterceptor.java:138)
              at org.infinispan.interceptors.locking.NonTransactionalLockingInterceptor.visitDataWriteCommand(NonTransactionalLockingInterceptor.java:41)
              at org.infinispan.interceptors.locking.AbstractLockingInterceptor.visitPutKeyValueCommand(AbstractLockingInterceptor.java:82)
              at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:65)
              at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndHandle(BaseAsyncInterceptor.java:187)
              at org.infinispan.statetransfer.StateTransferInterceptor.handleNonTxWriteCommand(StateTransferInterceptor.java:312)
              at org.infinispan.statetransfer.StateTransferInterceptor.handleWriteCommand(StateTransferInterceptor.java:256)
              at org.infinispan.statetransfer.StateTransferInterceptor.visitPutKeyValueCommand(StateTransferInterceptor.java:96)
              at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:65)
              at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:58)
              at org.infinispan.interceptors.impl.CacheMgmtInterceptor.updateStoreStatistics(CacheMgmtInterceptor.java:233)
              at org.infinispan.interceptors.impl.CacheMgmtInterceptor.visitPutKeyValueCommand(CacheMgmtInterceptor.java:196)
              at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:65)
              at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNext(BaseAsyncInterceptor.java:58)
              at org.infinispan.interceptors.DDAsyncInterceptor.handleDefault(DDAsyncInterceptor.java:54)
              at org.infinispan.interceptors.DDAsyncInterceptor.visitPutKeyValueCommand(DDAsyncInterceptor.java:60)
              at org.infinispan.commands.write.PutKeyValueCommand.acceptVisitor(PutKeyValueCommand.java:65)
              at org.infinispan.interceptors.BaseAsyncInterceptor.invokeNextAndExceptionally(BaseAsyncInterceptor.java:127)
              at org.infinispan.interceptors.impl.InvocationContextInterceptor.visitCommand(InvocationContextInterceptor.java:90)
              at org.infinispan.interceptors.impl.AsyncInterceptorChainImpl.invokeAsync(AsyncInterceptorChainImpl.java:211)
              at org.infinispan.cache.impl.InvocationHelper.doInvokeAsync(InvocationHelper.java:318)
              at org.infinispan.cache.impl.InvocationHelper.invokeAsync(InvocationHelper.java:156)
              at org.infinispan.cache.impl.InvocationHelper.invokeAsync(InvocationHelper.java:139)
              at org.infinispan.cache.impl.CacheImpl.putIfAbsentAsync(CacheImpl.java:1490)
              at org.infinispan.cache.impl.CacheImpl.putIfAbsentAsync(CacheImpl.java:1483)
              at org.infinispan.cache.impl.CacheImpl.putIfAbsentAsync(CacheImpl.java:454)
              at org.infinispan.cache.impl.AbstractDelegatingCache.putIfAbsentAsync(AbstractDelegatingCache.java:211)
              at org.infinispan.cache.impl.AbstractDelegatingCache.putIfAbsentAsync(AbstractDelegatingCache.java:211)
              at org.infinispan.cache.impl.EncoderCache.putIfAbsentAsync(EncoderCache.java:298)
              at org.infinispan.security.impl.SecureCacheImpl.putIfAbsentAsync(SecureCacheImpl.java:281)
              at org.infinispan.globalstate.impl.GlobalConfigurationManagerImpl.createCacheInternal(GlobalConfigurationManagerImpl.java:293)
              at org.infinispan.globalstate.impl.GlobalConfigurationManagerImpl.createCache(GlobalConfigurationManagerImpl.java:274)
              at org.infinispan.globalstate.impl.GlobalConfigurationManagerImpl.getOrCreateCache(GlobalConfigurationManagerImpl.java:238)
              ... 13 more
      Caused by: org.infinispan.commons.configuration.io.xml.XmlPullParserException: expected = after attribute name (position: END_TAG seen ...ect-single="select pl.id as idProviderLimits, c."systemAccount"... @1:707) 
              at org.infinispan.commons.configuration.io.xml.MXParser.parseAttribute(MXParser.java:1756)
              at org.infinispan.commons.configuration.io.xml.MXParser.parseStartTag(MXParser.java:1551)
              at org.infinispan.commons.configuration.io.xml.MXParser.nextImpl(MXParser.java:1029)
              at org.infinispan.commons.configuration.io.xml.MXParser.next(MXParser.java:907)
              at org.infinispan.commons.configuration.io.xml.XmlConfigurationReader.hasNext(XmlConfigurationReader.java:90)
              at org.infinispan.commons.configuration.io.ConfigurationReader.inTag(ConfigurationReader.java:152)
              at org.infinispan.persistence.sql.configuration.SqlStoreConfigurationParser.parseQueryJdbcStore(SqlStoreConfigurationParser.java:85)
              at org.infinispan.persistence.sql.configuration.SqlStoreConfigurationParser.readElement(SqlStoreConfigurationParser.java:38)
              at org.infinispan.configuration.parsing.ParserRegistry.parseElement(ParserRegistry.java:212)
              at org.infinispan.configuration.parsing.ConfigurationBuilderHolder.handleAnyElement(ConfigurationBuilderHolder.java:150)
              at org.infinispan.commons.configuration.io.AbstractConfigurationReader.handleAny(AbstractConfigurationReader.java:66)
              at org.infinispan.configuration.parsing.CacheParser.parsePersistence(CacheParser.java:936)
              at org.infinispan.configuration.parsing.CacheParser.parseCacheElement(CacheParser.java:353)
              at org.infinispan.configuration.parsing.CacheParser.parseSharedStateCacheElement(CacheParser.java:203)
              at org.infinispan.configuration.parsing.CacheParser.parseReplicatedCache(CacheParser.java:779)
              at org.infinispan.configuration.parsing.CacheParser.readElement(CacheParser.java:112)
              at org.infinispan.configuration.parsing.ParserRegistry.parseElement(ParserRegistry.java:212)
              at org.infinispan.configuration.parsing.ParserRegistry.parse(ParserRegistry.java:195)
              at org.infinispan.globalstate.impl.GlobalConfigurationManagerImpl.buildConfiguration(GlobalConfigurationManagerImpl.java:338)
              at org.infinispan.globalstate.impl.GlobalConfigurationManagerImpl.createCacheLocally(GlobalConfigurationManagerImpl.java:310)
              at org.infinispan.globalstate.impl.GlobalConfigurationStateListener.handleCreate(GlobalConfigurationStateListener.java:46)
              at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
              at java.base/java.lang.reflect.Method.invoke(Method.java:580)
              at org.infinispan.notifications.impl.AbstractListenerImpl$ListenerInvocationImpl.lambda$invoke$1(AbstractListenerImpl.java:431)
              ... 69 more

      Chat history: https://infinispan.zulipchat.com/#narrow/stream/118645-infinispan/topic/How.20to.20escape.20double.20quotes.20in.20xml.20config.20file

              ttarrant@redhat.com Tristan Tarrant
              eli.lawrence Eli Lawrence (Inactive)
              Archiver:
              rhn-support-adongare Amol Dongare

                Created:
                Updated:
                Resolved:
                Archived: