예제 #1
0
    def ejecutar(self,ts):
        if TRef.databaseExist(self.nombre):
            if not self.existencia:
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.duplicate_database), 0)

        exito = 0
        databases = DBMS.showDatabases()

        if self.reemplazo:
            if self.nombre in databases: #Eliminamos si existe 
                DBMS.dropDatabase(self.nombre)
                TRef.dropDatabase(self.nombre)
            exito = DBMS.createDatabase(self.nombre)
        elif self.existencia:
            if not self.nombre in databases:
                exito = DBMS.createDatabase(self.nombre)
        else:
            exito = DBMS.createDatabase(self.nombre)

        #Si tenemos exito se crea en el type reference
        if exito == 1:
            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.invalid_schema_definition), 0)
        elif exito == 2:
            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.duplicate_database), 0)
            
        TRef.createDatabase(self.nombre, self.modo)
        return "Database '" + self.nombre + "' succesful created"
예제 #2
0
    def ejecutar(self, ts):
        if self.tipo == ALTER_TABLE_ADD.FOREIGN_KEY:
            if not TRef.tableExist(DB_ACTUAL.getName(),self.accion[0]):
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_fdw_error.fdw_table_not_found), 0) 
            if not TRef.columnExist(DB_ACTUAL.getName(), self.accion[0], self.accion[1]):
                    return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_fdw_error.fdw_invalid_column_number), 0)
            return (self.nombre,self.accion)
        elif self.tipo == ALTER_TABLE_ADD.MULTI_FOREIGN_KEY:
            if not TRef.tableExist(DB_ACTUAL.getName(),self.accion[0]):
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_fdw_error.fdw_table_not_found), 0) 

            #Comparamos que la misma cantidad de ids propios sea igual a la foranea
            if len(self.nombre) != len(self.accion[1]):
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_data_exception.data_exception), 0)

            for col in self.accion[1]:
                if not TRef.columnExist(DB_ACTUAL.getName(), self.accion[0], col):
                    return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_fdw_error.fdw_invalid_column_number), 0)

            listaSin = list()
            for i in range(len(self.nombre)):
                listaSin.append( (self.nombre[i], self.accion[0], self.accion[1][i]) )

            return listaSin

        return (self.nombre, self.accion)
예제 #3
0
    def ejecutar(self, ts):
        if DB_ACTUAL.getName() == None:
            return ErrorReport('Semantico', 'Not defined database to used', 0)
        elif not TRef.databaseExist(DB_ACTUAL.getName()):
            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_invalid_schema_name.invalid_schema_name), 0)
        elif not TRef.tableExist(DB_ACTUAL.getName(), self.tabla):
            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.undefined_table), 0)

        if isinstance(self.accion, list):
            for subaccion in self.accion:
                sint = subaccion.ejecutar(ts)
                #Si es un error, solo se retorna
                if isinstance(sint, ErrorReport):
                    return sint
        elif isinstance(self.accion, AlterField):
            #Comprobamos la existencia del campo
            if not TRef.columnExist(DB_ACTUAL.getName(),self.tabla,self.accion.campo):
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.undefined_column), 0)
            
            if self.accion.cantidad:
                sint = self.accion.ejecutar(ts)
                if isinstance(sint, int):
                    print(TRef.alterField(DB_ACTUAL.getName(), self.tabla, self.accion.campo, 'Type', TYPE_COLUMN.VARCHAR.value))
                    print(TRef.alterField(DB_ACTUAL.getName(), self.tabla, self.accion.campo, 'Lenght', sint))
                elif isinstance(sint, tuple):
                    print(TRef.alterField(DB_ACTUAL.getName(), self.tabla, self.accion.campo, 'Type', sint[0].value))
                    print(TRef.alterField(DB_ACTUAL.getName(), self.tabla, self.accion.campo, 'Lenght', sint[1]))
                else:
                    print(TRef.alterField(DB_ACTUAL.getName(), self.tabla, self.accion.campo, 'Type', sint))
                    print(TRef.alterField(DB_ACTUAL.getName(), self.tabla, self.accion.campo, 'Lenght', None))
            else:
                print(TRef.alterField(DB_ACTUAL.getName(), self.tabla, self.accion.campo, 'Null', False))
        elif isinstance(self.accion, AlterTableDrop):
            if self.accion.tipo == ALTER_TABLE_DROP.COLUMN:
                sint = self.accion.ejecutar(ts)
                #Comprobamos la existencia del campo
                if not TRef.columnExist(DB_ACTUAL.getName(),self.tabla,self.accion.campo):
                    return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.undefined_column), 0)
                dropField = TRef.alterDropColumn(DB_ACTUAL.getName(), self.tabla, sint)
                if dropField == 1:
                    return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_data_exception.data_exception), 0)
                elif dropField == 4:
                    return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_integrity_constraint_violation.integrity_constraint_violation), 0)
                elif dropField == 6:
                    return ErrorReport('Semantico', 'Error: A table cannot be empty', 0)
            else:
                if not TRef.constraintExist(self.accion.nombre):
                    return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_integrity_constraint_violation.integrity_constraint_violation), 0)
                colPres = TRef.getConstraint(DB_ACTUAL.getName(),self.tabla, self.accion.nombre)
                if not isinstance(colPres, tuple):
                    return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_data_exception.data_exception), 0)
                TRef.alterField(DB_ACTUAL.getName(), self.tabla, colPres[0], colPres[1], None)


        return 'Alter table complete'
예제 #4
0
    def ejecutar(self, ts):
        if DB_ACTUAL.getName() == None:
            return ErrorReport('Semantico', 'Not defined database to used', 0)
        elif not TRef.databaseExist(DB_ACTUAL.getName()):
            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_invalid_schema_name.invalid_schema_name), 0)
        elif TRef.tableExist(DB_ACTUAL.getName(), self.tabla):
            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.undefined_table), 0)

        DBMS.dropTable(DB_ACTUAL.getName(), self.tabla)
        TRef.dropTable(DB_ACTUAL.getName(), self.tabla)
        return 'Successful table dropped'        
예제 #5
0
 def ejecutar(self, ts):
     unario = self.exp.ejecutar(ts)
     if isinstance(unario, ErrorReport):
         return unario  # si ya viene un error solo lo retorna
     if not (isinstance(unario, ExpresionNumero)):
         return ErrorReport('semantico', 'Error , Tipe Invalido UNARIO "+"',
                            self.linea)
     try:
         return ExpresionNumero(unario.val, unario.tipo, self.linea)
     except:
         return ErrorReport('semantico', 'Error , Tipe Invalido UNARIO "+"',
                            self.linea)
예제 #6
0
 def ejecutar(self, ts):
     
     if self.parametro2 != None and self.parametro3 != None: # 3 PARAMETROS
         res1 = self.parametro1.ejecutar(ts)
         res2 = self.parametro2.ejecutar(ts)
         res3 = self.parametro3.ejecutar(ts)
         if isinstance(res1 , ErrorReport):
             return res1
         if isinstance(res2 , ErrorReport):
             return res2
         if isinstance(res3 , ErrorReport):
             return res3
         
         if self.funcion == "SUBSTRING" or self.funcion == "SUBSTR":
             if isinstance(res1 , ExpresionID) or isinstance(res1 , ExpresionCadena):
                 if isinstance(res2 , ExpresionNumero) or isinstance(res3 , ExpresionNumero):
                     if res2.tipo == TIPO_DE_DATO.ENTERO and res3.tipo == TIPO_DE_DATO.ENTERO:
                         print("RETORNA: "+ str(res1)[int(res2.val) : int(res3.val)])
                         return ExpresionCadena(str(res1)[int(res2.val) : int(res3.val)], TIPO_DE_DATO.CADENA , self.linea)
                 # si no entra hasta el ultimo if  llega aca 
                 return ErrorReport('semantico', 'error de tipo en el parametro 2 o parametro 3' ,self.linea)
             else:
                 return ErrorReport('semantico', 'error de tipo en el parametro 1' ,self.linea)
        
         
     elif self.parametro2 != None:       # 2 PARAMETROS
         print("2 parametros")
         
     elif self.parametro1 != None:       # 1 PARAMETRO
         nodoSimplificado = self.parametro1.ejecutar(ts)
         if isinstance(nodoSimplificado , ErrorReport):
             return nodoSimplificado # SOLO SE SUBE EL ERROR
     
         if self.funcion == "LENGTH":
             if  isinstance(nodoSimplificado , ExpresionCadena) or isinstance(nodoSimplificado , ExpresionID):
                 print("RETORNA: "+ str(len(nodoSimplificado.val)))
                 return ExpresionNumero(len(nodoSimplificado.val), TIPO_DE_DATO.ENTERO , self.linea)
             else:
                 return ErrorReport('semantico', 'error de tipo' ,self.linea)
         elif self.funcion == "TRIM":
             if  isinstance(nodoSimplificado , ExpresionCadena) or isinstance(nodoSimplificado , ExpresionID):
                 print("RETORNA: "+ str((nodoSimplificado.val)).strip())
                 return ExpresionCadena(str((nodoSimplificado.val)).strip(), TIPO_DE_DATO.CADENA , self.linea)
             else:
                 return ErrorReport('semantico', 'error de tipo' ,self.linea)
         elif self.funcion == "MD5":
             if  isinstance(nodoSimplificado , ExpresionCadena) or isinstance(nodoSimplificado , ExpresionID):
                 return ExpresionCadena(hashlib.md5(nodoSimplificado.val.encode()).hexdigest(), TIPO_DE_DATO.CADENA , self.linea)
             else:
                 return ErrorReport('semantico', 'error de tipo' ,self.linea)
         elif self.funcion == "SHA256":
             if  isinstance(nodoSimplificado , ExpresionCadena) or isinstance(nodoSimplificado , ExpresionID):
                 return ExpresionCadena(hashlib.sha256(nodoSimplificado.val.encode()).hexdigest(), TIPO_DE_DATO.CADENA , self.linea)
예제 #7
0
    def ejecutar(self, ts):
        if not TRef.databaseExist(self.nombre):
            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_invalid_schema_name.invalid_schema_name), 0)

        if self.accion[0] == 'OWNER':
            pass
        else:
            #Comprobamos que no exista una base de datos con ese nombre
            if TRef.databaseExist(self.accion[1]):
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.duplicate_database), 0)
            DBMS.alterDatabase(self.nombre, self.accion[1])
            TRef.alterDatabase(self.nombre, self.accion[1])
        return 0
예제 #8
0
    def ejecutar(self, ts):
        izq = self.exp1.ejecutar(ts)
        der = self.exp2.ejecutar(ts)

        if isinstance(izq, ErrorReport):
            return izq
        if isinstance(der, ErrorReport):
            return der
        # como expresionNumero abarca tanto decimales como enteros
        if isinstance(izq, ExpresionNumero) and isinstance(
                izq, ExpresionNumero):
            if self.operador == OPERACION_RELACIONAL.DESIGUAL:
                return ExpresionBooleano(izq.val != der.val, self.linea)
            elif self.operador == OPERACION_RELACIONAL.IGUAL:
                return ExpresionBooleano(izq.val == der.val, self.linea)
            elif self.operador == OPERACION_RELACIONAL.MAYOR:
                return ExpresionBooleano(izq.val > der.val, self.linea)
            elif self.operador == OPERACION_RELACIONAL.MAYORIGUAL:
                return ExpresionBooleano(izq.val >= der.val, self.linea)
            elif self.operador == OPERACION_RELACIONAL.MENOR:
                return ExpresionBooleano(izq.val < der.val, self.linea)
            elif self.operador == OPERACION_RELACIONAL.MENORIGUAL:
                return ExpresionBooleano(izq.val <= der.val, self.linea)
        elif isinstance(izq, ExpresionCadena) and isinstance(
                izq, ExpresionCadena):
            if self.operador == OPERACION_RELACIONAL.DESIGUAL:
                return ExpresionBooleano(izq.val != der.val, self.linea)
            elif self.operador == OPERACION_RELACIONAL.IGUAL:
                return ExpresionBooleano(izq.val == der.val, self.linea)
        else:
            return ErrorReport('semantico',
                               'Error de tipos , en Operacion Relacional',
                               self.linea)
예제 #9
0
    def ejecutar(self, ts):
        lista = list()
        for item in self.lista:
            if not item.val in lista:
                lista.append(item.val)

        if not TEnum.insertEnum(self.nombre, lista):
            return ErrorReport('Semantico', 'Invalid Enum Declaration', self.lista[0].linea)
        return 'Enum \'' + self.nombre + '\' succesful created'
예제 #10
0
    def ejecutar(self, ts):
        if not TRef.databaseExist(DB_ACTUAL.getName()):
            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_fdw_error.fdw_schema_not_found), 0)
        elif not TRef.tableExist(DB_ACTUAL.getName(),self.otraTabla):
            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_fdw_error.fdw_table_not_found), 0) 

        #Comparamos que la misma cantidad de ids propios sea igual a la foranea
        if len(self.lista) != len(self.listaOtraTabla):
            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_data_exception.data_exception), 0)

        for col in self.listaOtraTabla:
            if not TRef.columnExist(DB_ACTUAL.getName(), self.otraTabla, col):
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_fdw_error.fdw_invalid_column_number), 0)

        listaSin = list()
        for i in range(len(self.lista)):
            listaSin.append( (self.lista[i], self.otraTabla, self.listaOtraTabla[i]) )

        return listaSin
예제 #11
0
    def metodo_width_bucket(self, lista_numeros):
        if len(lista_numeros) == 4:
            # EXPRESION , MIN_VALLUE , MAX_VALUE , N_BLOQUES

            pass
        else:
            return ErrorReport(
                'sintactico',
                'error en width_bucket se esperaba solo 4 parametros',
                self.linea)
예제 #12
0
    def ejecutar(self, ts):
        if not TRef.databaseExist(self.db):
            if self.existencia:
                return "Drop Database: Database doesn't exist"
            else:
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_invalid_schema_name.invalid_schema_name), 0)

        DBMS.dropDatabase(self.db)
        TRef.dropDatabase(self.db)

        return 'Successful database dropped'
예제 #13
0
 def ejecutar(self, ts):
     izq = self.exp1.ejecutar(ts)
     der = self.exp2.ejecutar(ts)
 
     # como expresionNumero abarca tanto decimales como enteros 
     if (isinstance(izq,ExpresionNumero) and isinstance(izq,ExpresionNumero)) or (isinstance(izq,ExpresionCadena) and isinstance(izq,ExpresionCadena)):
         if self.operador == OPERACION_BINARIA_IS.IS_NOT_DISTINCT_FROM:
             return ExpresionBooleano(izq.val == der.val, self.linea)
         elif self.operador == OPERACION_BINARIA_IS.IS_DISTINCT_FROM:
             return ExpresionBooleano(izq.val != der.val, self.linea)
     else:
         return ErrorReport('semantico', 'Error de tipos , en Operacion Relacional' ,self.linea)
예제 #14
0
 def ejecutar(self, ts):
     # Verificar si existe la columna
     if self.cantidad:
         if isinstance(self.cantidad, int):
             if self.cantidad < 0:
                 return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_data_exception.numeric_value_out_of_range),0)
             return self.cantidad
         elif isinstance(self.cantidad, tuple):
             return self.cantidad
         else:
             return self.cantidad.value
     else:
         return False
예제 #15
0
    def ejecutar(self, ts):
        columnas = []
        filas = []
        for actual in self.campos:
            if isinstance(actual, ITEM_ALIAS):
                if isinstance(actual.item, ExpresionID):
                    print("Error semántico, solo se aceptan expresiones.")
                    sqlTypeError = sqlErrors.sql_error_data_exception.invalid_parameter_value
                    return ErrorReport(
                        'Semántico', "ERROR " + sqlTypeError.value + ": " +
                        str(sqlTypeError.name), self.linea)
                elif isinstance(actual.item, Expresion):
                    filas.append(actual.item.ejecutar(ts).val)
                    columnas.append(actual.alias)
                else:
                    print("Error semántico, solo se aceptan expresiones.")
                    sqlTypeError = sqlErrors.sql_error_data_exception.invalid_parameter_value
                    return ErrorReport(
                        'Semántico', "ERROR " + sqlTypeError.value + ": " +
                        str(sqlTypeError.name), self.linea)
            elif isinstance(actual, ExpresionID):
                print("Error semántico, solo se aceptan expresiones.")
                sqlTypeError = sqlErrors.sql_error_data_exception.invalid_parameter_value
                return ErrorReport(
                    'Semántico', "ERROR " + sqlTypeError.value + ": " +
                    str(sqlTypeError.name), self.linea)
            elif isinstance(actual, Expresion):
                filas.append(actual.ejecutar(ts).val)
                columnas.append('???')
                print("Error semántico, solo se aceptan expresiones.")
                sqlTypeError = sqlErrors.sql_error_data_exception.invalid_parameter_value
                return ErrorReport(
                    'Semántico', "ERROR " + sqlTypeError.value + ": " +
                    str(sqlTypeError.name), self.linea)

        salida = matriz(columnas, [filas], TABLA_TIPO.SELECT_SIMPLE,
                        "nueva tabla", None, None)
        return salida.ejecutar(ts)
예제 #16
0
 def ejecutar(self, ts):
     unario = self.exp.ejecutar(ts)
     if isinstance(unario , ErrorReport):
         return unario # si ya viene un error solo lo retorna
     if not (isinstance(unario , ExpresionNumero)):
         return ErrorReport('semantico', f'Error , Tipe Invalido UNARIO {self.operador}' ,self.linea)
 
     
     try:# CASOS DE EJECUCION
         if self.operador == "~":
             if GET_TIPO(unario.val) == TIPO_DE_DATO.ENTERO:
                 return ExpresionNumero(~ unario.val, GET_TIPO(unario.val), self.linea)
             else:
                 return ErrorReport('semantico', 'error operador Unario ~ solo recibe ENTEROS' ,self.linea)
         elif self.operador =="|": # SACA LA RAIZ CUADRADA
                 if (unario.val) < 0:
                     return ErrorReport('semantico', 'error operador Unario | solo recibe numeros POSITIVOS' ,self.linea)
                     valor = unario.val**(1/2)
                     return ExpresionNumero(valor,GET_TIPO(valor),self.linea)
         elif self.operador =="||": # SACA LA RAIZ CUBICA
                     valor = raizCubica(unario.val)
                     return ExpresionNumero(valor,GET_TIPO(valor),self.linea)    
     except:
         return ErrorReport('semantico', f'Error: Tipe Invalido UNARIO {self.operador}' ,self.linea)  
예제 #17
0
 def ejecutar(self, ts):
     izq = self.exp1.ejecutar(ts)
     der = self.exp2.ejecutar(ts)
     # por si se quiere operar un error con una expresion buena ,  retorna de una el error
     if isinstance(izq , ErrorReport):
         return izq
     if isinstance(der , ErrorReport):
         return der
     
     if izq.tipo == TIPO_DE_DATO.BOOLEANO and der.tipo == TIPO_DE_DATO.BOOLEANO:
         if self.operador == OPERACION_LOGICA.AND:
             return ExpresionBooleano(izq.val and der.val,self.linea)
         elif self.operador == OPERACION_LOGICA.OR:
             return ExpresionBooleano(izq.val or der.val, self.linea)
     else:
         return ErrorReport('semantico', 'Error , se esta operando con valores No booleanos' ,self.linea)
예제 #18
0
 def metodo_width_bucket(self , lista_numeros , ts):
     if len(lista_numeros) == 4:
         #EXPRESION , MIN_VALLUE , MAX_VALUE , N_BLOQUES
         valorPrueba = lista_numeros[0].ejecutar(ts)
         if isinstance(valorPrueba , ErrorReport):
             return valorPrueba
         rangoInicial = lista_numeros[1].ejecutar(ts)
         if isinstance(rangoInicial , ErrorReport):
             return rangoInicial
         rangoMax = lista_numeros[2].ejecutar(ts)
         if isinstance(rangoMax , ErrorReport):
             return rangoMax
         nBloques = lista_numeros[3].ejecutar(ts)
         if isinstance(nBloques , ErrorReport):
             return nBloques
         # validacion de tipo numerico , 
         if not isinstance(valorPrueba , ExpresionNumero):
             return ErrorReport('sintactico', 'Error solo se acepta un tipo numero' ,self.linea)
         if not isinstance(rangoInicial, ExpresionNumero):
             return ErrorReport('sintactico', 'Error solo se acepta un tipo numero' ,self.linea)
         if not isinstance(rangoMax, ExpresionNumero):
             return ErrorReport('sintactico', 'Error solo se acepta un tipo numero' ,self.linea)
         if not isinstance(nBloques, ExpresionNumero):
             return ErrorReport('sintactico', 'Error solo se acepta un tipo numero' ,self.linea)
         if not self.getTipo(nBloques.val) == TIPO_DE_DATO.ENTERO:
             return ErrorReport('sintactico', 'Error solo se acepta un ENTERO en el ultimo parametro' ,self.linea)
             
         # dando los meros valores
         valorPrueba = valorPrueba.val
         rangoInicial = rangoInicial.val
         rangoMax = rangoMax.val
         nBloques = nBloques.val            
         if valorPrueba >= rangoMax:
             return ExpresionNumero(1 + nBloques,TIPO_DE_DATO.ENTERO,self.linea)
         elif valorPrueba < rangoInicial:
             return ExpresionNumero( (1-1)*0  , TIPO_DE_DATO.ENTERO,self.linea)
         else:
             diferencia = rangoMax-rangoInicial
             subIntervalos = diferencia/nBloques # _ , _ , _ , _ 
             auxUbicacion = 1
             aux = rangoInicial + subIntervalos
         while(not valorPrueba < aux):                    
             #print(str(aux - subIntervalos) +' , ' + str(aux))
             aux += subIntervalos
             auxUbicacion +=1
         return ExpresionNumero(auxUbicacion, TIPO_DE_DATO.ENTERO,self.linea)
     else:
         return ErrorReport('sintactico', 'error en width_bucket se esperaba solo 4 parametros' ,self.linea)
예제 #19
0
 def ejecutar(self, ts):
     ev = self.evaluado.ejecutar(ts)
     inf = self.limiteInferior.ejecutar(ts)
     sup = self.limiteSuperior.ejecutar(ts)
     if isinstance(ev, ExpresionNumero) and isinstance(
             inf, ExpresionNumero) and isinstance(sup, ExpresionNumero):
         if self.tipo == BETWEEN.BETWEEN:
             return ExpresionBooleano(inf.val <= ev.val <= sup.val,
                                      self.linea)
         elif self.tipo == BETWEEN.NOT_BETWEEN:
             return ExpresionBooleano(not inf.val <= ev.val <= sup.val,
                                      self.linea)
         elif self.tipo == BETWEEN.BETWEEN_SYMMETRIC:
             return ExpresionBooleano(
                 (inf.val <= ev.val <= sup.val) ^
                 (ev.val <= inf.val or sup.val <= ev.val), self.linea)
         elif self.tipo == BETWEEN.NOT_BETWEEN_SYMMETRIC:
             return ExpresionBooleano(
                 not ((inf.val <= ev.val <= sup.val) ^
                      (ev.val <= inf.val or sup.val <= ev.val)), self.linea)
     else:
         return ErrorReport('semantico',
                            'Error de tipos , en Operacion Relacional',
                            self.linea)
예제 #20
0
def t_error(t):
    print(f'Error lexico: {t.value[0]}')
    error = ErrorReport('lexico', f'error lexico con {t.value[0]}', t.lineno)
    listaErrores.addError(error)
    t.lexer.skip(1)
예제 #21
0
    def ejecutar(self, ts = None):            
        if self.parametro2 != None: # 2 PARAMETROS
            nodoSyn1 = self.parametro1.ejecutar(ts)
            if isinstance(nodoSyn1 , ErrorReport):
                return nodoSyn1
            nodoSyn2 = self.parametro2.ejecutar(ts)
            if isinstance(nodoSyn2 , ErrorReport):
                return nodoSyn2

            if isinstance(nodoSyn1 , ExpresionNumero) and isinstance(nodoSyn2 , ExpresionNumero):
                
                if self.funcion == "ATAN2":
                    rads = math.atan2(nodoSyn1.val,nodoSyn2.val)
                    return ExpresionNumero(rads,self.getTipo(rads),self.linea) 
                
                if self.funcion == "ATAN2D":
                    rads = math.atan2(nodoSyn1.val,nodoSyn2.val)
                    grados = (rads * 180/math.pi)
                    return ExpresionNumero(grados,self.getTipo(grados),self.linea)
                
                if self.funcion == "DIV":
                    
                    izq = nodoSyn1.val
                    der = nodoSyn2.val
                    if der == 0:
                        return ErrorReport('semantico', 'error DIVISION entre 0' ,self.linea)
                    valor = izq/der
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion =="GCD":
                    valor = math.gcd(nodoSyn1.val , nodoSyn2.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion =="MOD":
                    try:
                        valor = (nodoSyn1.val % nodoSyn2.val)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea)                  
                    except:
                        return ErrorReport('semantico', 'error en MODULO' ,self.linea) 
                
                if self.funcion =="POWER":
                    try:
                        valor = (nodoSyn1.val ** nodoSyn2.val)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea)                  
                    except:
                        return ErrorReport('semantico', 'error en MODULO' ,self.linea)
                
                if self.funcion =="ROUND":
                    valor = round(nodoSyn1.val , nodoSyn2.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion == "TRUNC": 
                    if self.getTipo(nodoSyn2.val) != TIPO_DE_DATO.ENTERO:
                        return ErrorReport('semantico', 'error en Metodo TRUNC el segundo parametro tiene que ser un entero' ,self.linea)
                    cadenaInt = str(nodoSyn1.val)
                    numero_truncado = ''
                    indice = 0
                    decimalesAdjuntados = 0
                    for i in range(len(cadenaInt)):
                        if cadenaInt[i] == '.':
                            numero_truncado += cadenaInt[i]
                            indice = i
                            break
                        else:
                            numero_truncado += cadenaInt[i]
                    indice+=1        
                    while(decimalesAdjuntados < nodoSyn2.val):
                        
                        if  indice < len(cadenaInt):
                            numero_truncado += cadenaInt[indice]
                        else:
                            numero_truncado += '0'
                        
                        indice+=1
                        decimalesAdjuntados+=1
                    valor = float(numero_truncado)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea) 
            else:
                return ErrorReport('semantico', 'error de tipo, se esperaba un ENTERO O DECIMAL' ,self.linea)
        elif self.parametro1 != None: # 1 PARAMETRO
            
            if  isinstance(self.parametro1,list):
                if self.funcion =="WIDTH_BUCKET":
                    return self.metodo_width_bucket(self.parametro1,ts)
            
            
            nodoSyn1 = self.parametro1.ejecutar(ts)
            if isinstance(nodoSyn1 , ErrorReport):
                return nodoSyn1
            
            if isinstance(nodoSyn1 , ExpresionNumero): # decimales y eneteros
                if self.funcion == "ACOS": # RADIANEES
                    if nodoSyn1.val > 1 or nodoSyn1.val < 1:
                        return ErrorReport('semantico', 'Error en ACOS ,el parametro debe estar entre -1 y 1' ,self.linea)   
                    return ExpresionNumero(math.acos(nodoSyn1.val),self.getTipo(nodoSyn1.val),self.linea)
                
                if self.funcion == "ACOSD": # GRADOS 
                    if nodoSyn1.val > 1 or nodoSyn1.val < 1:
                        return ErrorReport('semantico', 'Error en ACOSD , el parametro debe estar entre -1 y 1' ,self.linea)   
                    rads = math.acos(nodoSyn1.val)
                    grados = (rads * 180/math.pi)
                    return ExpresionNumero(grados,self.getTipo(grados),self.linea)
                
                if self.funcion == "ASIN":
                    if nodoSyn1.val > 1 or nodoSyn1.val < 1:
                        return ErrorReport('semantico', 'Error en ASIN ,el parametro debe estar entre -1 y 1' ,self.linea)   
                    valor = math.asin(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion == "ASIND":
                    if nodoSyn1.val > 1 or nodoSyn1.val < 1:
                        return ErrorReport('semantico', 'Error en ASIND ,el parametro debe estar entre -1 y 1' ,self.linea)   
                    rads = math.asin(nodoSyn1.val)
                    grados = (rads * 180/math.pi)
                    return ExpresionNumero(grados,self.getTipo(grados),self.linea)
                
                if self.funcion == "ATAN":
                    try:
                        rads = math.atan(nodoSyn1.val)
                        return ExpresionNumero(rads,self.getTipo(rads),self.linea)
                    except:
                        return ErrorReport('semantico', 'Error en ATAN por el valor del parametro ' ,self.linea)

                if self.funcion == "ATAND":    
                    try:
                        rads = math.atan(nodoSyn1.val)
                        grados = (rads * 180/math.pi)
                        return ExpresionNumero(grados,self.getTipo(grados),self.linea)
                    except:
                        return ErrorReport('semantico', 'Error en ATAND por el valor del parametro ' ,self.linea)

                if self.funcion == "COS":
                    valor = math.cos(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion == "COSD":
                    rads = math.cos(nodoSyn1.val)
                    grados = (rads * 180/math.pi)
                    return ExpresionNumero(grados,self.getTipo(grados),self.linea)
                
                if self.funcion == "COT":
                    tangente=math.tan(nodoSyn1.val)
                    if tangente == 0:
                        return ErrorReport('semantico', 'Error en COT por el valor del parametro ' ,self.linea)
                    cot = 1 / tangente   
                    return ExpresionNumero(cot,self.getTipo(cot),self.linea)
                
                if self.funcion == "COTD":
                    tangente=math.tan(nodoSyn1.val)
                    if tangente == 0:
                        return ErrorReport('semantico', 'Error en COTD por el valor del parametro ' ,self.linea)
                    cot =math.degrees(1 / tangente)    
                    return ExpresionNumero(cot,self.getTipo(cot),self.linea)  

                if self.funcion == "SIN":
                    radianes=math.sin(nodoSyn1.val)
                    return ExpresionNumero(radianes,self.getTipo(radianes),self.linea)  
            
                if self.funcion == "SIND":
                    grados=math.degrees(math.sin(nodoSyn1.val))
                    return ExpresionNumero(grados,self.getTipo(grados),self.linea)
            
                if self.funcion == "TAN":
                    try:
                        radianes=math.tan(nodoSyn1.val)
                        return ExpresionNumero(radianes,self.getTipo(radianes),self.linea) 
                    except:
                        return ErrorReport('semantico', 'Error en TAN por el valor del parametro ' ,self.linea)

                if self.funcion == "TAND":
                    try:
                        grados=math.degrees(math.tan(nodoSyn1.val))
                        return ExpresionNumero(grados,self.getTipo(grados),self.linea) 
                    except:
                        return ErrorReport('semantico', 'Error en TAND por el valor del parametro ' ,self.linea)
                
                if self.funcion == "COSH":
                    try:
                        valor=math.cosh(nodoSyn1.val)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea) 
                    except:
                        return ErrorReport('semantico', 'Error en COSH por el valor del parametro ' ,self.linea)
                    
                
                if self.funcion == "SINH":
                    try:
                        valor=math.sinh(nodoSyn1.val)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea) 
                    except:
                        return ErrorReport('semantico', 'Error en SINH por el valor del parametro ' ,self.linea)
                    
                if self.funcion == "TANH":
                    try:
                        valor=math.tanh(nodoSyn1.val)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea) 
                    except:
                        return ErrorReport('semantico', 'Error en TANH por el valor del parametro ' ,self.linea)
                    
                    
                if self.funcion == "ACOSH":
                    if nodoSyn1.val < 1:
                        return ErrorReport('semantico', 'Error en ACOSH, el parametro debe de ser mayor o igual a 1 ' ,self.linea)
                    valor=math.acosh(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion == "ASINH":
                    valor=math.asinh(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion == "ATANH":
                    if nodoSyn1.val > 0.99 or nodoSyn1.val < -0.99:
                        return ErrorReport('semantico', 'Error en ATANH, el parametro debe estar entre 0.99 y -0.99 ' ,self.linea)
                    valor=math.atanh(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                #_________________________________ fin de trigonometricas
                
                if self.funcion == "ABS":
                    valor=math.fabs(nodoSyn1.val)                    
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)

                    
                if self.funcion == "CBRT": #RAIZ CUBICA SOLO PARA ENTREROS
                    if (nodoSyn1.val % 1) == 0:
                        valor = raizCubica(nodoSyn1.val)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea)  
                    else:
                        return ErrorReport('semantico', 'error CBRT solo recibe enteros, NO decimales' ,self.linea)
                
                if self.funcion =="CEIL" or self.funcion == "CEILING":
                    valor = math.ceil(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion =="DEGREES":
                    valor = math.degrees(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion =="FACTORIAL":
                    valor = math.factorial(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                if self.funcion =="FLOOR":# POR SI VIENE EN UN INSERT  
                    valor = math.floor(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                
                                
                if self.funcion =="LN":
                    try:
                        valor = math.log(nodoSyn1.val)
                        return  ExpresionNumero(valor,self.getTipo(valor),self.linea)
                    except :
                        return ErrorReport('semantico', 'error en el paramtro de LN' ,self.linea)

                
                if self.funcion =="LOG":
                    try:
                        valor = math.log10(nodoSyn1.val)
                        return  ExpresionNumero(valor,self.getTipo(valor),self.linea)    
                    except :
                        return ErrorReport('semantico', 'error en el paramtro de LOG' ,self.linea)
                
                if self.funcion =="EXP":
                    try:
                        valor = math.exp(nodoSyn1.val)
                        return  ExpresionNumero(valor,self.getTipo(valor),self.linea)    
                    except :
                        return ErrorReport('semantico', 'error en el paramtro de EXP' ,self.linea) 
                    
                if self.funcion =="RADIANS":
                    valor = math.radians(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)

                if self.funcion =="ROUND":
                    valor = round(nodoSyn1.val)
                    return ExpresionNumero(valor,self.getTipo(valor),self.linea)
                    
                if self.funcion =="SIGN":
                    if nodoSyn1.val > 0:
                        valor = 1
                        return ExpresionNumero(valor,TIPO_DE_DATO.ENTERO,self.linea)
                    if nodoSyn1.val < 0:
                        valor = -1
                        return ExpresionNumero(valor,TIPO_DE_DATO.ENTERO,self.linea)
                    else:
                        return ErrorReport('semantico', 'error en funcion SING , EL 0 no tiene signo ' ,self.linea)
                if self.funcion == "SQRT":
                    if (nodoSyn1.val) < 0 :
                        return ErrorReport('semantico', 'error SQRT solo recibe enteros POSITIVOS' ,self.linea)
                    if (nodoSyn1.val % 1) == 0:
                        valor = nodoSyn1.val**(1/2)
                        return ExpresionNumero(valor,self.getTipo(valor),self.linea)  
                    else:
                        return ErrorReport('semantico', 'error SQRT solo recibe enteros, NO decimales' ,self.linea)
                
                if self.funcion == "TRUNC":
                    valor = math.trunc(nodoSyn1.val)
                    return ExpresionNumero(valor,TIPO_DE_DATO.ENTERO,self.linea)
 
                
                    
                    

            else:
                return ErrorReport('semantico', 'error de tipo, se esperaba un ENTERO O DECIMAL' ,self.linea)    
                
        
        else:# SIN PARAMETROS
            
            if self.funcion == 'PI':
                return ExpresionNumero(math.pi,TIPO_DE_DATO.DECIMAL,self.linea)
            elif self.funcion == "RANDOM":
                valor = random.choice((1,0))
                return ExpresionNumero(valor,TIPO_DE_DATO.ENTERO,self.linea)
예제 #22
0
    def ejecutar(self, ts):#los que pueden venir en el select 
        if self.parametro1 != None and self.parametro2 != None:        
            if self.funcion == "EXTRACT":
                
                self.parametro2 = str(self.parametro2).strip()
                # AHORA REVISANDO SI TIENE COHERENCIA
                
                try:# EL PARAMETRO 2 ES MI CADENA DATE , PARAMETRO 2 ESPERADO  yyyy-mm-dd hh:mm:dd
                    objetodate = datetime.strptime(self.parametro2, '%Y-%m-%d %H:%M:%S')
                except:
                    return ErrorReport('semantico', 'error Incoherencia con la cadena date' ,self.linea)
                
                if self.parametro1 == "YEAR":
                    anio = str(objetodate.year)
                    return ExpresionNumero(int(anio), TIPO_DE_DATO.ENTERO,self.linea)
                    
                elif self.parametro1 == "MONTH":
                    mes = str(objetodate.month)
                    return ExpresionNumero(int(mes), TIPO_DE_DATO.ENTERO,self.linea)
    
                elif self.parametro1 == "DAY":
                    dia = str(objetodate.day)
                    return ExpresionNumero(int(dia), TIPO_DE_DATO.ENTERO,self.linea)
                        
                elif self.parametro1 == "HOUR":
                    hora = str(objetodate.hour)
                    return ExpresionNumero(int(hora), TIPO_DE_DATO.ENTERO,self.linea)
                
                elif self.parametro1 == "MINUTE":
                    minuto = str(objetodate.minute)
                    return ExpresionNumero(int(minuto), TIPO_DE_DATO.ENTERO,self.linea)
                    
                elif self.parametro1 == "SECOND":
                    seg = str(objetodate.second)
                    return ExpresionNumero(int(seg), TIPO_DE_DATO.ENTERO,self.linea)
            elif self.funcion == "DATE_PART":
                
                self.parametro2 = self.parametro2.lower().strip()
                valores = {}
                lexema = self.parametro2[0]
                x = 1 
                while(x < len(self.parametro2)):
                    lexema += self.parametro2[x]
                    if self.parametro2[x] == "s" and self.parametro2[x-1] != " " :
                        lexema = lexema.strip()
                        key = ''
                        val = ''
                        posIniKey = 0 
                        for i in range( len(lexema)):
                            if lexema[i] == ' ':
                                break
                            else:
                                val += lexema[i]
                                posIniKey = i
                                posIniKey +=1
                        
                        while(posIniKey < len(lexema)):
                            key += lexema[posIniKey]
                            posIniKey+=1
                        lexema = ""
                        key = key.strip()
                        validacion = valores.get(key , 'ok')
                        
                        if validacion == 'ok':
                            valores[key] = val
                        else:
                            return ErrorReport('sintactico', 'ERROR:  la sintaxis de entrada no es válida para tipo interval' ,self.linea)            
                    x+=1
                    
                

                if self.parametro1 == "HOUR" or self.parametro1 == "HOURS":
                    
                    valor = valores.get('hours','NO_ESTA')
                    if valor == 'NO_ESTA':
                        return ErrorReport('semantico', 'solicitud de horas en Interaval y no fue especificado en la cadena' ,self.linea) 
                    else:
                        return ExpresionNumero(int(valor), TIPO_DE_DATO.ENTERO,self.linea)
                    
                elif self.parametro1 == "MINUTE" or self.parametro1 == "MINUTE":
                    
                    valor = valores.get('minutes','NO_ESTA')
                    if valor == 'NO_ESTA':
                        return ErrorReport('semantico', 'solicitud de minutos en Interaval y no fue especificado en la cadena' ,self.linea) 
                    else:
                        return ExpresionNumero(int(valor), TIPO_DE_DATO.ENTERO,self.linea)

                elif self.parametro1 == "SECOND" or self.parametro1 == "SECONDS":
                    
                    valor = valores.get('seconds','NO_ESTA')
                    if valor == 'NO_ESTA':
                        return ErrorReport('semantico', 'solicitud de segundos en Interaval y no fue especificado en la cadena' ,self.linea) 
                    else:                   
                        return ExpresionNumero(int(valor), TIPO_DE_DATO.ENTERO,self.linea)
            else:
                print("funcion desconocida")
        elif self.parametro1 != None:
            if self.funcion == 'TIMESTAMP':
                hora_fecha_actual = str(datetime.now())[0:19]
                return ExpresionCadena(hora_fecha_actual,TIPO_DE_DATO.CADENA,self.linea)
            else:
                print("funcion desconocida")
        else:
            if self.funcion == "NOW":
                hora_fecha_actual = str(datetime.now())[0:19]
                return ExpresionCadena(hora_fecha_actual,TIPO_DE_DATO.CADENA,self.linea)
            elif self.funcion == "CURRENT_DATE":
                fecha_actual = str(datetime.now())[0:10]
                return ExpresionCadena(fecha_actual,TIPO_DE_DATO.CADENA,self.linea)
            elif self.funcion == "CURRENT_TIME":
                hora_actual = str(datetime.now())[11:19]
                return ExpresionCadena(hora_actual,TIPO_DE_DATO.CADENA,self.linea)
            elif self.funcion == "CURRENT_TIMESTAMP":
                hora_fecha_actual = str(datetime.now())[0:19]
                return ExpresionCadena(hora_fecha_actual,TIPO_DE_DATO.CADENA,self.linea)
예제 #23
0
    def ejecutar(self, ts):
        expizq = self.exp1.ejecutar(ts)
        expder = self.exp2.ejecutar(ts)
        # por si se quiere operar un error con una expresion buena ,  retorna de una el error
        if isinstance(expizq , ErrorReport):
            return expizq
        if isinstance(expder , ErrorReport):
            return expder
        # la UNICA EXPRESION QUE DEBE DE OPERAR ES UN ID-tipo-entero o un tipoentero de la expresion sumerica
        if not (isinstance(expizq , ExpresionNumero)  or isinstance(expizq , ExpresionID)):
            return ErrorReport('semantico', 'Error de tipo con el operando izquierdo' , self.linea )
        
        if not (isinstance(expder , ExpresionNumero)  or isinstance(expizq , ExpresionID)):
            return ErrorReport('semantico', 'Error de tipo con el operando Derecho' , self.linea )

        if self.operador == ">>" :
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val >> expder.val, TIPO_DE_DATO.ENTERO,self.linea) 
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando izquierdo en OPERADOR >>' , self.linea )
            elif expder.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando derecho en OPERADOR >>' , self.linea )

        elif self.operador == "<<":
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val << expder.val, TIPO_DE_DATO.ENTERO,self.linea) 
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando izquierdo en OPERADOR <<' , self.linea )
            elif expder.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando derecho en OPERADOR <<' , self.linea )
            
        elif self.operador == "#":
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                try:
                    valor = expizq.val ^ expder.val
                    return ExpresionNumero(valor, TIPO_DE_DATO.ENTERO , self.linea) 
                except:
                    return  ErrorReport('semantico', 'Error de Ejecucion con el OPERADOR | ', self.linea )
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando izquierdo en OPERADOR #' , self.linea )
            elif expder.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando derecho en OPERADOR #' , self.linea )
            else:
                return 0
        elif self.operador == "|":
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                try:
                    valor = expizq.val | expder.val
                    return ExpresionNumero(valor, TIPO_DE_DATO.ENTERO , self.linea) 
                except:
                    return  ErrorReport('semantico', 'Error de Ejecucion con el OPERADOR | ', self.linea )
                
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando izquierdo en OPERADOR |' , self.linea )
            elif expder.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando derecho en OPERADOR |' , self.linea )
            else:
                return 0
        elif self.operador == "&":

            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                try:
                    valor = expizq.val & expder.val
                    return ExpresionNumero(valor, TIPO_DE_DATO.ENTERO , self.linea) 
                except:
                    return  ErrorReport('semantico', 'Error de Ejecucion con el OPERADOR | ', self.linea )
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando izquierdo en OPERADOR #' , self.linea )
            elif expder.tipo == TIPO_DE_DATO.DECIMAL:
                return  ErrorReport('semantico', 'Error de tipo con el operando derecho en OPERADOR #' , self.linea )
        else:
            return  ErrorReport('semantico', 'Error Operador desconocido' , self.linea )
예제 #24
0
    def ejecutar(self, ts):
        expizq = self.exp1.ejecutar(ts)
        expder = self.exp2.ejecutar(ts)
        # por si se quiere operar un error con una expresion buena ,  retorna de una el error
        if isinstance(expizq, ErrorReport):
            return expizq
        if isinstance(expder, ErrorReport):
            return expder

        if self.operador == OPERACION_ARITMETICA.MAS:
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val + expder.val,
                                       TIPO_DE_DATO.ENTERO, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.DECIMAL:
                return ExpresionNumero(expizq.val + expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val + expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL and expder.tipo == TIPO_DE_DATO.DECIMAL:
                return ExpresionNumero(expizq.val + expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            else:
                return 0
        elif self.operador == OPERACION_ARITMETICA.MENOS:
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val - expder.val,
                                       TIPO_DE_DATO.ENTERO, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.DECIMAL:
                return ExpresionNumero(expizq.val - expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val - expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL and expder.tipo == TIPO_DE_DATO.DECIMAL:
                return ExpresionNumero(expizq.val - expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            else:

                return 0
        elif self.operador == OPERACION_ARITMETICA.POR:
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val * expder.val,
                                       TIPO_DE_DATO.ENTERO, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.DECIMAL:
                return ExpresionNumero(expizq.val * expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val * expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL and expder.tipo == TIPO_DE_DATO.DECIMAL:
                return ExpresionNumero(expizq.val * expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            else:

                return 0
        elif self.operador == OPERACION_ARITMETICA.DIVIDO:
            if expder.val != 0:
                if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                    return ExpresionNumero(expizq.val / expder.val,
                                           TIPO_DE_DATO.ENTERO, self.linea)
                elif expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.DECIMAL:
                    return ExpresionNumero(expizq.val / expder.val,
                                           TIPO_DE_DATO.DECIMAL, self.linea)
                elif expizq.tipo == TIPO_DE_DATO.DECIMAL and expder.tipo == TIPO_DE_DATO.ENTERO:
                    return ExpresionNumero(expizq.val / expder.val,
                                           TIPO_DE_DATO.DECIMAL, self.linea)
                elif expizq.tipo == TIPO_DE_DATO.DECIMAL and expder.tipo == TIPO_DE_DATO.DECIMAL:
                    return ExpresionNumero(expizq.val / expder.val,
                                           TIPO_DE_DATO.DECIMAL, self.linea)
                else:

                    return 0
            else:
                return ErrorReport('semantico', 'No se puede dividir entre 0',
                                   self.linea)
        elif self.operador == OPERACION_ARITMETICA.MODULO:
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val % expder.val,
                                       TIPO_DE_DATO.ENTERO, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.DECIMAL:
                return ExpresionNumero(expizq.val % expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val % expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL and expder.tipo == TIPO_DE_DATO.DECIMAL:
                return ExpresionNumero(expizq.val % expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            else:

                return 0
        elif self.operador == OPERACION_ARITMETICA.EXPONENTE:
            if expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(expizq.val**expder.val,
                                       TIPO_DE_DATO.ENTERO, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.ENTERO and expder.tipo == TIPO_DE_DATO.DECIMAL:
                return ExpresionNumero(expizq.val**expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL and expder.tipo == TIPO_DE_DATO.ENTERO:
                return ExpresionNumero(
                    int(expizq.val)**expder.val, TIPO_DE_DATO.ENTERO,
                    self.linea)
            elif expizq.tipo == TIPO_DE_DATO.DECIMAL and expder.tipo == TIPO_DE_DATO.DECIMAL:
                return ExpresionNumero(expizq.val**expder.val,
                                       TIPO_DE_DATO.DECIMAL, self.linea)
            else:

                return 0
예제 #25
0
    def ejecutar(self, ts):
        if DB_ACTUAL.getName() == None:
            return ErrorReport('Semantico', 'Not defined database to used', 0)
        elif not TRef.databaseExist(DB_ACTUAL.getName()):
            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_invalid_schema_name.invalid_schema_name), 0)
        elif TRef.tableExist(DB_ACTUAL.getName(), self.nombre):
            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.duplicate_table), 0)

        # Aux de comprobacion y almacenamiento
        columns = dict()
        auxFK = list()
        auxPK = list()
        auxUnique = list()
        auxCheck = list()

        # Proceso de las distintas columnas recibidas en la consulta
        for col in self.columnas:
            if isinstance(col, CreateField): #Columna nueva
                #Obtenemos cada columna y corroboramos que tengan nombres distintos
                if col.nombre in columns:
                    return 1
                else: 
                    colSint = col.ejecutar(ts)
                    if isinstance(colSint, ErrorReport):
                        return colSint
                    columns[col.nombre] = colSint
            elif isinstance(col, ConstraintMultipleFields): #Multiples Constraints
                if col.tipo == CONSTRAINT_FIELD.UNIQUE:
                    auxUnique.extend(col.ejecutar(ts))
                else:
                    auxPK.extend(col.ejecutar(ts))
            elif isinstance(col, ForeignKeyMultipleFields): #Multiples Llaves Foraneas
                colSint = col.ejecutar(ts)
                if isinstance(colSint, ErrorReport):
                    return colSint
                auxFK.extend(colSint)
            elif isinstance(col, CheckMultipleFields): #Multiple chequeos
                auxCheck.extend(col.ejecutar(ts))
            else:
                return col
        
        #Modificamos los valores dependiendo de las columnas multiples
        # Primary Key
        for pk in auxPK:
            # Se verifica que cada constraint haga referencia a un campo, de lo contrario será invalido
            if not pk in columns:
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.invalid_column_reference), 0)
            columns[pk]['PK'] = True

        # Foreign Key
        for fk  in auxFK:
            # Se verifica que cada constraint haga referencia a un campo, de lo contrario será invalido
            if not fk[0] in columns:
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.invalid_column_reference), 0)
            columns[fk[0]]['FK'] = True
            columns[fk[0]]['References'] = {'Table':fk[1],'Field':fk[0]}

        for chequeo in auxCheck:
            # Se verifica que cada constraint haga referencia a un campo, de lo contrario será invalido
            if not chequeo[0] in columns:
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.invalid_column_reference), 0)
            #TODO Mejorar implementacion de checks
            columns[chequeo[0]]['Check'] = chequeo[1]

        # Unique
        for unico in auxUnique:
            # Se verifica que cada constraint haga referencia a un campo, de lo contrario será invalido
            if not unico in columns:
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.invalid_column_reference), 0)
            columns[unico]['Unique'] = True
            
        #--------- Herencia
        if self.herencia:
            if not TRef.tableExist(DB_ACTUAL.getName(), self.herencia):
                return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_fdw_error.fdw_table_not_found), 0)
            else:
                colsPadre = TRef.getColumns(DB_ACTUAL.getName(), self.herencia)
                for col in colsPadre:
                    # Verificamos que no existan columnas repetidas con el padre, ya que no existe el polimorfismo de campos
                    if col in columns:
                        return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.duplicate_column), 0)
                # De no existir columnas duplicadas, se agregan las columnas a la tabla
                columns.update(colsPadre)

        # Ahora procedemos a crear
        result = DBMS.createTable(DB_ACTUAL.getName(), self.nombre, len(columns))

        if result == 0:
            TRef.createTable(DB_ACTUAL.getName(), self.nombre, columns, self.herencia)
            return result

        return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.duplicate_table), 0)
예제 #26
0
    def ejecutar(self, ts):
        #Guardamos el tipo y largo si es necesario
        tipo = None
        largo = None

        if isinstance(self.tipo, tuple):
            tipo = self.tipo[0].value
            largo = self.tipo[1]
        else:
            tipo = self.tipo.value

        #Bajo la logica de que puede venir parametros repetidos, tomaremos el ultimo en venir como valido
        atributos = dict(
            {
                "Type": tipo,
                "Lenght": largo,
                "Default": None,
                "Null": True,
                "PK": False,
                "PKConst": None,
                "FK": False,
                "References": None,
                "FKConst": None,
                "Unique": False,
                "UniqueConst": None,
                "Check": None,
                "CheckConst": None
            }
            )

        if self.atributos:
            for atr in self.atributos:
                if isinstance(atr, ConstraintField):
                    if atr.tipo == CONSTRAINT_FIELD.PRIMARY_KEY:
                        atributos['PK'] = True

                    elif atr.tipo == CONSTRAINT_FIELD.UNIQUE:
                        atributos['Unique'] = True
                        atributos['UniqueConst'] = atr.ejecutar(ts)

                    elif atr.tipo == CONSTRAINT_FIELD.NULL:
                        atributos['Null'] = atr.ejecutar(ts)
                elif isinstance(atr, ForeignKeyField):
                    fk = atr.ejecutar(ts)
                    if isinstance(fk, ErrorReport):
                        return fk
                    else:
                        colFK = TRef.getColumns(DB_ACTUAL.getName(), fk['Table'])[fk['Field']]
                        if colFK['Type'] != tipo:
                            return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_fdw_error.fdw_invalid_data_type), 0)
                        atributos['References'] = fk
                        atributos['FK'] = True
                elif isinstance(atr, DefaultField):
                    atributos['Default'] = atr.ejecutar(ts)
                elif isinstance(atr,CheckField):
                    #TODO Mejorar implementacion de checks
                    cheq = atr.ejecutar(ts)
                    atributos['Check'] = cheq[1]
                    atributos['CheckConst'] = cheq[0]
                else:
                    return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_syntax_error_or_access_rule_violation.invalid_table_definition), 0)

        return atributos
예제 #27
0
 def ejecutar(self, ts):
     if TRef.columnExist(DB_ACTUAL.getName(), self.tabla, self.campo):
         return {'Table': self.tabla, 'Field': self.campo}
     else:
         return ErrorReport('Semantico', sqlErrors.sqlErrorToString(sqlErrors.sql_error_fdw_error.fdw_column_name_not_found), 0)
예제 #28
0
 def ejecutar(self, ts):
     salida = None
     if len(self.resultado.fuentes) > 1:
         seleccion_columnas = []
         for actual in self.columnas:
             if isinstance(actual, ITEM_ALIAS):
                 if isinstance(actual.item, ExpresionID):
                     actual.item = actual.item.val
                     if actual.item.count('.') == 1:
                         seleccion_columnas.append(actual)
                     elif esAmbiguo(actual.item, self.resultado.columnas,
                                    self.resultado.fuentes):
                         print("Error semántico, el identificador  \"",
                               actual, "\"  es ambiguo")
                         sqlTypeError = sqlErrors.sql_error_syntax_error_or_access_rule_violation.ambiguous_column
                         return ErrorReport(
                             'Semántico', "ERROR " + sqlTypeError.value +
                             ": " + str(sqlTypeError.name), self.linea)
                     else:
                         actual = aclarar(actual.item,
                                          self.resultado.columnas,
                                          self.resultado.fuentes)
                         seleccion_columnas.append(actual)
                 elif isinstance(actual.item, Expresion):
                     seleccion_columnas.append(actual)
                 elif actual.item.count('.') == 1:
                     seleccion_columnas.append(actual)
                 elif actual.item == "*":
                     print(
                         "Error semántico, el operador \"*\" no es aplicable con alias."
                     )
                     sqlTypeError = sqlErrors.sql_error_syntax_error_or_access_rule_violation.datatype_mismatch
                     return ErrorReport(
                         'Semántico', "ERROR " + sqlTypeError.value + ": " +
                         str(sqlTypeError.name), self.linea)
                 else:
                     if esAmbiguo(actual, self.resultado.columnas,
                                  self.resultado.fuentes):
                         print("Error semántico, el identificador  \"",
                               actual, "\"  es ambiguo")
                         sqlTypeError = sqlErrors.sql_error_syntax_error_or_access_rule_violation.ambiguous_column
                         return ErrorReport(
                             'Semántico', "ERROR " + sqlTypeError.value +
                             ": " + str(sqlTypeError.name), self.linea)
                     else:
                         actual = aclarar(actual, self.resultado.columnas,
                                          self.fuentes)
                         seleccion_columnas.append(actual)
             elif isinstance(actual, Expresion):
                 seleccion_columnas.append(actual)
             elif actual.count('.') == 1:
                 seleccion_columnas.append(actual)
             elif actual == "*":
                 seleccion_columnas.append(actual)
             else:
                 if esAmbiguo(actual, self.resultado.columnas,
                              self.resultado.fuentes):
                     print("Error semántico, el identificador  \"", actual,
                           "\"  es ambiguo")
                     sqlTypeError = sqlErrors.sql_error_syntax_error_or_access_rule_violation.ambiguous_column
                     return ErrorReport(
                         'Semántico', "ERROR " + sqlTypeError.value + ": " +
                         str(sqlTypeError.name), self.linea)
                 else:
                     actual = aclarar(actual, self.resultado.columnas,
                                      self.fuentes)
                     seleccion_columnas.append(actual)
         salida = self.resultado.obtenerColumnas(seleccion_columnas)
         if salida == None:
             print("Algo salió mal")
         return salida
     else:
         seleccion_columnas = []
         for actual in self.columnas:
             if isinstance(actual, ITEM_ALIAS):
                 if isinstance(actual.item, ExpresionID):
                     actual.item = actual.item.val
                     seleccion_columnas.append(actual)
             else:
                 seleccion_columnas.append(actual)
         salida = self.resultado.obtenerColumnas(self.columnas)
         return salida
예제 #29
0
 def ejecutar(self, ts):
     izquierdo = self.izq.ejecutar(ts)
     derecho = self.der.ejecutar(ts)
     if len(izquierdo.filas) == len(derecho.filas) and len(
             izquierdo.columnas) == len(derecho.columnas):
         if self.operador == COMBINE_QUERYS.UNION:
             set1 = set(tuple(x) for x in izquierdo.filas)
             set2 = set(tuple(x) for x in derecho.filas)
             union = set1 | set2
             lista_intermedia = list(union)
             lista_final = []
             for actual in lista_intermedia:
                 lista_final.append(list(actual))
             nuevas_columnas = []
             for actual in lista_final[0]:
                 nuevas_columnas.append("Union")
             nuevas_fuentes = []
             for actual in izquierdo.fuentes:
                 nuevas_fuentes.append(actual)
             for actual in derecho.fuentes:
                 nuevas_fuentes.append(actual)
             nuevo_clm = []
             for actual in izquierdo.clm:
                 nuevo_clm.append(actual)
             for actual in derecho.clm:
                 nuevo_clm.append(actual)
             salida = matriz(nuevas_columnas, lista_final,
                             TABLA_TIPO.TABLAUNION, 'nueva tabla',
                             nuevas_fuentes, nuevo_clm)
             salida.imprimirMatriz()
             return salida
         elif self.operador == COMBINE_QUERYS.INTERSECT:
             set1 = set(tuple(x) for x in izquierdo.filas)
             set2 = set(tuple(x) for x in derecho.filas)
             union = set1 & set2
             lista_intermedia = list(union)
             lista_final = []
             for actual in lista_intermedia:
                 lista_final.append(list(actual))
             nuevas_columnas = []
             if len(lista_final) > 0:
                 for actual in lista_final[0]:
                     nuevas_columnas.append("Intersect")
             nuevas_fuentes = []
             for actual in izquierdo.fuentes:
                 nuevas_fuentes.append(actual)
             for actual in derecho.fuentes:
                 nuevas_fuentes.append(actual)
             nuevo_clm = []
             for actual in izquierdo.clm:
                 nuevo_clm.append(actual)
             for actual in derecho.clm:
                 nuevo_clm.append(actual)
             salida = matriz(nuevas_columnas, lista_final,
                             TABLA_TIPO.TABLAINTERSECCION, 'nueva tabla',
                             nuevas_fuentes, nuevo_clm)
             salida.imprimirMatriz()
             return salida
         elif self.operador == COMBINE_QUERYS.EXCEPT:
             set1 = set(tuple(x) for x in izquierdo.filas)
             set2 = set(tuple(x) for x in derecho.filas)
             union = set1 - set2
             lista_intermedia = list(union)
             lista_final = []
             for actual in lista_intermedia:
                 lista_final.append(list(actual))
             nuevas_columnas = []
             for actual in lista_final[0]:
                 nuevas_columnas.append("Except")
             nuevas_fuentes = []
             for actual in izquierdo.fuentes:
                 nuevas_fuentes.append(actual)
             for actual in derecho.fuentes:
                 nuevas_fuentes.append(actual)
             nuevo_clm = []
             for actual in izquierdo.clm:
                 nuevo_clm.append(actual)
             for actual in derecho.clm:
                 nuevo_clm.append(actual)
             salida = matriz(nuevas_columnas, lista_final,
                             TABLA_TIPO.TABLAEXCEPT, 'nueva tabla',
                             nuevas_fuentes, nuevo_clm)
             salida.imprimirMatriz()
             return salida
     else:
         print(
             "Error semántico, el número de filas de los operandos es diferente."
         )
         sqlTypeError = sqlErrors.sql_error_data_exception.invalid_parameter_value
         return ErrorReport(
             'Semántico',
             "ERROR " + sqlTypeError.value + ": " + str(sqlTypeError.name),
             self.linea)
예제 #30
0
    def obtenerColumnas(self, ids: list):
        error = False
        resultante = []
        flag = True
        columnas_resultantes = []
        for actual in ids:
            if isinstance(actual, ITEM_ALIAS):
                if isinstance(actual.item, Expresion):
                    ColumnaCompleta = []
                    MinitablaSimbolos = []
                    filas = self.filas
                    columnas = self.columnas
                    i = 0
                    while (i < len(filas)):
                        indiceColumna = 0
                        while (indiceColumna < len(columnas)):
                            if len(self.fuentes) == 1:
                                MinitablaSimbolos.append({
                                    'id':
                                    columnas[indiceColumna],
                                    'val':
                                    filas[i][indiceColumna],
                                    'tipo':
                                    self.clm[quitarRef(
                                        columnas[indiceColumna])]['Type']
                                })
                            else:
                                MinitablaSimbolos.append({
                                    'id':
                                    columnas[indiceColumna],
                                    'val':
                                    filas[i][indiceColumna],
                                    'tipo':
                                    self.clm[obtenerIndice(
                                        self.fuentes,
                                        obtenerRef(columnas[indiceColumna]))]
                                    [quitarRef(
                                        columnas[indiceColumna])]['Type']
                                })
                            indiceColumna += 1
                        tupla = TuplaCompleta(MinitablaSimbolos)
                        casillaResultante = actual.item.ejecutar(tupla)
                        if isinstance(casillaResultante, ErrorReport):
                            print(casillaResultante.description)
                        ColumnaCompleta.append(casillaResultante.val)
                        MinitablaSimbolos.clear()
                        i += 1
                    if flag:
                        for k in ColumnaCompleta:
                            nuevaColumna = []
                            nuevaColumna.append(k)
                            resultante.append(nuevaColumna)
                        flag = False
                        columnas_resultantes.append(actual.alias)
                    else:
                        h = 0
                        for j in resultante:
                            resultante[h].append(ColumnaCompleta[h])
                            h += 1
                        flag = False
                        columnas_resultantes.append(actual.alias)
                elif self.columnas.__contains__(
                        self.nombre + "." +
                        actual.item) and self.tipo == TABLA_TIPO.UNICA:
                    i = 0
                    for columna in self.columnas:
                        if columna == self.nombre + "." + actual.item:
                            break
                        else:
                            i += 1
                    j = 0
                    for fila in self.filas:
                        if flag:
                            nuevaColumna = []
                            nuevaColumna.append(fila[i])
                            resultante.append(nuevaColumna)
                        else:
                            resultante[j].append(fila[i])
                        j += 1
                    flag = False
                    columnas_resultantes.append(actual.alias)
                else:
                    i = 0
                    bandera = False
                    for columna in self.columnas:
                        if columna == actual.item:
                            bandera = True
                            break
                        else:
                            i += 1
                    if bandera:
                        j = 0
                        for fila in self.filas:
                            if flag:
                                nuevaColumna = []
                                nuevaColumna.append(fila[i])
                                resultante.append(nuevaColumna)
                            else:
                                resultante[j].append(fila[i])
                            j += 1
                        flag = False
                        columnas_resultantes.append(actual.alias)
                    else:
                        print(
                            "Error semántico, la columna:  \" ", actual.item,
                            " \"  no se encuentra o su referencia es ambigua.")
                        error = True
                        sqlTypeError = sqlErrors.sql_error_fdw_error.fdw_column_name_not_found
                        return ErrorReport(
                            'Semántico', "ERROR " + sqlTypeError.value + ": " +
                            str(sqlTypeError.name), self.linea)

            else:
                if isinstance(actual, Expresion):
                    ColumnaCompleta = []
                    MinitablaSimbolos = []
                    filas = self.filas
                    columnas = self.columnas
                    i = 0
                    while (i < len(filas)):
                        indiceColumna = 0
                        while (indiceColumna < len(columnas)):
                            if len(self.fuentes) == 1:
                                MinitablaSimbolos.append({
                                    'id':
                                    columnas[indiceColumna],
                                    'val':
                                    filas[i][indiceColumna],
                                    'tipo':
                                    self.clm[quitarRef(
                                        columnas[indiceColumna])]['Type']
                                })
                            else:
                                MinitablaSimbolos.append({
                                    'id':
                                    columnas[indiceColumna],
                                    'val':
                                    filas[i][indiceColumna],
                                    'tipo':
                                    self.clm[obtenerIndice(
                                        self.fuentes,
                                        obtenerRef(columnas[indiceColumna]))]
                                    [quitarRef(
                                        columnas[indiceColumna])]['Type']
                                })
                            indiceColumna += 1
                        tupla = TuplaCompleta(MinitablaSimbolos)
                        casillaResultante = actual.ejecutar(tupla)
                        if isinstance(casillaResultante, ErrorReport):
                            print(casillaResultante.description)
                        ColumnaCompleta.append(casillaResultante.val)
                        MinitablaSimbolos.clear()
                        i += 1
                    if flag:
                        for k in ColumnaCompleta:
                            nuevaColumna = []
                            nuevaColumna.append(k)
                            resultante.append(nuevaColumna)
                        flag = False
                        columnas_resultantes.append('exp')
                    else:
                        h = 0
                        for j in resultante:
                            resultante[h].append(ColumnaCompleta[h])
                            h += 1
                        flag = False
                        columnas_resultantes.append('exp')
                elif actual == "*":
                    j = 0
                    for fila in self.filas:
                        if flag:
                            nuevaColumna = []
                            for k in fila:
                                nuevaColumna.append(k)
                            resultante.append(nuevaColumna)
                        else:
                            for k in fila:
                                resultante[j].append(k)
                        j += 1
                    for c in self.columnas:
                        columnas_resultantes.append(c)
                    flag = False
                elif self.columnas.__contains__(
                        self.nombre + "." +
                        actual) and self.tipo == TABLA_TIPO.UNICA:
                    i = 0
                    for columna in self.columnas:
                        if columna == self.nombre + "." + actual:
                            break
                        else:
                            i += 1
                    j = 0
                    for fila in self.filas:
                        if flag:
                            nuevaColumna = []
                            nuevaColumna.append(fila[i])
                            resultante.append(nuevaColumna)
                        else:
                            resultante[j].append(fila[i])
                        j += 1
                    flag = False
                    columnas_resultantes.append(actual)
                else:
                    i = 0
                    bandera = False
                    for columna in self.columnas:
                        if columna == actual:
                            bandera = True
                            break
                        else:
                            i += 1
                    if bandera:
                        j = 0
                        for fila in self.filas:
                            if flag:
                                nuevaColumna = []
                                nuevaColumna.append(fila[i])
                                resultante.append(nuevaColumna)
                            else:
                                resultante[j].append(fila[i])
                            j += 1
                        flag = False
                        columnas_resultantes.append(actual)
                    else:
                        print(
                            "Error semántico, la columna:  \" ", actual,
                            " \"  no se encuentra o su referencia es ambigua.")
                        error = True
                        sqlTypeError = sqlErrors.sql_error_fdw_error.fdw_column_name_not_found
                        return ErrorReport(
                            'Semántico', "ERROR " + sqlTypeError.value + ": " +
                            str(sqlTypeError.name), self.linea)

        if not error:
            salida = matriz(columnas_resultantes, resultante,
                            TABLA_TIPO.SELECCIONADA, "nueva tabla",
                            self.fuentes, self.clm)
        else:
            salida = None
        return salida