def _apply_field_ast( self, schema: s_schema.Schema, context: sd.CommandContext, node: qlast.DDLOperation, op: sd.AlterObjectProperty, ) -> None: assert isinstance(node, qlast.CreateCast) new_value: Any = op.new_value if op.property == 'from_type': # In a cast we can only have pure types, so this is going # to be a TypeName. node.from_type = cast(qlast.TypeName, utils.typeref_to_ast(schema, new_value)) elif op.property == 'to_type': # In a cast we can only have pure types, so this is going # to be a TypeName. node.to_type = cast(qlast.TypeName, utils.typeref_to_ast(schema, new_value)) elif op.property == 'code': if node.code is None: node.code = qlast.CastCode() node.code.code = new_value elif op.property == 'language': if node.code is None: node.code = qlast.CastCode() node.code.language = new_value elif op.property == 'from_function' and new_value: if node.code is None: node.code = qlast.CastCode() node.code.from_function = new_value elif op.property == 'from_expr' and new_value: if node.code is None: node.code = qlast.CastCode() node.code.from_expr = new_value elif op.property == 'from_cast' and new_value: if node.code is None: node.code = qlast.CastCode() node.code.from_cast = new_value else: super()._apply_field_ast(schema, context, node, op)
def reduce_FROM_Identifier_EXPRESSION(self, *kids): lang = commondl._parse_language(kids[1]) if lang != qlast.Language.SQL: raise EdgeQLSyntaxError( f'{lang} language is not supported in FROM EXPRESSION clause', context=kids[1].context) from None self.val = qlast.CastCode(language=lang)
def reduce_FROM_Identifier_BaseStringConstant(self, *kids): lang = commondl._parse_language(kids[1]) if lang not in {qlast.Language.SQL, qlast.Language.EdgeQL}: raise EdgeQLSyntaxError( f'{lang} language is not supported in FROM clause', context=kids[1].context) from None self.val = qlast.CastCode(language=lang, code=kids[2].val.value)
def _process_cast_body(self, block): props = {} commands = [] from_function = None from_expr = False from_cast = False allow_implicit = False allow_assignment = False code = None for node in block.val: if isinstance(node, qlast.CastCode): if node.from_function: if from_function is not None: raise EdgeQLSyntaxError( 'more than one FROM FUNCTION clause', context=node.context) from_function = node.from_function elif node.code: if code is not None: raise EdgeQLSyntaxError( 'more than one FROM <code> clause', context=node.context) code = node.code elif node.from_cast: # FROM SQL CAST if from_cast: raise EdgeQLSyntaxError( 'more than one FROM CAST clause', context=node.context) from_cast = True else: # FROM SQL EXPRESSION if from_expr: raise EdgeQLSyntaxError( 'more than one FROM EXPRESSION clause', context=node.context) from_expr = True elif isinstance(node, CastUseValue): if node.use == 'IMPLICIT': allow_implicit = True elif node.use == 'ASSIGNMENT': allow_assignment = True else: raise EdgeQLSyntaxError( 'unexpected ALLOW clause', context=node.context) else: commands.append(node) if (code is None and from_function is None and not from_expr and not from_cast): raise EdgeQLSyntaxError( 'CREATE CAST requires at least one FROM clause', context=block.context) else: if from_expr and (from_function or code or from_cast): raise EdgeQLSyntaxError( 'FROM SQL EXPRESSION is mutually exclusive with other ' 'FROM variants', context=block.context) if from_cast and (from_function or code or from_expr): raise EdgeQLSyntaxError( 'FROM SQL CAST is mutually exclusive with other ' 'FROM variants', context=block.context) props['code'] = qlast.CastCode( language=qlast.Language.SQL, from_function=from_function, from_expr=from_expr, from_cast=from_cast, code=code, ) props['allow_implicit'] = allow_implicit props['allow_assignment'] = allow_assignment if commands: props['commands'] = commands return props