<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->

# Keywords 

## 1. Reserved words（Can not be used as identifier）:

- PATH
- ROOT
- TIME
- TIMESTAMP

## 2. Common Keywords:

- ADD
- AFTER
- ALIAS
- ALIGN
- ALIGNED
- ALL
- ALTER
- ALTER_TIMESERIES
- ANY
- APPEND
- APPLY_TEMPLATE
- AS
- ASC
- ATTRIBUTES
- BEFORE
- BEGIN
- BLOCKED
- BOUNDARY
- BY
- CACHE
- CHILD
- CLEAR
- CLUSTER
- CONCAT
- CONFIGNODES
- CONFIGURATION
- CONTINUOUS
- COUNT
- CONTAIN
- CQ
- CQS
- CREATE
- CREATE_CONTINUOUS_QUERY
- CREATE_FUNCTION
- CREATE_ROLE
- CREATE_TIMESERIES
- CREATE_TRIGGER
- CREATE_USER
- DATA
- DATABASE
- DATABASES
- DATANODES
- DEACTIVATE
- DEBUG
- DELETE
- DELETE_ROLE
- DELETE_STORAGE_GROUP
- DELETE_TIMESERIES
- DELETE_USER
- DESC
- DESCRIBE
- DEVICE
- DEVICEID
- DEVICES
- DISABLE
- DISCARD
- DROP
- DROP_CONTINUOUS_QUERY
- DROP_FUNCTION
- DROP_TRIGGER
- END
- ENDTIME
- EVERY
- EXPLAIN
- FILL
- FILE
- FLUSH
- FOR
- FROM
- FULL
- FUNCTION
- FUNCTIONS
- GLOBAL
- GRANT
- GRANT_ROLE_PRIVILEGE
- GRANT_USER_PRIVILEGE
- GRANT_USER_ROLE
- GROUP
- HEAD
- HAVING
- INDEX
- INFO
- INSERT
- INSERT_TIMESERIES
- INTO
- KILL
- LABEL
- LAST
- LATEST
- LEVEL
- LIKE
- LIMIT
- LINEAR
- LINK
- LIST
- LIST_ROLE
- LIST_USER
- LOAD
- LOCAL
- LOCK
- MERGE
- METADATA
- MODIFY_PASSWORD
- NODES
- NONE
- NOW
- OF
- OFF
- OFFSET
- ON
- ORDER
- ONSUCCESS
- PARTITION
- PASSWORD
- PATHS
- PIPE
- PIPES
- PIPESINK
- PIPESINKS
- PIPESINKTYPE
- POLICY
- PREVIOUS
- PREVIOUSUNTILLAST
- PRIVILEGES
- PROCESSLIST
- PROPERTY
- PRUNE
- QUERIES
- QUERY
- RANGE
- READONLY
- READ_TEMPLATE
- READ_TEMPLATE_APPLICATION
- READ_TIMESERIES
- REGEXP
- REGIONID
- REGION
- REMOVE
- RENAME
- RESAMPLE
- RESOURCE
- REVOKE
- REVOKE_ROLE_PRIVILEGE
- REVOKE_USER_PRIVILEGE
- REVOKE_USER_ROLE
- ROLE
- RUNNING
- SCHEMA
- SELECT
- SERIESSLOTID
- SET
- SET_STORAGE_GROUP
- SETTLE
- SGLEVEL
- SHOW
- SLIMIT
- SOFFSET
- STORAGE
- START
- STARTTIME
- STATELESS
- STATEFUL
- STOP
- SYSTEM
- TAIL
- TAGS
- TASK
- TEMPLATE
- TIMEOUT
- TIMESERIES
- TIMESLOTID
- TO
- TOLERANCE
- TOP
- TRACING
- TRIGGER
- TRIGGERS
- TTL
- TYPE
- UNLINK
- UNLOAD
- UNSET
- UPDATE
- UPDATE_TEMPLATE
- UPSERT
- URI
- USER
- USING
- VALUES
- VERIFY
- VERSION
- VIEW
- WATERMARK_EMBEDDING
- WHERE
- WITH
- WITHOUT
- WRITABLE
