Beispiel #1
0
def p_expression_entero(t):
    '''expression : ENTERO'''
    global num_nodo
    n_entero = t[1]
    if n_entero in range(-32768, 32768):
        t[0] = primitivo(t.lineno(1), t.lexpos(1), t[1], tipo_primitivo.SMALLINT, num_nodo)
    elif n_entero in range(-2147483648, 2147483647):
        t[0] = primitivo(t.lineno(1), t.lexpos(1), t[1], tipo_primitivo.INTEGER, num_nodo)
    elif n_entero in range(-9223372036854775808, 9223372036854775807):
        t[0] = primitivo(t.lineno(1), t.lexpos(1), t[1], tipo_primitivo.BIGINT, num_nodo)
    num_nodo += 2
Beispiel #2
0
def p_expression_cadena(t):
    '''expression : CADENA'''
    global num_nodo
    n_tiempo = str(t[1])
    patron_tiempo = re.compile(r'\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d')
    m_tiempo = patron_tiempo.match(n_tiempo)
    patron_fecha = re.compile(r'\d\d\d\d-\d\d-\d\d')
    m_fecha = patron_fecha.match(n_tiempo)

    if m_tiempo != None:
        t[0] = primitivo(t.lineno(1), t.lexpos(1), t[1], tipo_primitivo.TIME, num_nodo)
    elif m_fecha != None:
        t[0] = primitivo(t.lineno(1), t.lexpos(1), t[1], tipo_primitivo.DATE, num_nodo)
    else:
        t[0] = primitivo(t.lineno(1), t.lexpos(1), t[1], tipo_primitivo.CHAR, num_nodo)
    num_nodo += 2
Beispiel #3
0
def p_expression_decimal(t):
    '''expression : DECIMAL_NUM'''
    global num_nodo
    texto_decimal = str(t[1])
    patron_real = re.compile(r'-?\d+\.\d\d\d\d\d\d+')
    m_real = patron_real.match(texto_decimal)
    patron_presicion = re.compile(r'-?\d+\.\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d+')
    m_presicion = patron_presicion.match(texto_decimal)

    n_decimal = t[1]
    n_decimal = int(n_decimal)
    if m_presicion != None:
        t[0] = primitivo(t.lineno(1), t.lexpos(1), t[1], tipo_primitivo.DOUBLE_PRECISION, num_nodo)
    elif m_real != None:
        t[0] = primitivo(t.lineno(1), t.lexpos(1), t[1], tipo_primitivo.REAL, num_nodo)
    elif n_decimal in range(-131072, 131073):
        t[0] = primitivo(t.lineno(1), t.lexpos(1), t[1], tipo_primitivo.DECIMAL, num_nodo)
    elif n_decimal in range(-92233720368547758, 92233720368547759):
        t[0] = primitivo(t.lineno(1), t.lexpos(1), t[1], tipo_primitivo.MONEY, num_nodo)
    num_nodo += 2
Beispiel #4
0
def p_expression_agrupar_f(t):
    '''expression_f : SUM PAR_ABRE expression PAR_CIERRA
                    | COUNT PAR_ABRE expression PAR_CIERRA
                    | AVG PAR_ABRE expression PAR_CIERRA
                    | MAX PAR_ABRE expression PAR_CIERRA
                    | MIN PAR_ABRE expression PAR_CIERRA
                    | ABS PAR_ABRE expression PAR_CIERRA
                    | CBRT PAR_ABRE expression PAR_CIERRA
                    | CEIL PAR_ABRE expression PAR_CIERRA
                    | CEILING PAR_ABRE expression PAR_CIERRA 
                    | DEGREES PAR_ABRE expression PAR_CIERRA
                    | DIV PAR_ABRE expression COMA expression PAR_CIERRA
                    | EXP PAR_ABRE expression PAR_CIERRA
                    | FACTORIAL PAR_ABRE expression PAR_CIERRA 
                    | FLOOR PAR_ABRE expression PAR_CIERRA
                    | GCD PAR_ABRE expression COMA expression PAR_CIERRA
                    | LN PAR_ABRE expression PAR_CIERRA
                    | LOG PAR_ABRE expression PAR_CIERRA
                    | MOD PAR_ABRE expression COMA expression PAR_CIERRA
                    | PI PAR_ABRE PAR_CIERRA
                    | POWER PAR_ABRE expression COMA expression PAR_CIERRA
                    | RADIANS PAR_ABRE expression PAR_CIERRA
                    | ROUND PAR_ABRE expression PAR_CIERRA
                    | SIGN PAR_ABRE expression PAR_CIERRA
                    | SQRT PAR_ABRE expression PAR_CIERRA
                    | WIDTH_BUCKET PAR_ABRE expression COMA expression COMA expression COMA expression PAR_CIERRA
                    | TRUNC PAR_ABRE expression PAR_CIERRA
                    | RANDOM PAR_ABRE PAR_CIERRA '''
    global num_nodo
    try:
        if str(t[1]).lower() == "div" or str(t[1]).lower() == "gcd" or str(t[1]).lower() == "mod" or str(t[1]).lower() == "power":
            t[0] = agrupar(t[1], t[3], t[5], t.lineno(1), t.lexpos(1), num_nodo)
        elif str(t[1]).lower() == "pi" or str(t[1]).lower() == "random":
            auxiliar = primitivo(t.lineno(1), t.lexpos(1), 0, tipo_primitivo.INTEGER, num_nodo)
            t[0] = agrupar(t[1], auxiliar, None, t.lineno(1), t.lexpos(1), num_nodo)
        else:
            t[0] = agrupar(t[1], t[3], None, t.lineno(1), t.lexpos(1), num_nodo)
        num_nodo += 3
    except:
        print('No funciona la parte de agrupar')
Beispiel #5
0
def p_expression_time_f(t):
    '''expression_f : NOW PAR_ABRE PAR_CIERRA
                    | TIMESTAMP CADENA
                    | CURRENT_TIME
                    | CURRENT_DATE 
                    | DATE_PART PAR_ABRE expression COMA INTERVAL expression PAR_CIERRA
                    | EXTRACT PAR_ABRE YEAR FROM TIMESTAMP expression PAR_CIERRA
                    | EXTRACT PAR_ABRE MONTH FROM TIMESTAMP expression PAR_CIERRA
                    | EXTRACT PAR_ABRE DAY FROM TIMESTAMP expression PAR_CIERRA
                    | EXTRACT PAR_ABRE HOUR FROM TIMESTAMP expression PAR_CIERRA
                    | EXTRACT PAR_ABRE MINUTE FROM TIMESTAMP expression PAR_CIERRA
                    | EXTRACT PAR_ABRE SECOND FROM TIMESTAMP expression PAR_CIERRA'''

    global num_nodo
    try:
        if str(t[1]).lower() == "date_part" or str(t[1]).lower() == "extract":
            if str(t[3]) == "YEAR":
                t[3] = primitivo(t.lineno(1), t.lexpos(1), "year", tipo_primitivo.CHAR, num_nodo)
            elif str(t[3]) == "MONTH":
                t[3] = primitivo(t.lineno(1), t.lexpos(1), "month", tipo_primitivo.CHAR, num_nodo)
            elif str(t[3]) == "DAY":
                t[3] = primitivo(t.lineno(1), t.lexpos(1), "day", tipo_primitivo.CHAR, num_nodo)
            elif str(t[3]) == "HOUR":
                t[3] = primitivo(t.lineno(1), t.lexpos(1), "hour", tipo_primitivo.CHAR, num_nodo)
            elif str(t[3]) == "MINUTE":
                t[3] = primitivo(t.lineno(1), t.lexpos(1), "minute", tipo_primitivo.CHAR, num_nodo)
            elif str(t[3]) == "SECOND":
                t[3] = primitivo(t.lineno(1), t.lexpos(1), "second", tipo_primitivo.CHAR, num_nodo)

            t[0] = agrupar(t[1], t[3], t[6], t.lineno(1), t.lexpos(1), num_nodo)
        elif str(t[1]).lower() == "now" or str(t[1]).lower() == "timestamp" or str(t[1]).lower() == "current_date" or str(t[1]).lower() == "current_time":
            auxiliar = primitivo(t.lineno(1), t.lexpos(1), 0, tipo_primitivo.INTEGER, num_nodo)
            t[0] = agrupar(t[1], auxiliar, None, t.lineno(1), t.lexpos(1), num_nodo)
        else:
            t[0] = agrupar(t[1], t[3], None, t.lineno(1), t.lexpos(1), num_nodo)
        num_nodo += 3
    except:
        print('No funciona la parte de agrupar')
Beispiel #6
0
def p_expression_nulo(t):
    '''expression : NULL'''
    global num_nodo
    t[0] = primitivo(t.lineno, t.lexpos, t[1], tipo_primitivo.NULL, num_nodo)
    num_nodo += 2
Beispiel #7
0
    def ejecutar(self):
        #try:
        actual_db = get_actual_use()

        valores_iniciales = []
        lista_aux = []

        for item in self.lista:
            valores_iniciales.append(item.ejecutar([]))

        retornos = []
        index_id = 0
        if self.cols_id != None:
            #Extraer colummas de la tabla
            columnas_table = ts.get_cols(actual_db, self.dato)

            if columnas_table != None:
                for item_columna in columnas_table:
                    if index_id < len(self.cols_id):
                        if self.cols_id[index_id] == item_columna.id_:
                            lista_aux.append(self.lista[index_id])
                            retornos.append(valores_iniciales[index_id])
                            index_id += 1
                        else:
                            lista_aux.append(
                                primitivo(self.line, self.column, 'NULL',
                                          tipo_primitivo.NULL,
                                          self.num_nodo + 1000000000))
                            retornos.append(
                                retorno('NULL', tipo_primitivo.NULL))
                    else:
                        lista_aux.append(
                            primitivo(self.line, self.column, 'NULL',
                                      tipo_primitivo.NULL,
                                      self.num_nodo + 1000000000))
                        retornos.append(retorno('NULL', tipo_primitivo.NULL))
            else:
                errores.append(
                    nodo_error(
                        self.line, self.column,
                        'E-42P10 invalid column reference: Cannot extract columns to insert data',
                        'Semántico'))
                add_text(
                    'E-42P10 invalid column reference: Cannot extract columns to insert data.\n'
                )
        else:
            retornos = valores_iniciales

        valores = []
        for item in retornos:
            valores.append(item.valor)

        tipo_dominante = 17

        #Validar tipos de dato de insert en columna y dato
        if len(retornos) == ts.count_columns(actual_db, self.dato):
            count_pos = 0
            for value in retornos:

                if value.tipo != tipo_primitivo.NULL:
                    columna = ts.get_col_by_pos(actual_db, self.dato,
                                                count_pos)
                    tipo_dominante = tipos_tabla[value.tipo.value][
                        columna.tipo.value]

                    if tipo_dominante != columna.tipo:
                        errores.append(
                            nodo_error(
                                self.line, self.column,
                                'E-42809 wrong object type: You cannot insert a data type '
                                + self.get_str_tipo(value.tipo) +
                                ' in a column of type ' +
                                self.get_str_tipo(columna.tipo), 'Semántico'))
                        add_text(
                            'E-42809 wrong object type: You cannot insert a data type '
                            + self.get_str_tipo(value.tipo) +
                            ' in a column of type ' +
                            self.get_str_tipo(columna.tipo) + '\n')
                        return

                    count_pos += 1

                    #Validar el tamaño correcto
                    if tipo_dominante == tipo_primitivo.CHAR or tipo_dominante == tipo_primitivo.VARCHAR:
                        if columna.size < len(value.valor):
                            errores.append(
                                nodo_error(
                                    self.line, self.column,
                                    'E-22015 interval field overflow: Data size exceeded '
                                    + value.valor, 'Semántico'))
                            add_text(
                                'E-22015 interval field overflow: Data size exceeded '
                                + value.valor + '\n')
                            return

                else:
                    #Omitir NULL, para validar despues las restricciones de columnas
                    count_pos += 1
        else:
            errores.append(
                nodo_error(
                    self.line, self.column,
                    'E-22005 error in assignment: Columns out of bounds',
                    'Semántico'))
            add_text('E-22005 error in assignment: Columns out of bounds\n')
            return

        #Validar restricciones de columnas
        index_col = 0
        for value in valores:
            col_actual = ts.get_col_by_pos(actual_db, self.dato, index_col)

            if col_actual.condiciones != None:
                for restriccion in col_actual.condiciones:
                    valido = None

                    if isinstance(restriccion, unique_simple):
                        pos_col = ts.get_pos_col(actual_db, self.dato,
                                                 col_actual.id_)
                        valido = restriccion.ejecutar(self.dato, value,
                                                      pos_col)
                    elif isinstance(restriccion, condicion_simple):
                        pos_col = ts.get_pos_col(actual_db, self.dato,
                                                 col_actual.id_)
                        valido = restriccion.ejecutar(value, pos_col)

                    if isinstance(valido, nodo_error):
                        errores.append(valido)
                        salida_consola = valido.valor + '\n'
                        add_text(salida_consola)
                        return
                    elif valido != None:
                        #Encontramos un cambio para el dato en el default
                        valores[index_col] = valido

            index_col += 1

        aux_insert = funciones.insert(actual_db, self.dato, valores)
        # Valor de retorno: 0 operación exitosa, 1 error en la operación, 2 database no existente, 3 table no existente, 4 llave primaria duplicada, 5 columnas fuera de límites.

        if aux_insert == 0:
            add_text("M-00000 successful completion: Row inserted correctly\n")
        elif aux_insert == 1:
            errores.append(
                nodo_error(
                    self.line, self.column,
                    'E-22005 error in assignment: Could not insert row',
                    'Semántico'))
            add_text('E-22005 error in assignment: Could not insert row\n')
        elif aux_insert == 2:
            errores.append(
                nodo_error(
                    self.line, self.column,
                    'E-22005 error in assignment: There is no database with the following ID -> '
                    + actual_db, 'Sémantico'))
            add_text(
                'E-22005 error in assignment:\nThere is no database with the following ID ->'
                + actual_db + '\n')
        elif aux_insert == 3:
            errores.append(
                nodo_error(
                    self.line, self.column,
                    'E-22005 error in assignment: The table with the following ID does not exist -> '
                    + self.dato, 'Semántico'))
            add_text(
                'E-22005 error in assignment: The table with the following ID does not exist -> '
                + self.dato + '\n')
        elif aux_insert == 4:
            errores.append(
                nodo_error(
                    self.line, self.column,
                    'E-22005 error in assignment: Duplicate primary key',
                    'Semántico'))
            add_text('E-22005 error in assignment: Duplicate primary key\n')
        elif aux_insert == 5:
            errores.append(
                nodo_error(
                    self.line, self.column,
                    'E-22005 error in assignment: Columns out of bounds',
                    'Semántico'))
            add_text('E-22005 error in assignment: Columns out of bounds\n')