if (node.isNotExists()) { builder.append("IF NOT EXISTS "); String tableName = formatName(node.getName()); builder.append(tableName).append(" (\n"); String columnList = node.getElements().stream() .map(element -> { if (element instanceof ColumnDefinition) { builder.append("\n").append(")"); if (node.getComment().isPresent()) { builder.append("\nCOMMENT " + formatStringLiteral(node.getComment().get())); builder.append(formatPropertiesMultiLine(node.getProperties()));
private Query rewriteInsertQuery(Connection connection, Query query, Insert statement) throws SQLException, QueryRewriteException { QualifiedName temporaryTableName = generateTemporaryTableName(statement.getTarget()); Statement createTemporaryTable = new CreateTable(temporaryTableName, ImmutableList.of(new LikeClause(statement.getTarget(), Optional.of(INCLUDING))), true, ImmutableList.of(), Optional.empty()); String createTemporaryTableSql = formatSql(createTemporaryTable, Optional.empty()); String insertSql = formatSql(new Insert(temporaryTableName, statement.getColumns(), statement.getQuery()), Optional.empty()); String checksumSql = checksumSql(getColumnsForTable(connection, query.getCatalog(), query.getSchema(), statement.getTarget().toString()), temporaryTableName); String dropTableSql = dropTableSql(temporaryTableName); return new Query(query.getCatalog(), query.getSchema(), ImmutableList.of(createTemporaryTableSql, insertSql), checksumSql, ImmutableList.of(dropTableSql), query.getUsername(), query.getPassword(), query.getSessionProperties()); }
@Override protected R visitCreateTable(CreateTable node, C context) { for (TableElement tableElement : node.getElements()) { process(tableElement, context); } for (Property property : node.getProperties()) { process(property, context); } return null; }
String[] indexAndType = this.getIndexAndType(create.getName().toString(), sql, "table\\s+", "\\s+\\(", index); index = indexAndType[0]; String type = indexAndType[1]; sb.append("{"); boolean templatesAdded = false; if(create.getProperties().size() >= 0){ Map<String, Expression> props = create.getProperties(); if(props.containsKey("dynamic_templates")){ sb.append("dynamic_templates:"+removeEnclosingQuotes( props.get("dynamic_templates").toString())); List<TableElement> fields = create.getElements(); for(int i=0; i<fields.size(); i++){ ColumnDefinition field = (ColumnDefinition)fields.get(i);
@Override public String explain(CreateTable statement, List<Expression> parameters) { return "CREATE TABLE " + statement.getName(); }
@Override protected Scope visitCreateTable(CreateTable node, Optional<Scope> scope) { validateProperties(node.getProperties(), scope); return createAndAssignScope(node, scope); }
@Override protected R visitCreateTable(CreateTable node, C context) { for (TableElement tableElement : node.getElements()) { process(tableElement, context); } for (Property property : node.getProperties()) { process(property, context); } return null; }
assertEquals(createTable.getName().getParts().size(), 3); assertEquals(createTable.getName().getPrefix().get(), QualifiedName.of("other_catalog", "other_schema")); assertTrue(createTable.getName().getSuffix().startsWith("tmp_")); assertFalse(createTable.getName().getSuffix().contains("test_insert_table")); assertEquals(insert.getTarget(), createTable.getName()); assertEquals(insert.getColumns(), Optional.of(ImmutableList.of(identifier("b"), identifier("a"), identifier("c")))); Table table = new Table(createTable.getName()); SingleColumn columnA = new SingleColumn(new FunctionCall(QualifiedName.of("checksum"), ImmutableList.of(new Identifier("A")))); SingleColumn columnB = new SingleColumn(new FunctionCall(QualifiedName.of("checksum"), ImmutableList.of(new FunctionCall(QualifiedName.of("round"), ImmutableList.of(new Identifier("B"), new LongLiteral("1")))))); assertEquals(parser.createStatement(rewrittenQuery.getPostQueries().get(0)), new DropTable(createTable.getName(), true));
@VisibleForTesting public ListenableFuture<?> internalExecute(CreateTable statement, Metadata metadata, AccessControl accessControl, Session session, List<Expression> parameters) checkArgument(!statement.getElements().isEmpty(), "no columns for table"); QualifiedObjectName tableName = createQualifiedObjectName(session, statement, statement.getName()); Optional<TableHandle> tableHandle = metadata.getTableHandle(session, tableName); if (tableHandle.isPresent()) { if (!statement.isNotExists()) { throw new SemanticException(TABLE_ALREADY_EXISTS, statement, "Table '%s' already exists", tableName); Map<String, Object> inheritedProperties = ImmutableMap.of(); boolean includingProperties = false; for (TableElement element : statement.getElements()) { if (element instanceof ColumnDefinition) { ColumnDefinition column = (ColumnDefinition) element; Map<String, Expression> sqlProperties = mapFromProperties(statement.getProperties()); Map<String, Object> properties = metadata.getTablePropertyManager().getProperties( connectorId, ConnectorTableMetadata tableMetadata = new ConnectorTableMetadata(tableName.asSchemaTableName(), ImmutableList.copyOf(columns.values()), finalProperties, statement.getComment()); try { metadata.createTable(session, tableName.getCatalogName(), tableMetadata, statement.isNotExists()); if (!e.getErrorCode().equals(ALREADY_EXISTS.toErrorCode()) || !statement.isNotExists()) { throw e;
@Test public void testCreateTableNotExistsTrue() { CreateTable statement = new CreateTable(QualifiedName.of("test_table"), ImmutableList.of(new ColumnDefinition(identifier("a"), "BIGINT", emptyList(), Optional.empty())), true, ImmutableList.of(), Optional.empty()); getFutureValue(new CreateTableTask().internalExecute(statement, metadata, new AllowAllAccessControl(), testSession, emptyList())); assertEquals(metadata.getCreateTableCallCount(), 1); }
@Override public String explain(CreateTable statement) { return "CREATE TABLE " + statement.getName(); }
@Override protected Void visitCreateTable(CreateTable node, Integer indent) { builder.append("CREATE TABLE "); if (node.isNotExists()) { builder.append("IF NOT EXISTS "); String tableName = formatName(node.getName()); builder.append(tableName).append(" (\n"); String columnList = node.getElements().stream() .map(element -> { if (element instanceof ColumnDefinition) { builder.append("\n").append(")"); if (node.getComment().isPresent()) { builder.append("\nCOMMENT " + formatStringLiteral(node.getComment().get())); builder.append(formatProperties(node.getProperties()));
@Test public void testCreateTableNotExistsFalse() { CreateTable statement = new CreateTable(QualifiedName.of("test_table"), ImmutableList.of(new ColumnDefinition(identifier("a"), "BIGINT", emptyList(), Optional.empty())), false, ImmutableList.of(), Optional.empty()); try { getFutureValue(new CreateTableTask().internalExecute(statement, metadata, new AllowAllAccessControl(), testSession, emptyList())); fail("expected exception"); } catch (RuntimeException e) { // Expected assertTrue(e instanceof PrestoException); PrestoException prestoException = (PrestoException) e; assertEquals(prestoException.getErrorCode(), ALREADY_EXISTS.toErrorCode()); } assertEquals(metadata.getCreateTableCallCount(), 1); }
@Override protected Void visitCreateTable(CreateTable node, Integer indent) { builder.append("CREATE TABLE "); if (node.isNotExists()) { builder.append("IF NOT EXISTS "); } builder.append(node.getName()) .append(" ("); Joiner.on(", ").appendTo(builder, transform(node.getElements(), element -> element.getName() + " " + element.getType())); builder.append(")"); if (!node.getProperties().isEmpty()) { builder.append(" WITH ("); Joiner.on(", ").appendTo(builder, transform(node.getProperties().entrySet(), entry -> entry.getKey() + " = " + formatExpression(entry.getValue()))); builder.append(")"); } return null; }
@Override public Node visitCreateTable(SqlBaseParser.CreateTableContext context) { Optional<String> comment = Optional.empty(); if (context.COMMENT() != null) { comment = Optional.of(((StringLiteral) visit(context.string())).getValue()); } List<Property> properties = ImmutableList.of(); if (context.properties() != null) { properties = visit(context.properties().property(), Property.class); } return new CreateTable( getLocation(context), getQualifiedName(context.qualifiedName()), visit(context.tableElement(), TableElement.class), context.EXISTS() != null, properties, comment); }
@Override protected Void visitCreateTable(CreateTable node, Integer indent) { builder.append("CREATE TABLE "); if (node.isNotExists()) { builder.append("IF NOT EXISTS "); } builder.append(node.getName()) .append(" ("); Joiner.on(", ").appendTo(builder, transform(node.getElements(), element -> element.getName() + " " + element.getType())); builder.append(")"); if (!node.getProperties().isEmpty()) { builder.append(" WITH ("); Joiner.on(", ").appendTo(builder, transform(node.getProperties().entrySet(), entry -> entry.getKey() + " = " + formatExpression(entry.getValue()))); builder.append(")"); } return null; }
List<Property> propertyNodes = buildProperties(objectName, Optional.empty(), INVALID_TABLE_PROPERTY, properties, allTableProperties); CreateTable createTable = new CreateTable( QualifiedName.of(objectName.getCatalogName(), objectName.getSchemaName(), objectName.getObjectName()), columns,
if (node.isNotExists()) { builder.append("IF NOT EXISTS "); String tableName = formatName(node.getName()); builder.append(tableName).append(" (\n"); String columnList = node.getElements().stream() .map(element -> { if (element instanceof ColumnDefinition) { builder.append("\n").append(")"); if (node.getComment().isPresent()) { builder.append("\nCOMMENT " + formatStringLiteral(node.getComment().get())); builder.append(formatPropertiesMultiLine(node.getProperties()));
new CreateTable(QualifiedName.of("foo"), ImmutableList.of( new ColumnDefinition(identifier("a"), "VARCHAR", emptyList(), Optional.empty()), Optional.empty())); assertStatement("CREATE TABLE IF NOT EXISTS bar (c TIMESTAMP)", new CreateTable(QualifiedName.of("bar"), ImmutableList.of(new ColumnDefinition(identifier("c"), "TIMESTAMP", emptyList(), Optional.empty())), true, new CreateTable(QualifiedName.of("bar"), ImmutableList.of(new ColumnDefinition(identifier("c"), "TIMESTAMP", ImmutableList.of( new Property(new Identifier("nullable"), BooleanLiteral.TRUE_LITERAL), new CreateTable(QualifiedName.of("bar"), ImmutableList.of( new LikeClause(QualifiedName.of("like_table"), Optional.empty())); assertStatement("CREATE TABLE IF NOT EXISTS bar (c TIMESTAMP, LIKE like_table)", new CreateTable(QualifiedName.of("bar"), ImmutableList.of( new ColumnDefinition(identifier("c"), "TIMESTAMP", emptyList(), Optional.empty()), Optional.empty())); assertStatement("CREATE TABLE IF NOT EXISTS bar (c TIMESTAMP, LIKE like_table, d DATE)", new CreateTable(QualifiedName.of("bar"), ImmutableList.of( new ColumnDefinition(identifier("c"), "TIMESTAMP", emptyList(), Optional.empty()),
@Override public CompletableFuture<?> execute(CreateTable statement, TransactionManager transactionManager, Metadata metadata, AccessControl accessControl, QueryStateMachine stateMachine) checkArgument(!statement.getElements().isEmpty(), "no columns for table"); QualifiedObjectName tableName = createQualifiedObjectName(session, statement, statement.getName()); Optional<TableHandle> tableHandle = metadata.getTableHandle(session, tableName); if (tableHandle.isPresent()) { if (!statement.isNotExists()) { throw new SemanticException(TABLE_ALREADY_EXISTS, statement, "Table '%s' already exists", tableName); for (TableElement element : statement.getElements()) { Type type = metadata.getType(parseTypeSignature(element.getType())); if ((type == null) || type.equals(UNKNOWN)) { statement.getProperties(), session, metadata);