docs: @Override
      protected void parseGrantPrivileges( DdlTokenStream tokens,
                                           List<AstNode> privileges ) throws ParsingException {
          // privilege-types
          //
          // ALL PRIVILEGES | privilege-list
          //
          // privilege-list
          //
          // table-privilege {, table-privilege }*
          //
          // table-privilege
          // SELECT [ <left paren> <privilege column list> <right paren> ]
          // | DELETE
          // | INSERT [ <left paren> <privilege column list> <right paren> ]
          // | UPDATE [ <left paren> <privilege column list> <right paren> ]
          // | REFERENCES [ <left paren> <privilege column list> <right paren> ]
          // | USAGE
          // | TRIGGER
          // | TRUNCATE
          // | CREATE
          // | CONNECT
          // | TEMPORARY
          // | TEMP
          // | EXECUTE
  
          // POSTGRES has the following Privileges:
          // GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
  
          do {
              AstNode node = null;
  
              if (tokens.canConsume(DELETE)) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, DELETE);
              } else if (tokens.canConsume(INSERT)) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, INSERT);
                  parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
              } else if (tokens.canConsume("REFERENCES")) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, "REFERENCES");
                  parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
              } else if (tokens.canConsume(SELECT)) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, SELECT);
                  // Could have columns here
                  // GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;
  
                  // Let's just swallow the column data.
  
                  consumeParenBoundedTokens(tokens, true);
              } else if (tokens.canConsume("USAGE")) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, "USAGE");
              } else if (tokens.canConsume(UPDATE)) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, UPDATE);
                  parseColumnNameList(tokens, node, TYPE_COLUMN_REFERENCE);
              } else if (tokens.canConsume("TRIGGER")) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, "TRIGGER");
              } else if (tokens.canConsume("TRUNCATE")) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, "TRUNCATE");
              } else if (tokens.canConsume("CREATE")) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, "CREATE");
              } else if (tokens.canConsume("CONNECT")) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, "CONNECT");
              } else if (tokens.canConsume("TEMPORARY")) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, "TEMPORARY");
              } else if (tokens.canConsume("TEMP")) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, "TEMP");
              } else if (tokens.canConsume("EXECUTE")) {
                  node = nodeFactory().node("privilege");
                  node.setProperty(TYPE, "EXECUTE");
              }
  
              if (node == null) {
                  break;
              }
              nodeFactory().setType(node, GRANT_PRIVILEGE);
              privileges.add(node);
  
          } while (tokens.canConsume(COMMA));
  
      }