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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 151x 151x 151x 151x 151x 149x 149x 151x 151x 151x 10x 10x 10x 10x 141x 141x 151x 10x 10x 10x 10x 141x 141x 151x 3x 3x 3x 3x 141x 141x 151x 49x 49x 151x 106x 106x 106x 106x 106x 106x 106x 106x 99x 106x 2x 2x 106x 106x 106x 11x 11x 9x 11x 1x 1x 1x 1x 10x 10x 10x 11x 106x 95x 1x 1x 1x 1x 95x 106x 139x 139x 151x 1x 1x 139x 151x 151x 151x 1x | import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {Source} from "../expressions/source";
import {Target} from "../expressions/target";
import {DataReference, TableAccessType, TableType, UnknownType, VoidType} from "../../types/basic";
import {AbstractType} from "../../types/basic/_abstract_type";
import {FSTarget} from "../expressions/fstarget";
import {StatementSyntax} from "../_statement_syntax";
import {InlineData} from "../expressions/inline_data";
import {TypeUtils} from "../_type_utils";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
// todo: issue error for short APPEND if the source is without header line
export class Append implements StatementSyntax {
public runSyntax(node: StatementNode, input: SyntaxInput): void {
let targetType: AbstractType | undefined = undefined;
const target = node.findDirectExpression(Expressions.Target);
if (target) {
targetType = Target.runSyntax(target, input);
}
// a hashed table has no index, APPEND adds at the end
if (targetType instanceof TableType && targetType.getAccessType() === TableAccessType.hashed) {
const message = "Implicit or explicit index operation on hashed table is not possible";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
const fsTarget = node.findExpressionAfterToken("ASSIGNING");
if (fsTarget && fsTarget.get() instanceof Expressions.FSTarget) {
if (!(targetType instanceof TableType) && !(targetType instanceof VoidType) && !(targetType instanceof UnknownType)) {
const message = "APPEND to non table type, " + targetType?.constructor.name;
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
const rowType = targetType instanceof TableType ? targetType.getRowType() : targetType;
FSTarget.runSyntax(fsTarget, input, rowType);
}
const dataTarget = node.findExpressionAfterToken("INTO");
if (dataTarget && node.concatTokens().toUpperCase().includes(" REFERENCE INTO DATA(")) {
if (!(targetType instanceof TableType) && !(targetType instanceof VoidType) && !(targetType instanceof UnknownType)) {
const message = "APPEND to non table type, " + targetType?.constructor.name;
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
const rowType = targetType instanceof TableType ? targetType.getRowType() : targetType;
InlineData.runSyntax(dataTarget, input, new DataReference(rowType));
}
let source = node.findDirectExpression(Expressions.SimpleSource4);
if (source === undefined) {
source = node.findDirectExpression(Expressions.Source);
}
if (source) {
if (targetType !== undefined
&& !(targetType instanceof TableType)
&& !(targetType instanceof UnknownType)
&& dataTarget !== target
&& !(targetType instanceof VoidType)) {
const message = `Append, target not a table type (${targetType.constructor.name})`;
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
let rowType: AbstractType | undefined = undefined;
if (targetType instanceof TableType) {
rowType = targetType.getRowType();
} else if (targetType instanceof VoidType) {
rowType = targetType;
}
let sourceType = Source.runSyntax(source, input, rowType);
if (node.findDirectTokenByText("LINES")) {
// hmm, checking only the row types are compatible will not check the table type, e.g. sorted or hashed
if (sourceType instanceof TableType) {
sourceType = sourceType.getRowType();
} else if (!(sourceType instanceof VoidType) && !(sourceType instanceof UnknownType)) {
const message = "LINES OF must be a table type";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
if (targetType instanceof TableType) {
targetType = targetType.getRowType();
}
if (new TypeUtils(input.scope).isAssignable(sourceType, targetType) === false) {
const message = "Incompatible types";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
} else {
if (new TypeUtils(input.scope).isAssignable(sourceType, rowType) === false) {
const message = "Incompatible types";
input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
return;
}
}
}
const from = node.findExpressionAfterToken("FROM");
if (from && from.get() instanceof Expressions.Source) {
Source.runSyntax(from, input);
}
const to = node.findExpressionAfterToken("TO");
if (to && to.get() instanceof Expressions.Source) {
Source.runSyntax(to, input);
}
}
} |