⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sqlparser.lib.php

📁 一个用PHP编写的
💻 PHP
📖 第 1 页 / 共 5 页
字号:
                    } elseif (($pos + 1 < $len) && (PMA_substr($sql, $pos, 1) == $quotetype) && (PMA_substr($sql, $pos + 1, 1) == $quotetype)) {                        $pos = $pos + 2;                        continue;                    } else {                        break;                    }                } while ($len > $pos); // end do                $count2       = $pos;                $count2++;                $type         = 'quote_';                switch ($quotetype) {                    case '\'':                        $type .= 'single';                        break;                    case '"':                        $type .= 'double';                        break;                    case '`':                        $type .= 'backtick';                        break;                    default:                        break;                } // end switch                $data = PMA_substr($sql, $count1, $count2 - $count1);                PMA_SQP_arrayAdd($sql_array, $type, $data, $arraysize);                continue;            }            // Checks for brackets            if (PMA_STR_strInStr($c, $bracket_list)) {                // All bracket tokens are only one item long                $count2++;                $type_type     = '';                if (PMA_STR_strInStr($c, '([{')) {                    $type_type = 'open';                } else {                    $type_type = 'close';                }                $type_style     = '';                if (PMA_STR_strInStr($c, '()')) {                    $type_style = 'round';                } elseif (PMA_STR_strInStr($c, '[]')) {                    $type_style = 'square';                } else {                    $type_style = 'curly';                }                $type = 'punct_bracket_' . $type_type . '_' . $type_style;                PMA_SQP_arrayAdd($sql_array, $type, $c, $arraysize);                continue;            }            // Checks for identifier (alpha or numeric)            if (PMA_STR_isSqlIdentifier($c, FALSE) || ($c == '@') || ($c == '.' && PMA_STR_isDigit(PMA_substr($sql, $count2 + 1, 1)))) {                $count2 ++;                //TODO: a @ can also be present in expressions like                // FROM 'user'@'%'                // or  TO 'user'@'%'                // in this case, the @ is wrongly marked as alpha_variable                $is_sql_variable         = ($c == '@');                $is_digit                = (!$is_sql_variable) && PMA_STR_isDigit($c);                $is_hex_digit            = ($is_digit) && ($c == '.') && ($c == '0') && ($count2 < $len) && (PMA_substr($sql, $count2, 1) == 'x');                $is_float_digit          = $c == '.';                $is_float_digit_exponent = FALSE;                // Nijel: Fast skip is especially needed for huge BLOB data, requires PHP at least 4.3.0:                if (PMA_PHP_INT_VERSION >= 40300) {                    if ($is_hex_digit) {                        $count2++;                        $pos = strspn($sql, '0123456789abcdefABCDEF', $count2);                        if ($pos > $count2) {                            $count2 = $pos;                        }                        unset($pos);                    } elseif ($is_digit) {                        $pos = strspn($sql, '0123456789', $count2);                        if ($pos > $count2) {                            $count2 = $pos;                        }                        unset($pos);                    }                }                while (($count2 < $len) && PMA_STR_isSqlIdentifier(PMA_substr($sql, $count2, 1), ($is_sql_variable || $is_digit))) {                    $c2 = PMA_substr($sql, $count2, 1);                    if ($is_sql_variable && ($c2 == '.')) {                        $count2++;                        continue;                    }                    if ($is_digit && (!$is_hex_digit) && ($c2 == '.')) {                        $count2++;                        if (!$is_float_digit) {                            $is_float_digit = TRUE;                            continue;                        } else {                            $debugstr = $GLOBALS['strSQPBugInvalidIdentifer'] . ' @ ' . ($count1+1) . "\n"                                      . 'STR: ' . htmlspecialchars(PMA_substr($sql, $count1, $count2 - $count1));                            PMA_SQP_throwError($debugstr, $sql);                            return $sql;                        }                    }                    if ($is_digit && (!$is_hex_digit) && (($c2 == 'e') || ($c2 == 'E'))) {                        if (!$is_float_digit_exponent) {                            $is_float_digit_exponent = TRUE;                            $is_float_digit          = TRUE;                            $count2++;                            continue;                        } else {                            $is_digit                = FALSE;                            $is_float_digit          = FALSE;                        }                    }                    if (($is_hex_digit && PMA_STR_isHexDigit($c2)) || ($is_digit && PMA_STR_isDigit($c2))) {                        $count2++;                        continue;                    } else {                        $is_digit     = FALSE;                        $is_hex_digit = FALSE;                    }                    $count2++;                } // end while                $l    = $count2 - $count1;                $str  = PMA_substr($sql, $count1, $l);                $type = '';                if ($is_digit) {                    $type     = 'digit';                    if ($is_float_digit) {                        $type .= '_float';                    } elseif ($is_hex_digit) {                        $type .= '_hex';                    } else {                        $type .= '_integer';                    }                } else {                    if ($is_sql_variable != FALSE) {                        $type = 'alpha_variable';                    } else {                        $type = 'alpha';                    }                } // end if... else....                PMA_SQP_arrayAdd($sql_array, $type, $str, $arraysize);                continue;            }            // Checks for punct            if (PMA_STR_strInStr($c, $allpunct_list)) {                while (($count2 < $len) && PMA_STR_strInStr(PMA_substr($sql, $count2, 1), $allpunct_list)) {                    $count2++;                }                $l = $count2 - $count1;                if ($l == 1) {                    $punct_data = $c;                } else {                    $punct_data = PMA_substr($sql, $count1, $l);                }                // Special case, sometimes, althought two characters are                // adjectent directly, they ACTUALLY need to be seperate                if ($l == 1) {                    $t_suffix         = '';                    switch ($punct_data) {                        case $punct_queryend:                            $t_suffix = '_queryend';                            break;                        case $punct_qualifier:                            $t_suffix = '_qualifier';                            break;                        case $punct_listsep:                            $t_suffix = '_listsep';                            break;                        default:                            break;                    }                    PMA_SQP_arrayAdd($sql_array, 'punct' . $t_suffix, $punct_data, $arraysize);                } elseif (PMA_STR_binarySearchInArr($punct_data, $allpunct_list_pair, $allpunct_list_pair_size)) {                    // Ok, we have one of the valid combined punct expressions                    PMA_SQP_arrayAdd($sql_array, 'punct', $punct_data, $arraysize);                } else {                    // Bad luck, lets split it up more                    $first  = $punct_data[0];                    $first2 = $punct_data[0] . $punct_data[1];                    $last2  = $punct_data[$l - 2] . $punct_data[$l - 1];                    $last   = $punct_data[$l - 1];                    if (($first == ',') || ($first == ';') || ($first == '.') || ($first == '*')) {                        $count2     = $count1 + 1;                        $punct_data = $first;                    } elseif (($last2 == '/*') || (($last2 == '--') && ($count2 == $len || PMA_substr($sql, $count2, 1) <= ' ') )) {                        $count2     -= 2;                        $punct_data = PMA_substr($sql, $count1, $count2 - $count1);                    } elseif (($last == '-') || ($last == '+') || ($last == '!')) {                        $count2--;                        $punct_data = PMA_substr($sql, $count1, $count2 - $count1);                    // TODO: for negation operator, split in 2 tokens ?                    // "select x&~1 from t"                    // becomes "select x & ~ 1 from t" ?                    } elseif ($last != '~') {                        $debugstr =  $GLOBALS['strSQPBugUnknownPunctuation'] . ' @ ' . ($count1+1) . "\n"                                  . 'STR: ' . htmlspecialchars($punct_data);                        PMA_SQP_throwError($debugstr, $sql);                        return $sql;                    }                    PMA_SQP_arrayAdd($sql_array, 'punct', $punct_data, $arraysize);                    continue;                } // end if... elseif... else                continue;            }            // DEBUG            $count2++;            $debugstr = 'C1 C2 LEN: ' . $count1 . ' ' . $count2 . ' ' . $len .  "\n"                      . 'STR: ' . PMA_substr($sql, $count1, $count2 - $count1) . "\n";            PMA_SQP_bug($debugstr, $sql);            return $sql;        } // end while ($count2 < $len)        if ($arraysize > 0) {            $t_next           = $sql_array[0]['type'];            $t_prev           = '';            $t_bef_prev       = '';            $t_cur            = '';            $d_next           = $sql_array[0]['data'];            $d_prev           = '';            $d_bef_prev       = '';            $d_cur            = '';            $d_next_upper     = $t_next == 'alpha' ? strtoupper($d_next) : $d_next;            $d_prev_upper     = '';            $d_bef_prev_upper = '';            $d_cur_upper      = '';        }        for ($i = 0; $i < $arraysize; $i++) {            $t_bef_prev       = $t_prev;            $t_prev           = $t_cur;            $t_cur            = $t_next;            $d_bef_prev       = $d_prev;            $d_prev           = $d_cur;            $d_cur            = $d_next;            $d_bef_prev_upper = $d_prev_upper;            $d_prev_upper     = $d_cur_upper;            $d_cur_upper      = $d_next_upper;            if (($i + 1) < $arraysize) {                $t_next = $sql_array[$i + 1]['type'];                $d_next = $sql_array[$i + 1]['data'];                $d_next_upper = $t_next == 'alpha' ? strtoupper($d_next) : $d_next;            } else {                $t_next       = '';                $d_next       = '';                $d_next_upper = '';            }            //DEBUG echo "[prev: <b>".$d_prev."</b> ".$t_prev."][cur: <b>".$d_cur."</b> ".$t_cur."][next: <b>".$d_next."</b> ".$t_next."]<br />";            if ($t_cur == 'alpha') {                $t_suffix     = '_identifier';                if (($t_next == 'punct_qualifier') || ($t_prev == 'punct_qualifier')) {                    $t_suffix = '_identifier';                } elseif (($t_next == 'punct_bracket_open_round')                  && PMA_STR_binarySearchInArr($d_cur_upper, $PMA_SQPdata_function_name, $PMA_SQPdata_function_name_cnt)) {                    // FIXME-2005-10-16: in the case of a CREATE TABLE containing a TIMESTAMP,                    // since TIMESTAMP() is also a function, it's found here and                    // the token is wrongly marked as alpha_functionName. But we                    // compensate for this when analysing for timestamp_not_null                    // later in this script.                    $t_suffix = '_functionName';                } elseif (PMA_STR_binarySearchInArr($d_cur_upper, $PMA_SQPdata_column_type, $PMA_SQPdata_column_type_cnt)) {                    $t_suffix = '_columnType';                        // Temporary fix for BUG #621357                    //TODO FIX PROPERLY NEEDS OVERHAUL OF SQL TOKENIZER                    if ($d_cur_upper == 'SET' && $t_next != 'punct_bracket_open_round') {                        $t_suffix = '_reservedWord';                    }                    //END OF TEMPORARY FIX                        // CHARACTER is a synonym for CHAR, but can also be meant as                    // CHARACTER SET. In this case, we have a reserved word.                    if ($d_cur_upper == 'CHARACTER' && $d_next_upper == 'SET') {                        $t_suffix = '_reservedWord';                    }                        // experimental                    // current is a column type, so previous must not be                    // a reserved word but an identifier                    // CREATE TABLE SG_Persons (first varchar(64))                        //if ($sql_array[$i-1]['type'] =='alpha_reservedWord') {                    //    $sql_array[$i-1]['type'] = 'alpha_identifier';                    //}                    } elseif (PMA_STR_binarySearchInArr($d_cur_upper, $PMA_SQPdata_reserved_word, $PMA_SQPdata_reserved_word_cnt)) {                    $t_suffix = '_reservedWord';                } elseif (PMA_STR_binarySearchInArr($d_cur_upper, $PMA_SQPdata_column_attrib, $PMA_SQPdata_column_attrib_cnt)) {                    $t_suffix = '_columnAttrib';                    // INNODB is a MySQL table type, but in "SHOW INNODB STATUS",                    // it should be regarded as a reserved word.                    if ($d_cur_upper == 'INNODB' && $d_prev_upper == 'SHOW' && $d_next_upper == 'STATUS') {                        $t_suffix = '_reservedWord';                    }                        if ($d_cur_upper == 'DEFAULT' && $d_next_upper == 'CHARACTER') {                        $t_suffix = '_reservedWord';                    }                    // Binary as character set                    if ($d_cur_upper == 'BINARY' && (                      ($d_bef_prev_upper == 'CHARACTER' && $d_prev_upper == 'SET')                      || ($d_bef_prev_upper == 'SET' && $d_prev_upper == '=')                      || ($d_bef_prev_upper == 'CHARSET' && $d_prev_upper == '=')                      || $d_prev_upper == 'CHARSET'                      ) && PMA_STR_binarySearchInArr($d_cur, $mysql_charsets, count($mysql_charsets))) {                        $t_suffix = '_charset';                    }                } elseif (PMA_STR_binarySearchInArr($d_cur, $mysql_charsets, $mysql_charsets_count)                  || PMA_STR_binarySearchInArr($d_cur, $mysql_collations_flat, $mysql_collations_count)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -