[
https://issues.apache.org/jira/browse/CASSANDRA-18322?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17871151#comment-17871151
]
Stefan Miklosovic commented on CASSANDRA-18322:
-----------------------------------------------
[~ifesdjeen] [~blerer]
Imagine we process a batch statement
[here|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/cql3/QueryProcessor.java#L455-L457]
When we do not use fully qualified table, then isFullyQualified returns false
[here|https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java#L627-L634].
Then, we go to do
{code}
qualifiedStatement.setKeyspace(clientState);
keyspace = qualifiedStatement.keyspace();
{code}
so we set a keyspace from clientState (when there is no keyspace for a
statement in a batch and a user used USE), but then,
qualifiedStatement.keyspace() returns null.
{code}
@Override
public String keyspace()
{
return null;
}
{code}
The result of this logic is that we just lost the information about a keyspace
in a batch. So on one hand, we are setting a keyspace of each statement yet
when we ask what keyspace it is executed on it is null?
How I detected this is that when I run cassandra-dtest with the patch, it
started to fail some tests when I have not specified fully qualified statements
in a batch while it was using USE and it logged an error while the test was not
prepared for such error logging statement. I think we should do something like
this:
{code}
@Override
public String keyspace()
{
if (parsedStatements.isEmpty())
return null;
String currentKeyspace = null;
for (ModificationStatement.Parsed statement : parsedStatements)
{
String keyspace = statement.keyspace();
if (keyspace == null && currentKeyspace != null)
return null;
if (keyspace != null && currentKeyspace == null)
{
currentKeyspace = keyspace;
continue;
}
if (currentKeyspace != null &&
!currentKeyspace.equals(keyspace))
return null;
}
return currentKeyspace;
}
{code}
> Warn about unqualified prepared statement only if it is a select, update,
> delete, insert
> ----------------------------------------------------------------------------------------
>
> Key: CASSANDRA-18322
> URL: https://issues.apache.org/jira/browse/CASSANDRA-18322
> Project: Cassandra
> Issue Type: Improvement
> Components: Messaging/Client
> Reporter: Mohammad Aburadeh
> Assignee: Stefan Miklosovic
> Priority: Normal
> Fix For: 5.x
>
> Time Spent: 0.5h
> Remaining Estimate: 0h
>
> Hi,
> We get the following warnings when we use prepared statements with "create
> keyspace ... " or "drop keyspace" statements.
> "
> {{USE <keyspace>}} with prepared statements is considered to be an
> anti-pattern due to ambiguity in non-qualified table names. Please consider
> removing instances of {{{}Session#setKeyspace(<keyspace>){}}},
> {{Session#execute("USE <keyspace>")}} and {{cluster.newSession(<keyspace>)}}
> from your code, and always use fully qualified table names (e.g.
> <keyspace>.<table>). Keyspace used: null, statement keyspace: null, statement
> id: 8153d922390fdf9a9963bfeda85b2f3b at
> "
> Such statements are already full-qualified. So, why are we getting this
> warning?
> Regards
> Mohammad
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]