All files / src/abap/2_statements/expressions select.ts

100% Statements 43/43
100% Branches 1/1
100% Functions 1/1
100% Lines 43/43

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 431x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 3x 1x
import {seq, per, str, Expression, altPrio, optPrio, ver, tok} from "../combi";
import {SQLFieldList, SQLFrom, SQLCond, SQLSource, SQLClient, DatabaseConnection, SQLIntoTable, SQLOrderBy, SQLHaving, SQLForAllEntries, SQLHints, SQLFields, SQLIntoList} from ".";
import {Version} from "../../../version";
import {IStatementRunnable} from "../statement_runnable";
import {SQLGroupBy} from "./sql_group_by";
import {SQLIntoStructure} from "./sql_into_structure";
import {WParenLeftW, WParenRightW} from "../../1_lexer/tokens";
import {SQLFieldName} from "./sql_field_name";
import {SQLUpTo} from "./sql_up_to";
 
export class Select extends Expression {
  public getRunnable(): IStatementRunnable {
    const into = altPrio(SQLIntoTable, SQLIntoStructure, SQLIntoList);
 
    const where = seq("WHERE", SQLCond);
 
    const offset = ver(Version.v751, seq("OFFSET", SQLSource));
 
    const bypass = str("BYPASSING BUFFER");
 
    const fields = ver(Version.v750, SQLFields);
 
    // todo, HINTS cannot be anywhere, need an expression dedicated for strict sql
    const perm = per(SQLFrom, into, SQLForAllEntries, where,
                     SQLOrderBy, SQLUpTo, offset, SQLClient, SQLHaving,
                     bypass, SQLGroupBy, fields, DatabaseConnection, SQLHints);
 
    const permSingle = per(SQLFrom, altPrio(SQLIntoStructure, SQLIntoList), where, SQLClient,
                           bypass, fields, DatabaseConnection, SQLHints);
 
    const paren = seq(tok(WParenLeftW), SQLFieldName, tok(WParenRightW));
 
    const fieldList = optPrio(altPrio(SQLFieldList, paren));
 
    const single = seq("SINGLE", optPrio("FOR UPDATE"), fieldList, permSingle);
 
    const other = seq(optPrio("DISTINCT"), fieldList, perm);
 
    const ret = seq("SELECT", altPrio(single, other));
 
    return ret;
  }
}