docs: protected void parseColumns( DdlTokenStream tokens,
                                   AstNode tableNode,
                                   boolean isAlterTable ) throws ParsingException {
          String tableElementString = getTableElementsString(tokens, false);
  
          DdlTokenStream localTokens = new DdlTokenStream(tableElementString, DdlTokenStream.ddlTokenizer(false), false);
  
          localTokens.start();
  
          StringBuilder unusedTokensSB = new StringBuilder();
  
          do {
              if (isColumnDefinitionStart(localTokens)) {
                  parseColumnDefinition(localTokens, tableNode, isAlterTable);
              } else {
                  // THIS IS AN ERROR. NOTHING FOUND.
                  // NEED TO absorb tokens
                  unusedTokensSB.append(SPACE).append(localTokens.consume());
              }
          } while (localTokens.canConsume(COMMA));
  
          if (unusedTokensSB.length() > 0) {
              String msg = DdlSequencerI18n.unusedTokensParsingColumnDefinition.text(tableNode.getName());
              DdlParserProblem problem = new DdlParserProblem(Problems.WARNING, getCurrentMarkedPosition(), msg);
              problem.setUnusedSource(unusedTokensSB.toString());
              addProblem(problem, tableNode);
          }
      }