This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 4abf015 Add SQLServer GRANT Statement (#15804)
4abf015 is described below
commit 4abf01539d0759c12de9f028c2dbc3ad90014c24
Author: Thanoshan MV <[email protected]>
AuthorDate: Sat Mar 5 15:03:35 2022 +0530
Add SQLServer GRANT Statement (#15804)
* add initial grammar of SQLServer GRANT statement
* add SQLServer GRANT statement
---
.../main/antlr4/imports/sqlserver/DCLStatement.g4 | 187 ++++++++++++++++-----
.../antlr4/imports/sqlserver/SQLServerKeyword.g4 | 20 +++
.../impl/SQLServerDCLStatementSQLVisitor.java | 57 ++++++-
.../sqlserver/dcl/SQLServerGrantStatement.java | 8 +
.../asserts/segment/column/ColumnAssert.java | 21 +++
.../statement/dcl/impl/GrantStatementAssert.java | 4 +
.../SQLServerGrantStatementAssert.java} | 27 +--
.../statement/dcl/GrantStatementTestCase.java | 4 +
.../src/main/resources/case/dcl/grant.xml | 54 ++++++
.../resources/sql/supported/dcl/grant-user.xml | 31 +++-
10 files changed, 352 insertions(+), 61 deletions(-)
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DCLStatement.g4
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DCLStatement.g4
index 0d25858..2ebb27a52f 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DCLStatement.g4
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/DCLStatement.g4
@@ -20,7 +20,39 @@ grammar DCLStatement;
import BaseRule;
grant
- : GRANT (classPrivilegesClause | classTypePrivilegesClause | roleClause)
+ : GRANT (grantClassPrivilegesClause | grantClassTypePrivilegesClause)
+ ;
+
+grantClassPrivilegesClause
+ : grantClassPrivileges (ON grantOnClassClause)? TO principal (COMMA_
principal)* (WITH GRANT OPTION)? (AS principal)?
+ ;
+
+grantClassTypePrivilegesClause
+ : grantClassTypePrivileges (ON grantOnClassTypeClause)? TO principal
(COMMA_ principal)* (WITH GRANT OPTION)?
+ ;
+
+grantClassPrivileges
+ : privilegeType columnNames? (COMMA_ privilegeType columnNames?)*
+ ;
+
+grantOnClassClause
+ : (classItem COLON_ COLON_)? securable
+ ;
+
+grantClassTypePrivileges
+ : privilegeType (COMMA_ privilegeType)*
+ ;
+
+grantOnClassTypeClause
+ : (grantClassType COLON_ COLON_)? securable
+ ;
+
+securable
+ : (owner DOT_)? name
+ ;
+
+principal
+ : userName
;
revoke
@@ -61,95 +93,151 @@ onClassTypeClause
privilegeType
: ALL PRIVILEGES?
- | basicPermission | objectPermission
+ | assemblyPermission | asymmetricKeyPermission
+ | availabilityGroupPermission | certificatePermission
+ | objectPermission
+ | databasePermission | databasePrincipalPermission
+ | databaseScopedCredentialPermission | endpointPermission
+ | fullTextPermission
+ | schemaPermission | searchPropertyListPermission
| serverPermission | serverPrincipalPermission
- | databasePermission | databasePrincipalPermission | schemaPermission
- | serviceBrokerPermission | endpointPermission
- | certificatePermission | symmetricKeyPermission | asymmetricKeyPermission
- | assemblyPermission | availabilityGroupPermission | fullTextPermission
- ;
-
-basicPermission
- : CONTROL SERVER? | TAKE OWNERSHIP | ALTER | VIEW ANY? DEFINITION |
REFERENCES
- | SELECT | INSERT | UPDATE | DELETE | EXECUTE | RECEIVE
+ | serviceBrokerPermission | symmetricKeyPermission
+ | typePermission | xmlSchemaCollectionPermission
;
objectPermission
- : VIEW CHANGE TRACKING
+ : ALTER | CONTROL | DELETE | EXECUTE | INSERT | RECEIVE | REFERENCES |
SELECT | TAKE OWNERSHIP | UPDATE
+ | VIEW CHANGE TRACKING | VIEW DEFINITION
;
serverPermission
- : ALTER (RESOURCES | SETTINGS | TRACE | SERVER STATE)
+ : ADMINISTER BULK OPERATIONS | ALTER (RESOURCES | SETTINGS | TRACE |
SERVER STATE)
| ALTER ANY (AVAILABILITY GROUP | CONNECTION | CREDENTIAL | DATABASE |
ENDPOINT | EVENT NOTIFICATION | EVENT SESSION | LINKED SERVER | LOGIN | SERVER
AUDIT | SERVER ROLE)
+ | AUTHENTICATE SERVER | CONNECT ANY DATABASE | CONNECT SQL | CONTROL
SERVER | CREATE ANY DATABASE
| CREATE (AVAILABILITY GROUP | DDL EVENT NOTIFICATION | ENDPOINT | SERVER
ROLE | TRACE EVENT NOTIFICATION)
- | CREATE ANY DATABASE
- | VIEW SERVER STATE
- | VIEW ANY (DATABASE | DEFINITION)
- | CONNECT ANY DATABASE | CONNECT SQL
- | IMPERSONATE ANY LOGIN
- | SELECT ALL USER SECURABLES | AUTHENTICATE SERVER | EXTERNAL ACCESS
ASSEMBLY | ADMINISTER BULK OPERATIONS | UNSAFE ASSEMBLY
- | SHUTDOWN
+ | EXTERNAL ACCESS ASSEMBLY | IMPERSONATE ANY LOGIN | SELECT ALL USER
SECURABLES | SHUTDOWN | UNSAFE ASSEMBLY
+ | VIEW ANY (DATABASE | DEFINITION) | VIEW SERVER STATE
;
serverPrincipalPermission
- : IMPERSONATE | ALTER ANY (LOGIN | SERVER ROLE)
+ : CONTROL SERVER? | IMPERSONATE | VIEW ANY? DEFINITION | ALTER | ALTER ANY
(LOGIN | SERVER ROLE)
;
databasePermission
- : ALTER TRACE
- | ALTER ANY (DATABASE (AUDIT | DDL TRIGGER | EVENT NOTIFICATION | EVENT
SESSION | SCOPED CONFIGURATION)? | DATASPACE | SCHEMA
- | SERVICE AUDIT?| USER | APPLICATION? ROLE | CERTIFICATE | CONTRACT |
ASSEMBLY | CONNECTION
- | (SYMMETRIC | ASYMMETRIC | COLUMN ENCRYPTION) KEY | COLUMN MASTER KEY
DEFINITION
- | EXTERNAL (DATA SOURCE | FILE FORMAT | LIBRARY)
- | FULLTEXT CATALOG | MASK | MESSAGE TYPE | REMOTE SERVICE BINDING |
ROUTE | EVENT SESSION | SECURITY POLICY)
- | CREATE (DATABASE | DATABASE DDL EVENT NOTIFICATION | SCHEMA | TABLE |
VIEW | SERVICE | TYPE | DEFAULT | AGGREGATE | ASSEMBLY | (SYMMETRIC |
ASYMMETRIC) KEY
- | CERTIFICATE | CONTRACT | FULLTEXT CATALOG | FUNCTION | MESSAGE TYPE |
PROCEDURE | QUEUE | REMOTE SERVICE BINDING | ROLE | ROUTE | RULE | SYNONYM |
XML SCHEMA COLLECTION)
+ : ADMINISTER DATABASE BULK OPERATIONS | ALTER | ALTER TRACE
+ | ALTER ANY (APPLICATION ROLE | ASSEMBLY | (SYMMETRIC | ASYMMETRIC |
COLUMN ENCRYPTION) KEY | CERTIFICATE
+ | CONNECTION | COLUMN MASTER KEY DEFINITION | CONTRACT
+ | DATABASE (AUDIT | DDL TRIGGER | EVENT NOTIFICATION | EVENT SESSION |
SCOPED CONFIGURATION)?
+ | DATASPACE | EVENT (NOTIFICATION | SESSION) | EXTERNAL (DATA SOURCE |
FILE FORMAT | LIBRARY) | FULLTEXT CATALOG | MASK | MESSAGE TYPE
+ | REMOTE SERVICE BINDING | ROLE | ROUTE | SERVER AUDIT | SCHEMA | SECURITY
POLICY | SERVICE | USER)
+ | AUTHENTICATE SERVER? | BACKUP (DATABASE | LOG) | CHECKPOINT | CONNECT |
CONNECT REPLICATION? | CONTROL SERVER?
+ | CREATE (AGGREGATE | ASSEMBLY | (SYMMETRIC | ASYMMETRIC) KEY |
CERTIFICATE | CONTRACT | DATABASE | DATABASE? DDL EVENT NOTIFICATION
+ | DEFAULT | FULLTEXT CATALOG | FUNCTION | MESSAGE TYPE | PROCEDURE | QUEUE
| REMOTE SERVICE BINDING | ROLE | ROUTE | RULE | SCHEMA
+ | SERVICE | SYNONYM | TABLE | TYPE | VIEW | XML SCHEMA COLLECTION)
+ | DELETE | EXECUTE | EXECUTE ANY? EXTERNAL SCRIPT | INSERT | KILL DATABASE
CONNECTION | REFERENCES | SELECT | SHOWPLAN | SUBSCRIBE QUERY NOTIFICATIONS
+ | TAKE OWNERSHIP | UNMASK | UPDATE
+ | VIEW ANY COLUMN (MASTER | ENCRYPTION) KEY DEFINITION
| CREATE ANY (DATABASE | EXTERNAL LIBRARY)
- | VIEW ((DATABASE | SERVER) STATE | DDL EVENT NOTIFICATION)
- | VIEW ANY (COLUMN (MASTER | ENCRYPTION) KEY DEFINITION | DEFINITION)
- | EXECUTE ANY EXTERNAL SCRIPT | CONNECT REPLICATION? | KILL DATABASE
CONNECTION
- | BACKUP (DATABASE | LOG)
- | AUTHENTICATE SERVER? | SHOWPLAN | SUBSCRIBE QUERY NOTIFICATIONS | UNMASK
| CHECKPOINT | ADMINISTER DATABASE BULK OPERATIONS
+ | VIEW (DATABASE | SERVER) STATE | VIEW ANY? DEFINITION
+ |
;
databasePrincipalPermission
- : IMPERSONATE | ALTER ANY (USER | APPLICATION? ROLE)
+ : databaseUserPermission | databaseRolePermission |
applicationRolePermission
+ ;
+
+databaseUserPermission
+ : CONTROL | IMPERSONATE | ALTER | VIEW DEFINITION | ALTER ANY USER
+ ;
+
+databaseRolePermission
+ : CONTROL | TAKE OWNERSHIP | ALTER | VIEW DEFINITION | ALTER ANY ROLE
+ ;
+
+applicationRolePermission
+ : CONTROL | ALTER | VIEW DEFINITION | ALTER ANY APPLICATION ROLE
+ ;
+
+databaseScopedCredentialPermission
+ : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION
;
schemaPermission
- : ALTER ANY SCHEMA | CREATE SEQUENCE | VIEW CHANGE TRACKING
+ : ALTER | CONTROL | CREATE SEQUENCE | DELETE | EXECUTE | INSERT |
REFERENCES | SELECT | TAKE OWNERSHIP
+ | UPDATE | VIEW CHANGE TRACKING | VIEW DEFINITION | ALTER ANY SCHEMA
+ ;
+
+searchPropertyListPermission
+ : ALTER | CONTROL | REFERENCES | TAKE OWNERSHIP | VIEW DEFINITION | ALTER
ANY FULLTEXT CATALOG
;
serviceBrokerPermission
- : ALTER ANY (CONTRACT | MESSAGE TYPE | REMOTE SERVICE BINDING | ROUTE |
SERVICE)
+ : serviceBrokerContractsPermission | serviceBrokerMessageTypesPermission |
serviceBrokerRemoteServiceBindingsPermission
+ | serviceBrokerRoutesPermission | serviceBrokerServicesPermission
+ ;
+
+serviceBrokerContractsPermission
+ : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION | ALTER
ANY CONTRACT
+ ;
+
+serviceBrokerMessageTypesPermission
+ : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION | ALTER
ANY MESSAGE TYPE
+ ;
+
+serviceBrokerRemoteServiceBindingsPermission
+ : CONTROL | TAKE OWNERSHIP | ALTER | VIEW DEFINITION | ALTER ANY REMOTE
SERVICE BINDING
+ ;
+
+serviceBrokerRoutesPermission
+ : CONTROL | TAKE OWNERSHIP | ALTER | VIEW DEFINITION | ALTER ANY ROUTE
+ ;
+
+serviceBrokerServicesPermission
+ : CONTROL | TAKE OWNERSHIP | SEND | ALTER | VIEW DEFINITION | ALTER ANY
SERVICE
;
endpointPermission
- : ALTER ANY ENDPOINT
+ : ALTER | CONNECT | CONTROL SERVER? | TAKE OWNERSHIP | VIEW ANY?
DEFINITION | ALTER ANY ENDPOINT
;
certificatePermission
- : ALTER ANY CERTIFICATE
+ : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION | ALTER
ANY CERTIFICATE
;
symmetricKeyPermission
- : ALTER ANY SYMMETRIC KEY
+ : ALTER | CONTROL | REFERENCES | TAKE OWNERSHIP | VIEW DEFINITION | ALTER
ANY SYMMETRIC KEY
;
asymmetricKeyPermission
- : ALTER ANY ASYMMETRIC KEY
+ : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION | ALTER
ANY ASYMMETRIC KEY
;
assemblyPermission
- : ALTER ANY ASSEMBLY
+ : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION | ALTER
ANY ASSEMBLY
;
availabilityGroupPermission
- : ALTER ANY AVAILABILITY GROUP | CONNECT
+ : ALTER | CONNECT | CONTROL SERVER? | TAKE OWNERSHIP | VIEW ANY?
DEFINITION | ALTER ANY AVAILABILITY GROUP
;
fullTextPermission
- : ALTER ANY FULLTEXT CATALOG
+ : fullTextCatalogPermission | fullTextStoplistPermission
+ ;
+
+fullTextCatalogPermission
+ : CONTROL | TAKE OWNERSHIP | ALTER | REFERENCES | VIEW DEFINITION | ALTER
ANY FULLTEXT CATALOG
+ ;
+
+fullTextStoplistPermission
+ : ALTER | CONTROL | REFERENCES | TAKE OWNERSHIP | VIEW DEFINITION | ALTER
ANY FULLTEXT CATALOG
+ ;
+
+typePermission
+ : CONTROL | EXECUTE | REFERENCES | TAKE OWNERSHIP | VIEW DEFINITION
+ ;
+
+xmlSchemaCollectionPermission
+ : ALTER | CONTROL | EXECUTE | REFERENCES | TAKE OWNERSHIP | VIEW DEFINITION
;
class_
@@ -160,6 +248,17 @@ classType
: (LOGIN | DATABASE | OBJECT | ROLE | SCHEMA | USER) COLON_ COLON_
;
+classItem
+ : ASSEMBLY | ASYMMETRIC KEY | AVAILABILITY GROUP | CERTIFICATE | USER |
ROLE | APPLICATION ROLE
+ | DATABASE SCOPED CREDENTIAL | ENDPOINT | FULLTEXT (CATALOG | STOPLIST) |
OBJECT | SCHEMA | SEARCH PROPERTY LIST
+ | LOGIN | SERVER ROLE | CONTRACT | MESSAGE TYPE | REMOTE SERVICE BINDING |
ROUTE | SERVICE | SYMMETRIC KEY
+ | SELECT | EXECUTE | TYPE | XML SCHEMA COLLECTION
+ ;
+
+grantClassType
+ : LOGIN | DATABASE | OBJECT | ROLE | SCHEMA | USER
+ ;
+
roleClause
: ignoredIdentifiers
;
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
index 302e0b8..68c8a2e 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/antlr4/imports/sqlserver/SQLServerKeyword.g4
@@ -1790,3 +1790,23 @@ UNCOMMITTED
COMMITTED
: C O M M I T T E D
;
+
+STOPLIST
+ : S T O P L I S T
+ ;
+
+SEARCH
+ : S E A R C H
+ ;
+
+PROPERTY
+ : P R O P E R T Y
+ ;
+
+LIST
+ : L I S T
+ ;
+
+SEND
+ : S E N D
+ ;
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDCLStatementSQLVisitor.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDCLStatementSQLVisitor.java
index af433ed..7b5eb1f 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDCLStatementSQLVisitor.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-dialect/shardingsphere-sql-parser-sqlserver/src/main/java/org/apache/shardingsphere/sql/parser/sqlserver/visitor/statement/impl/SQLServerDCLStatementSQLVisitor.java
@@ -26,6 +26,7 @@ import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Alt
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.AlterUserContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ClassPrivilegesClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ClassTypePrivilegesClauseContext;
+import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.ColumnNamesContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateLoginContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateRoleContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.CreateUserContext;
@@ -35,12 +36,20 @@ import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.Den
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropLoginContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropRoleContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.DropUserContext;
+import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GrantClassPrivilegesClauseContext;
+import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GrantClassTypePrivilegesClauseContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.GrantContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.IgnoredNameIdentifierContext;
+import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.OwnerContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.RevokeContext;
+import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SecurableContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.SetUserContext;
import
org.apache.shardingsphere.sql.parser.autogen.SQLServerStatementParser.UserNameContext;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.OwnerSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.SimpleTableSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.generic.table.TableNameSegment;
+import
org.apache.shardingsphere.sql.parser.sql.common.value.collection.CollectionValue;
import
org.apache.shardingsphere.sql.parser.sql.common.value.identifier.IdentifierValue;
import
org.apache.shardingsphere.sql.parser.sql.common.value.literal.impl.StringLiteralValue;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.segment.UserSegment;
@@ -58,6 +67,7 @@ import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl.
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl.SQLServerRevokeStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl.SQLServerSetUserStatement;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Properties;
@@ -75,13 +85,18 @@ public final class SQLServerDCLStatementSQLVisitor extends
SQLServerStatementSQL
@Override
public ASTNode visitGrant(final GrantContext ctx) {
SQLServerGrantStatement result = new SQLServerGrantStatement();
- if (null != ctx.classPrivilegesClause()) {
- for (SimpleTableSegment each :
getTableFromPrivilegeClause(ctx.classPrivilegesClause())) {
+ if (null != ctx.grantClassPrivilegesClause()) {
+ for (SimpleTableSegment each :
getTableFromGrantPrivilegeClause(ctx.grantClassPrivilegesClause())) {
result.getTables().add(each);
}
+ if (null !=
ctx.grantClassPrivilegesClause().grantClassPrivileges().columnNames()) {
+ for (ColumnNamesContext each :
ctx.grantClassPrivilegesClause().grantClassPrivileges().columnNames()) {
+
result.getColumns().addAll(((CollectionValue<ColumnSegment>)
visit(each)).getValue());
+ }
+ }
}
- if (null != ctx.classTypePrivilegesClause()) {
- for (SimpleTableSegment each :
getTableFromPrivilegeClause(ctx.classTypePrivilegesClause())) {
+ if (null != ctx.grantClassTypePrivilegesClause()) {
+ for (SimpleTableSegment each :
getTableFromGrantPrivilegeClause(ctx.grantClassTypePrivilegesClause())) {
result.getTables().add(each);
}
}
@@ -104,6 +119,40 @@ public final class SQLServerDCLStatementSQLVisitor extends
SQLServerStatementSQL
return result;
}
+ private Collection<SimpleTableSegment>
getTableFromGrantPrivilegeClause(final GrantClassPrivilegesClauseContext ctx) {
+ Collection<SimpleTableSegment> result = new ArrayList<>();
+ if (null != ctx.grantOnClassClause()) {
+ if (null != ctx.grantOnClassClause().classItem() && null !=
ctx.grantOnClassClause().classItem().OBJECT()) {
+ result = Collections.singletonList((SimpleTableSegment)
visit(ctx.grantOnClassClause().securable()));
+ }
+ if (null !=
ctx.grantClassPrivileges().privilegeType().get(0).objectPermission()) {
+ result = Collections.singletonList((SimpleTableSegment)
visit(ctx.grantOnClassClause().securable()));
+ }
+ if (null !=
ctx.grantClassPrivileges().privilegeType().get(0).PRIVILEGES()) {
+ result = Collections.singletonList((SimpleTableSegment)
visit(ctx.grantOnClassClause().securable()));
+ }
+ }
+ return result;
+ }
+
+ private Collection<SimpleTableSegment>
getTableFromGrantPrivilegeClause(final GrantClassTypePrivilegesClauseContext
ctx) {
+ Collection<SimpleTableSegment> result = new ArrayList<>();
+ if (null != ctx.grantOnClassTypeClause() && null !=
ctx.grantOnClassTypeClause().grantClassType() && null !=
ctx.grantOnClassTypeClause().grantClassType().OBJECT()) {
+ result = Collections.singletonList((SimpleTableSegment)
visit(ctx.grantOnClassTypeClause().securable()));
+ }
+ return result;
+ }
+
+ @Override
+ public ASTNode visitSecurable(final SecurableContext ctx) {
+ SimpleTableSegment result = new SimpleTableSegment(new
TableNameSegment(ctx.name().getStart().getStartIndex(),
ctx.name().getStop().getStopIndex(), (IdentifierValue) visit(ctx.name())));
+ OwnerContext owner = ctx.owner();
+ if (null != owner) {
+ result.setOwner(new OwnerSegment(owner.getStart().getStartIndex(),
owner.getStop().getStopIndex(), (IdentifierValue) visit(owner.identifier())));
+ }
+ return result;
+ }
+
private Collection<SimpleTableSegment> getTableFromPrivilegeClause(final
ClassPrivilegesClauseContext ctx) {
return null == ctx.onClassClause().tableName() ?
Collections.emptyList() : Collections.singletonList((SimpleTableSegment)
visit(ctx.onClassClause().tableName()));
}
diff --git
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dcl/SQLServerGrantStatement.java
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dcl/SQLServerGrantStatement.java
index 0a61436..d04e3da 100644
---
a/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dcl/SQLServerGrantStatement.java
+++
b/shardingsphere-sql-parser/shardingsphere-sql-parser-statement/src/main/java/org/apache/shardingsphere/sql/parser/sql/dialect/statement/sqlserver/dcl/SQLServerGrantStatement.java
@@ -17,13 +17,21 @@
package
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl;
+import lombok.Getter;
import lombok.ToString;
+import
org.apache.shardingsphere.sql.parser.sql.common.segment.dml.column.ColumnSegment;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.SQLServerStatement;
+import java.util.LinkedList;
+import java.util.List;
+
/**
* SQLServer grant statement.
*/
@ToString
+@Getter
public final class SQLServerGrantStatement extends GrantStatement implements
SQLServerStatement {
+
+ private final List<ColumnSegment> columns = new LinkedList<>();
}
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/column/ColumnAssert.java
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/column/ColumnAssert.java
index 99c3fe0..f449253 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/column/ColumnAssert.java
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/segment/column/ColumnAssert.java
@@ -26,7 +26,12 @@ import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.o
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.value.IdentifierValueAssert;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.column.ExpectedColumn;
+import java.util.Collection;
+import java.util.List;
+
+import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
/**
@@ -52,4 +57,20 @@ public final class ColumnAssert {
}
SQLSegmentAssert.assertIs(assertContext, actual, expected);
}
+
+ /**
+ * Assert actual column segments is correct with expected columns.
+ *
+ * @param assertContext assert context
+ * @param actual actual columns
+ * @param expected expected columns
+ */
+ public static void assertIs(final SQLCaseAssertContext assertContext,
final Collection<ColumnSegment> actual, final List<ExpectedColumn> expected) {
+ assertThat(assertContext.getText("Columns size assertion error: "),
actual.size(), is(expected.size()));
+ int count = 0;
+ for (ColumnSegment each : actual) {
+ assertIs(assertContext, each, expected.get(count));
+ count++;
+ }
+ }
}
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
index 167ebdc..a7a0147 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
@@ -21,8 +21,10 @@ import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLGrantStatement;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl.SQLServerGrantStatement;
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.dcl.impl.mysql.MySQLGrantStatementAssert;
+import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.dcl.impl.sqlserver.SQLServerGrantStatementAssert;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dcl.GrantStatementTestCase;
/**
@@ -41,6 +43,8 @@ public final class GrantStatementAssert {
public static void assertIs(final SQLCaseAssertContext assertContext,
final GrantStatement actual, final GrantStatementTestCase expected) {
if (actual instanceof MySQLGrantStatement) {
MySQLGrantStatementAssert.assertIs(assertContext,
(MySQLGrantStatement) actual, expected);
+ } else if (actual instanceof SQLServerGrantStatement) {
+ SQLServerGrantStatementAssert.assertIs(assertContext,
(SQLServerGrantStatement) actual, expected);
}
}
}
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/sqlserver/SQLServerGrantStatementAssert.java
similarity index 65%
copy from
shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
copy to
shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/sqlserver/SQLServerGrantStatementAssert.java
index 167ebdc..d43451a 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/GrantStatementAssert.java
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/asserts/statement/dcl/impl/sqlserver/SQLServerGrantStatementAssert.java
@@ -15,32 +15,35 @@
* limitations under the License.
*/
-package
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.dcl.impl;
+package
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.dcl.impl.sqlserver;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
-import
org.apache.shardingsphere.sql.parser.sql.common.statement.dcl.GrantStatement;
-import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.mysql.dcl.MySQLGrantStatement;
+import
org.apache.shardingsphere.sql.parser.sql.dialect.statement.sqlserver.dcl.SQLServerGrantStatement;
import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.SQLCaseAssertContext;
-import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.statement.dcl.impl.mysql.MySQLGrantStatementAssert;
+import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.column.ColumnAssert;
+import
org.apache.shardingsphere.test.sql.parser.parameterized.asserts.segment.table.TableAssert;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dcl.GrantStatementTestCase;
/**
- * Grant statement assert.
+ * SQLServer Grant statement assert.
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class GrantStatementAssert {
+public final class SQLServerGrantStatementAssert {
/**
- * Assert grant statement is correct with expected parser result.
- *
+ * Assert SQLServer grant statement is correct with expected parser result.
+ *
* @param assertContext assert context
- * @param actual actual grant statement
+ * @param actual actual SQLServer grant statement
* @param expected expected grant statement test case
*/
- public static void assertIs(final SQLCaseAssertContext assertContext,
final GrantStatement actual, final GrantStatementTestCase expected) {
- if (actual instanceof MySQLGrantStatement) {
- MySQLGrantStatementAssert.assertIs(assertContext,
(MySQLGrantStatement) actual, expected);
+ public static void assertIs(final SQLCaseAssertContext assertContext,
final SQLServerGrantStatement actual, final GrantStatementTestCase expected) {
+ if (0 != expected.getTables().size()) {
+ TableAssert.assertIs(assertContext, actual.getTables(),
expected.getTables());
+ }
+ if (0 != expected.getColumns().size()) {
+ ColumnAssert.assertIs(assertContext, actual.getColumns(),
expected.getColumns());
}
}
}
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dcl/GrantStatementTestCase.java
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dcl/GrantStatementTestCase.java
index 1493854..732cc92 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dcl/GrantStatementTestCase.java
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/java/org/apache/shardingsphere/test/sql/parser/parameterized/jaxb/cases/domain/statement/dcl/GrantStatementTestCase.java
@@ -18,6 +18,7 @@
package
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.dcl;
import lombok.Getter;
+import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.column.ExpectedColumn;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.segment.impl.table.ExpectedSimpleTable;
import
org.apache.shardingsphere.test.sql.parser.parameterized.jaxb.cases.domain.statement.SQLParserTestCase;
@@ -33,4 +34,7 @@ public final class GrantStatementTestCase extends
SQLParserTestCase {
@XmlElement(name = "table")
private final List<ExpectedSimpleTable> tables = new LinkedList<>();
+
+ @XmlElement(name = "column")
+ private final List<ExpectedColumn> columns = new LinkedList<>();
}
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dcl/grant.xml
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dcl/grant.xml
index 93494f3..763ccb7 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dcl/grant.xml
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/case/dcl/grant.xml
@@ -50,6 +50,7 @@
<table name="t_order" start-index="27" stop-index="38">
<owner name="ds_0" start-index="27" stop-index="30" />
</table>
+ <column name="order_id" start-index="14" stop-index="21" />
</grant>
<grant sql-case-id="grant_select_to_local_user" />
@@ -199,6 +200,7 @@
<grant sql-case-id="grant_select_to_users">
<table name="t_order" start-index="27" stop-index="33" />
+ <column name="order_id" start-index="14" stop-index="21" />
</grant>
<grant sql-case-id="grant_select_on_table_for_postgresql">
@@ -217,4 +219,56 @@
<!-- FIXME ds_0 is not table, should be schema -->
<!--<table name="ds_0" start-index="24" stop-index="27" />-->
</grant>
+
+ <grant sql-case-id="grant_view_definition_on_availability_group" />
+ <grant sql-case-id="grant_take_ownership_on_availability_group" />
+ <grant sql-case-id="grant_control_on_availability_group" />
+ <grant sql-case-id="grant_create_table_to_user" />
+ <grant sql-case-id="grant_showplan_to_application_role" />
+ <grant sql-case-id="grant_create_view_to_user" />
+ <grant sql-case-id="grant_control_to_database_user" />
+ <grant sql-case-id="grant_control_to_user" />
+ <grant sql-case-id="grant_view_definition_on_role_to_user" />
+ <grant sql-case-id="grant_impersonate_to_application_role" />
+ <grant sql-case-id="grant_view_definition_endpoint_to_sqlserver_login" />
+ <grant sql-case-id="grant_take_ownership_endpoint_to_sqlserver_login" />
+ <grant sql-case-id="grant_control_on_fulltext_catalog" />
+ <grant sql-case-id="grant_view_definition_on_fulltext_stoplist" />
+
+ <grant sql-case-id="grant_select_on_object_table">
+ <table name="order_id" start-index="24" stop-index="33">
+ <owner name="t" start-index="24" stop-index="24" />
+ </table>
+ </grant>
+
+ <grant sql-case-id="grant_execute_on_object_stored_procedure">
+ <table name="sp1" start-index="25" stop-index="32">
+ <owner name="ds_0" start-index="25" stop-index="28" />
+ </table>
+ </grant>
+
+ <grant sql-case-id="grant_references_on_column">
+ <table name="order_id" start-index="39" stop-index="48">
+ <owner name="t" start-index="39" stop-index="39" />
+ </table>
+ <column name="order_id" start-index="18" stop-index="25" />
+ </grant>
+
+ <grant sql-case-id="grant_execute_on_stored_procedure">
+ <table name="sp1" start-index="17" stop-index="24">
+ <owner name="ds_0" start-index="17" stop-index="20" />
+ </table>
+ </grant>
+
+ <grant sql-case-id="grant_insert_on_schema" />
+ <grant sql-case-id="grant_insert_on_schema_with_grant_option" />
+ <grant sql-case-id="grant_view_definition_on_search_property_list" />
+ <grant sql-case-id="grant_control_server_to_sqlserver_login" />
+ <grant sql-case-id="grant_alter_any_event_notification_to_sqlserver_login"
/>
+ <grant sql-case-id="grant_alter_any_database_to_role" />
+ <grant sql-case-id="grant_impersonate_on_login" />
+ <grant sql-case-id="grant_alter_on_symmetric_key" />
+ <grant sql-case-id="grant_view_server_state_to_sqlserver_login" />
+ <grant sql-case-id="grant_view_definition_on_type" />
+ <grant sql-case-id="grant_execute_on_xml_schema_collection" />
</sql-parser-test-cases>
diff --git
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dcl/grant-user.xml
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dcl/grant-user.xml
index be0c8ce..b29e4f3 100644
---
a/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dcl/grant-user.xml
+++
b/shardingsphere-test/shardingsphere-parser-test/src/main/resources/sql/supported/dcl/grant-user.xml
@@ -19,7 +19,7 @@
<sql-cases>
<sql-case id="grant_user_without_hostname" value="GRANT SELECT, UPDATE,
INSERT, DELETE ON t_order to user_dev"
db-types="Oracle,PostgreSQL,openGauss,SQLServer" />
<sql-case id="grant_user_with_grant" value="GRANT SELECT, UPDATE, INSERT,
DELETE ON t_order to user_dev with GRANT option"
db-types="Oracle,PostgreSQL,openGauss,SQLServer"/>
- <sql-case id="grant_role" value="GRANT role_dev to user_dev"
db-types="Oracle,PostgreSQL,openGauss,SQLServer" />
+ <sql-case id="grant_role" value="GRANT role_dev to user_dev"
db-types="Oracle,PostgreSQL,openGauss" />
<sql-case id="grant_user_with_admin" value="GRANT ADVISOR, ALTER DATABASE
to user_dev with admin option" db-types="Oracle" />
<sql-case id="grant_user_on_db" value="GRANT ALL ON sharding_db.* TO
'user_dev'@'localhost'" db-types="MySQL" />
<sql-case id="grant_user_on_table" value="GRANT ALL ON t_order TO
'user_dev'@'localhost'" db-types="MySQL" />
@@ -118,4 +118,33 @@
<sql-case id="grant_all_on_table_with_owner_for_mysql" value="GRANT ALL
PRIVILEGES ON ds_0.* TO user1" db-types="MySQL" />
<sql-case id="grant_all_on_table_with_owner_for_postgresql" value="GRANT
ALL PRIVILEGES ON ds_0.* TO user1" db-types="PostgreSQL,openGauss" />
<!-- FIXME end of fixme -->
+ <sql-case id="grant_view_definition_on_availability_group" value="GRANT
VIEW DEFINITION ON AVAILABILITY GROUP::group1 TO user1" db-types="SQLServer" />
+ <sql-case id="grant_take_ownership_on_availability_group" value="GRANT
TAKE OWNERSHIP ON AVAILABILITY GROUP::group1 TO user1 WITH GRANT OPTION"
db-types="SQLServer" />
+ <sql-case id="grant_control_on_availability_group" value="GRANT CONTROL ON
AVAILABILITY GROUP::group1 TO user1" db-types="SQLServer" />
+ <sql-case id="grant_create_table_to_user" value="GRANT CREATE TABLE TO
user1" db-types="SQLServer" />
+ <sql-case id="grant_showplan_to_application_role" value="GRANT SHOWPLAN TO
role1" db-types="SQLServer" />
+ <sql-case id="grant_create_view_to_user" value="GRANT CREATE VIEW TO user1
WITH GRANT OPTION" db-types="SQLServer" />
+ <sql-case id="grant_control_to_database_user" value="GRANT CONTROL ON
DATABASE::database1 TO user1" db-types="SQLServer" />
+ <sql-case id="grant_control_to_user" value="GRANT CONTROL ON USER::user1
TO user2" db-types="SQLServer" />
+ <sql-case id="grant_view_definition_on_role_to_user" value="GRANT VIEW
DEFINITION ON ROLE::role1 TO user1 WITH GRANT OPTION" db-types="SQLServer" />
+ <sql-case id="grant_impersonate_to_application_role" value="GRANT
IMPERSONATE ON USER::user1 TO role1" db-types="SQLServer" />
+ <sql-case id="grant_view_definition_endpoint_to_sqlserver_login"
value="GRANT VIEW DEFINITION ON ENDPOINT::endpoint1 TO login1"
db-types="SQLServer" />
+ <sql-case id="grant_take_ownership_endpoint_to_sqlserver_login"
value="GRANT TAKE OWNERSHIP ON ENDPOINT::endpoint1 TO login1 WITH GRANT OPTION"
db-types="SQLServer" />
+ <sql-case id="grant_control_on_fulltext_catalog" value="GRANT CONTROL ON
FULLTEXT CATALOG :: catalog1 TO user1" db-types="SQLServer" />
+ <sql-case id="grant_view_definition_on_fulltext_stoplist" value="GRANT
VIEW DEFINITION ON FULLTEXT STOPLIST :: stoplist1 TO user1"
db-types="SQLServer" />
+ <sql-case id="grant_select_on_object_table" value="GRANT SELECT ON
OBJECT::t.order_id TO user1" db-types="SQLServer" />
+ <sql-case id="grant_execute_on_object_stored_procedure" value="GRANT
EXECUTE ON OBJECT::ds_0.sp1 TO role1" db-types="SQLServer" />
+ <sql-case id="grant_references_on_column" value="GRANT REFERENCES
(order_id) ON OBJECT::t.order_id TO user1 WITH GRANT OPTION"
db-types="SQLServer" />
+ <sql-case id="grant_execute_on_stored_procedure" value="GRANT EXECUTE ON
ds_0.sp1 TO role1" db-types="SQLServer" />
+ <sql-case id="grant_insert_on_schema" value="GRANT INSERT ON SCHEMA ::
schema1 TO user1" db-types="SQLServer" />
+ <sql-case id="grant_insert_on_schema_with_grant_option" value="GRANT
SELECT ON SCHEMA :: schema1 TO user1 WITH GRANT OPTION" db-types="SQLServer" />
+ <sql-case id="grant_view_definition_on_search_property_list" value="GRANT
VIEW DEFINITION ON SEARCH PROPERTY LIST :: list1 TO user1" db-types="SQLServer"
/>
+ <sql-case id="grant_control_server_to_sqlserver_login" value="GRANT
CONTROL SERVER TO login1" db-types="SQLServer" />
+ <sql-case id="grant_alter_any_event_notification_to_sqlserver_login"
value="GRANT ALTER ANY EVENT NOTIFICATION TO login1 WITH GRANT OPTION"
db-types="SQLServer" />
+ <sql-case id="grant_alter_any_database_to_role" value="GRANT ALTER ANY
DATABASE TO role1" db-types="SQLServer" />
+ <sql-case id="grant_impersonate_on_login" value="GRANT IMPERSONATE ON
LOGIN::login1 TO [windows\user]" db-types="SQLServer" />
+ <sql-case id="grant_alter_on_symmetric_key" value="GRANT ALTER ON
SYMMETRIC KEY::key1 TO user1" db-types="SQLServer" />
+ <sql-case id="grant_view_server_state_to_sqlserver_login" value="GRANT
VIEW SERVER STATE TO login1" db-types="SQLServer" />
+ <sql-case id="grant_view_definition_on_type" value="GRANT VIEW DEFINITION
ON TYPE::schema1.type1 TO user1 WITH GRANT OPTION" db-types="SQLServer" />
+ <sql-case id="grant_execute_on_xml_schema_collection" value="GRANT EXECUTE
ON XML SCHEMA COLLECTION::schema1.collection1 TO user1" db-types="SQLServer" />
</sql-cases>