Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions mongodb/MongoShellLexer.g4
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,25 @@ IS_CAPPED: 'isCapped';
VALIDATE: 'validate';
LATENCY_STATS: 'latencyStats';

// Collection methods (additional)
BULK_WRITE: 'bulkWrite';
UPDATE: 'update';
MAP_REDUCE: 'mapReduce';
FIND_AND_MODIFY: 'findAndModify';
ANALYZE_SHARD_KEY: 'analyzeShardKey';
CONFIGURE_QUERY_ANALYZER: 'configureQueryAnalyzer';
COMPACT_STRUCTURED_ENCRYPTION_DATA: 'compactStructuredEncryptionData';
HIDE_INDEX: 'hideIndex';
UNHIDE_INDEX: 'unhideIndex';
RE_INDEX: 'reIndex';
GET_SHARD_DISTRIBUTION: 'getShardDistribution';
GET_SHARD_VERSION: 'getShardVersion';
// Atlas Search Index methods
CREATE_SEARCH_INDEX: 'createSearchIndex';
CREATE_SEARCH_INDEXES: 'createSearchIndexes';
DROP_SEARCH_INDEX: 'dropSearchIndex';
UPDATE_SEARCH_INDEX: 'updateSearchIndex';

// Database methods (M4)
CREATE_COLLECTION: 'createCollection';
DROP_DATABASE: 'dropDatabase';
Expand All @@ -91,6 +110,53 @@ GET_NAME: 'getName';
GET_MONGO: 'getMongo';
GET_SIBLING_DB: 'getSiblingDB';

// Database methods (additional)
AUTH: 'auth';
CHANGE_USER_PASSWORD: 'changeUserPassword';
CLONE_DATABASE: 'cloneDatabase';
COMMAND_HELP: 'commandHelp';
COPY_DATABASE: 'copyDatabase';
CREATE_ROLE: 'createRole';
CREATE_USER: 'createUser';
CREATE_VIEW: 'createView';
CURRENT_OP: 'currentOp';
DROP_ALL_ROLES: 'dropAllRoles';
DROP_ALL_USERS: 'dropAllUsers';
DROP_ROLE: 'dropRole';
DROP_USER: 'dropUser';
FSYNC_LOCK: 'fsyncLock';
FSYNC_UNLOCK: 'fsyncUnlock';
GET_LOG_COMPONENTS: 'getLogComponents';
GET_PROFILING_LEVEL: 'getProfilingLevel';
GET_PROFILING_STATUS: 'getProfilingStatus';
GET_REPLICATION_INFO: 'getReplicationInfo';
GET_ROLE: 'getRole';
GET_ROLES: 'getRoles';
GET_USER: 'getUser';
GET_USERS: 'getUsers';
GRANT_PRIVILEGES_TO_ROLE: 'grantPrivilegesToRole';
GRANT_ROLES_TO_ROLE: 'grantRolesToRole';
GRANT_ROLES_TO_USER: 'grantRolesToUser';
HELLO: 'hello';
IS_MASTER: 'isMaster';
KILL_OP: 'killOp';
LOGOUT: 'logout';
PRINT_COLLECTION_STATS: 'printCollectionStats';
PRINT_REPLICATION_INFO: 'printReplicationInfo';
PRINT_SECONDARY_REPLICATION_INFO: 'printSecondaryReplicationInfo';
PRINT_SHARDING_STATUS: 'printShardingStatus';
PRINT_SLAVE_REPLICATION_INFO: 'printSlaveReplicationInfo';
REVOKE_PRIVILEGES_FROM_ROLE: 'revokePrivilegesFromRole';
REVOKE_ROLES_FROM_ROLE: 'revokeRolesFromRole';
REVOKE_ROLES_FROM_USER: 'revokeRolesFromUser';
ROTATE_CERTIFICATES: 'rotateCertificates';
SET_LOG_LEVEL: 'setLogLevel';
SET_PROFILING_LEVEL: 'setProfilingLevel';
SET_SECONDARY_OK: 'setSecondaryOk';
SHUTDOWN_SERVER: 'shutdownServer';
UPDATE_ROLE: 'updateRole';
UPDATE_USER: 'updateUser';

// Connection methods
MONGO: 'Mongo';
CONNECT: 'connect';
Expand Down
265 changes: 248 additions & 17 deletions mongodb/MongoShellParser.g4
Original file line number Diff line number Diff line change
Expand Up @@ -67,15 +67,57 @@ dbStatement
| DB DOT GET_NAME LPAREN RPAREN # getName
| DB DOT GET_MONGO LPAREN RPAREN # getMongo
| DB DOT GET_SIBLING_DB LPAREN argument RPAREN # getSiblingDB
| DB DOT genericDbMethod # dbGenericMethod
| DB DOT AGGREGATE LPAREN arguments? RPAREN # dbAggregate
| DB DOT AUTH LPAREN arguments? RPAREN # dbAuth
| DB DOT CHANGE_USER_PASSWORD LPAREN arguments? RPAREN # dbChangeUserPassword
| DB DOT CLONE_DATABASE LPAREN arguments? RPAREN # dbCloneDatabase
| DB DOT COMMAND_HELP LPAREN arguments? RPAREN # dbCommandHelp
| DB DOT COPY_DATABASE LPAREN arguments? RPAREN # dbCopyDatabase
| DB DOT CREATE_ROLE LPAREN arguments? RPAREN # dbCreateRole
| DB DOT CREATE_USER LPAREN arguments? RPAREN # dbCreateUser
| DB DOT CREATE_VIEW LPAREN arguments? RPAREN # dbCreateView
| DB DOT CURRENT_OP LPAREN arguments? RPAREN # dbCurrentOp
| DB DOT DROP_ALL_ROLES LPAREN arguments? RPAREN # dbDropAllRoles
| DB DOT DROP_ALL_USERS LPAREN arguments? RPAREN # dbDropAllUsers
| DB DOT DROP_ROLE LPAREN arguments? RPAREN # dbDropRole
| DB DOT DROP_USER LPAREN arguments? RPAREN # dbDropUser
| DB DOT FSYNC_LOCK LPAREN arguments? RPAREN # dbFsyncLock
| DB DOT FSYNC_UNLOCK LPAREN arguments? RPAREN # dbFsyncUnlock
| DB DOT GET_LOG_COMPONENTS LPAREN arguments? RPAREN # dbGetLogComponents
| DB DOT GET_PROFILING_LEVEL LPAREN arguments? RPAREN # dbGetProfilingLevel
| DB DOT GET_PROFILING_STATUS LPAREN arguments? RPAREN # dbGetProfilingStatus
| DB DOT GET_REPLICATION_INFO LPAREN arguments? RPAREN # dbGetReplicationInfo
| DB DOT GET_ROLE LPAREN arguments? RPAREN # dbGetRole
| DB DOT GET_ROLES LPAREN arguments? RPAREN # dbGetRoles
| DB DOT GET_USER LPAREN arguments? RPAREN # dbGetUser
| DB DOT GET_USERS LPAREN arguments? RPAREN # dbGetUsers
| DB DOT GRANT_PRIVILEGES_TO_ROLE LPAREN arguments? RPAREN # dbGrantPrivilegesToRole
| DB DOT GRANT_ROLES_TO_ROLE LPAREN arguments? RPAREN # dbGrantRolesToRole
| DB DOT GRANT_ROLES_TO_USER LPAREN arguments? RPAREN # dbGrantRolesToUser
| DB DOT HELLO LPAREN arguments? RPAREN # dbHello
| DB DOT IS_MASTER LPAREN arguments? RPAREN # dbIsMaster
| DB DOT KILL_OP LPAREN arguments? RPAREN # dbKillOp
| DB DOT LOGOUT LPAREN arguments? RPAREN # dbLogout
| DB DOT PRINT_COLLECTION_STATS LPAREN arguments? RPAREN # dbPrintCollectionStats
| DB DOT PRINT_REPLICATION_INFO LPAREN arguments? RPAREN # dbPrintReplicationInfo
| DB DOT PRINT_SECONDARY_REPLICATION_INFO LPAREN arguments? RPAREN # dbPrintSecondaryReplicationInfo
| DB DOT PRINT_SHARDING_STATUS LPAREN arguments? RPAREN # dbPrintShardingStatus
| DB DOT PRINT_SLAVE_REPLICATION_INFO LPAREN arguments? RPAREN # dbPrintSlaveReplicationInfo
| DB DOT REVOKE_PRIVILEGES_FROM_ROLE LPAREN arguments? RPAREN # dbRevokePrivilegesFromRole
| DB DOT REVOKE_ROLES_FROM_ROLE LPAREN arguments? RPAREN # dbRevokeRolesFromRole
| DB DOT REVOKE_ROLES_FROM_USER LPAREN arguments? RPAREN # dbRevokeRolesFromUser
| DB DOT ROTATE_CERTIFICATES LPAREN arguments? RPAREN # dbRotateCertificates
| DB DOT SET_LOG_LEVEL LPAREN arguments? RPAREN # dbSetLogLevel
| DB DOT SET_PROFILING_LEVEL LPAREN arguments? RPAREN # dbSetProfilingLevel
| DB DOT SET_SECONDARY_OK LPAREN arguments? RPAREN # dbSetSecondaryOk
| DB DOT SET_WRITE_CONCERN LPAREN arguments? RPAREN # dbSetWriteConcern
| DB DOT SHUTDOWN_SERVER LPAREN arguments? RPAREN # dbShutdownServer
| DB DOT UPDATE_ROLE LPAREN arguments? RPAREN # dbUpdateRole
| DB DOT UPDATE_USER LPAREN arguments? RPAREN # dbUpdateUser
| DB DOT WATCH LPAREN arguments? RPAREN # dbWatch
| DB collectionAccess methodChain # collectionOperation
;

// Generic database method for extensibility (unsupported methods)
genericDbMethod
: identifier LPAREN arguments? RPAREN
;

// Bulk operation statements
// Pattern: db.collection.initializeOrderedBulkOp().find(...).update(...).execute()
bulkStatement
Expand Down Expand Up @@ -171,13 +213,15 @@ collectionAccess
| DOT GET_COLLECTION LPAREN stringLiteral RPAREN # getCollectionAccess
;

// Method chain: one or more method calls chained with dots
// Method chain: first call must be a collection method, subsequent calls are cursor methods.
// Special case: explain() returns an explainable object that supports collection methods.
methodChain
: DOT methodCall (DOT methodCall)*
: DOT collectionExplainMethod DOT collectionMethodCall (DOT cursorMethodCall)*
| DOT collectionMethodCall (DOT cursorMethodCall)*
;
Comment on lines 218 to 221
Copy link

Copilot AI Jan 30, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The methodChain grammar rule has a potential ambiguity issue. The first alternative DOT collectionExplainMethod DOT collectionMethodCall (DOT cursorMethodCall)* will never be matched because collectionExplainMethod is already included in collectionMethodCall (line 264). This means ANTLR will always choose the second alternative DOT collectionMethodCall (DOT cursorMethodCall)* when parsing explain() chains.

To fix this, collectionExplainMethod should be removed from the collectionMethodCall rule (line 264), so that the special case for explain().find() chains can be properly distinguished from normal method chains.

Copilot uses AI. Check for mistakes.

// Method call: methodName(arguments?)
methodCall
// Collection method call: methods that operate on a collection directly
collectionMethodCall
: findMethod
| findOneMethod
| countDocumentsMethod
Expand Down Expand Up @@ -209,7 +253,32 @@ methodCall
| isCappedMethod
| validateMethod
| latencyStatsMethod
| sortMethod
| watchMethod
| bulkWriteMethod
| collectionCountMethod
| collectionInsertMethod
| collectionRemoveMethod
| updateMethod
| mapReduceMethod
| findAndModifyMethod
| collectionExplainMethod
| analyzeShardKeyMethod
| configureQueryAnalyzerMethod
| compactStructuredEncryptionDataMethod
| hideIndexMethod
| unhideIndexMethod
| reIndexMethod
| getShardDistributionMethod
| getShardVersionMethod
| createSearchIndexMethod
| createSearchIndexesMethod
| dropSearchIndexMethod
| updateSearchIndexMethod
;

// Cursor method call: methods that operate on a cursor (chainable after collection methods)
cursorMethodCall
: sortMethod
| limitMethod
| skipMethod
| countMethod
Expand Down Expand Up @@ -244,7 +313,6 @@ methodCall
| tryNextMethod
| allowDiskUseMethod
| addOptionMethod
| genericMethod
;

// Specific method rules for better AST structure
Expand Down Expand Up @@ -403,6 +471,111 @@ latencyStatsMethod
: LATENCY_STATS LPAREN argument? RPAREN
;

// watch(pipeline?, options?)
watchMethod
: WATCH LPAREN arguments? RPAREN
;

// bulkWrite(operations, options?)
bulkWriteMethod
: BULK_WRITE LPAREN arguments RPAREN
;

// count(filter?, options?) - deprecated collection-level count
collectionCountMethod
: COUNT LPAREN arguments? RPAREN
;

// insert(document/array, options?) - deprecated
collectionInsertMethod
: INSERT LPAREN arguments RPAREN
;

// remove(filter, options?) - deprecated
collectionRemoveMethod
: REMOVE LPAREN arguments RPAREN
;

// update(filter, update, options?) - deprecated
updateMethod
: UPDATE LPAREN arguments RPAREN
;

// mapReduce(map, reduce, options?) - deprecated
mapReduceMethod
: MAP_REDUCE LPAREN arguments RPAREN
;

// findAndModify(document)
findAndModifyMethod
: FIND_AND_MODIFY LPAREN arguments RPAREN
;

// explain(verbosity?) - collection-level explain
collectionExplainMethod
: EXPLAIN LPAREN arguments? RPAREN
;

// analyzeShardKey(key, options?)
analyzeShardKeyMethod
: ANALYZE_SHARD_KEY LPAREN arguments RPAREN
;

// configureQueryAnalyzer(options)
configureQueryAnalyzerMethod
: CONFIGURE_QUERY_ANALYZER LPAREN arguments RPAREN
;

// compactStructuredEncryptionData(options?)
compactStructuredEncryptionDataMethod
: COMPACT_STRUCTURED_ENCRYPTION_DATA LPAREN arguments? RPAREN
;

// hideIndex(indexName/spec)
hideIndexMethod
: HIDE_INDEX LPAREN argument RPAREN
;

// unhideIndex(indexName/spec)
unhideIndexMethod
: UNHIDE_INDEX LPAREN argument RPAREN
;

// reIndex()
reIndexMethod
: RE_INDEX LPAREN RPAREN
;

// getShardDistribution()
getShardDistributionMethod
: GET_SHARD_DISTRIBUTION LPAREN RPAREN
;

// getShardVersion()
getShardVersionMethod
: GET_SHARD_VERSION LPAREN RPAREN
;

// createSearchIndex(definition)
createSearchIndexMethod
: CREATE_SEARCH_INDEX LPAREN arguments RPAREN
;

// createSearchIndexes(definitions)
createSearchIndexesMethod
: CREATE_SEARCH_INDEXES LPAREN arguments RPAREN
;

// dropSearchIndex(name)
dropSearchIndexMethod
: DROP_SEARCH_INDEX LPAREN argument RPAREN
;

// updateSearchIndex(name, definition)
updateSearchIndexMethod
: UPDATE_SEARCH_INDEX LPAREN arguments RPAREN
;

// sort(specification?) - can be called without args
sortMethod
: SORT LPAREN document? RPAREN
Expand Down Expand Up @@ -555,11 +728,6 @@ addOptionMethod
: ADD_OPTION LPAREN NUMBER RPAREN
;

// Generic method for extensibility (other methods will be caught here)
genericMethod
: identifier LPAREN arguments? RPAREN
;

// Arguments: comma-separated list of values
arguments
: argument (COMMA argument)* COMMA?
Expand Down Expand Up @@ -862,4 +1030,67 @@ identifier
| GET_CLIENT_ENCRYPTION
// Plan cache method tokens
| GET_PLAN_CACHE
// Collection method tokens (additional)
| BULK_WRITE
| UPDATE
| MAP_REDUCE
| FIND_AND_MODIFY
| ANALYZE_SHARD_KEY
| CONFIGURE_QUERY_ANALYZER
| COMPACT_STRUCTURED_ENCRYPTION_DATA
| HIDE_INDEX
| UNHIDE_INDEX
| RE_INDEX
| GET_SHARD_DISTRIBUTION
| GET_SHARD_VERSION
| CREATE_SEARCH_INDEX
| CREATE_SEARCH_INDEXES
| DROP_SEARCH_INDEX
| UPDATE_SEARCH_INDEX
// Database method tokens (additional)
| AUTH
| CHANGE_USER_PASSWORD
| CLONE_DATABASE
| COMMAND_HELP
| COPY_DATABASE
| CREATE_ROLE
| CREATE_USER
| CREATE_VIEW
| CURRENT_OP
| DROP_ALL_ROLES
| DROP_ALL_USERS
| DROP_ROLE
| DROP_USER
| FSYNC_LOCK
| FSYNC_UNLOCK
| GET_LOG_COMPONENTS
| GET_PROFILING_LEVEL
| GET_PROFILING_STATUS
| GET_REPLICATION_INFO
| GET_ROLE
| GET_ROLES
| GET_USER
| GET_USERS
| GRANT_PRIVILEGES_TO_ROLE
| GRANT_ROLES_TO_ROLE
| GRANT_ROLES_TO_USER
| HELLO
| IS_MASTER
| KILL_OP
| LOGOUT
| PRINT_COLLECTION_STATS
| PRINT_REPLICATION_INFO
| PRINT_SECONDARY_REPLICATION_INFO
| PRINT_SHARDING_STATUS
| PRINT_SLAVE_REPLICATION_INFO
| REVOKE_PRIVILEGES_FROM_ROLE
| REVOKE_ROLES_FROM_ROLE
| REVOKE_ROLES_FROM_USER
| ROTATE_CERTIFICATES
| SET_LOG_LEVEL
| SET_PROFILING_LEVEL
| SET_SECONDARY_OK
| SHUTDOWN_SERVER
| UPDATE_ROLE
| UPDATE_USER
;
Loading
Loading