Rumah pangkalan data tutorial mysql MySQL的词法分析纵谈

MySQL的词法分析纵谈

Jun 07, 2016 pm 04:26 PM
mysql menganalisis

MySQL的词法分析漫谈 这个链接上有点介绍,可以了解个大概:http://blog.imaginea.com/mysql-query-parsing/ 关键点: 1. SQL解析包括语法分析器和词法分析器。 简便的做法是用bison/flex组合。不过MySQL的词法分析器是手工打造的。 语法分析器的入口函数是MY

MySQL的词法分析漫谈
这个链接上有点介绍,可以了解个大概:http://blog.imaginea.com/mysql-query-parsing/   

关键点:
1. SQL解析包括语法分析器和词法分析器。
   简便的做法是用bison/flex组合。不过MySQL的词法分析器是手工打造的。
   语法分析器的入口函数是MYSQLparse,词法分析器的入口函数是MYSQLlex。
2. 词法分析中会检查token是否为关键字。
    最直接的做法是弄个大的关键字数组,进行折半查找。MySQL在此做了些优化。
   本文主要介绍的是这一部分。

考虑到关键字是一个只读的列表,对它做一个只读的查找树可以改善查找的性能。
产生查找树:
1. 读取关键字数组,产生一个Trie树。
2. 调整这棵树,并产生一个数组(也就是一个不用链表表示的树)。

使用查找树:
这个比较简单,直接看函数get_hash_symbol好了。

产生查找树,相关的Makefile规则:     
In `sql/CMakeFiles/sql.dir/build.make':

sql/lex_hash.h: sql/gen_lex_hash
  $(CMAKE_COMMAND) -E cmake_progress_report /home/zedware/Workspace/mysql/CMakeFiles $(CMAKE_PROGRESS_153)
  @$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --blue --bold "Generating lex_hash.h"
  cd /home/zedware/Workspace/mysql/sql && ./gen_lex_hash > lex_hash.h

容易发现,最主要的函数就是`get_hash_symbol',它主要的调用关系为:

/* sql/lex_hash.h */
get_hash_symbol->sql_functions_map
get_hash_symbol->symbols_map

/* sql/sql_lex.cc */
find_keyword->get_hash_symbol
is_keyword->get_hash_symbol
is_lex_native_function->get_hash_symbol

文件"gen_lex_hash.cc"注释中的树的示例:

+-----------+-+-+-+
|       len |1|2|3|
+-----------+-+-+-+
|first_char |0|0|a|
|last_char  |0|0|d|
|link       |0|0|+|
                 |
                 V
       +----------+-+-+-+--+
       |    1 char|a|b|c|d |
       +----------+-+-+-+--+
       |first_char|d|0|0|0 |
       |last_char |n|0|0|-1|
       |link      |+|0|0|+ |
                   |     |
                   |     V
                   |  symbols[2] ( "DAY" )
                   V
+----------+--+-+-+-+-+-+-+-+-+-+--+
|    2 char|d |e|f|j|h|i|j|k|l|m|n |
+----------+--+-+-+-+-+-+-+-+-+-+--+
|first_char|0 |0|0|0|0|0|0|0|0|0|0 |
|last_char |-1|0|0|0|0|0|0|0|0|0|-1|
|link      |+ |0|0|0|0|0|0|0|0|0|+ |
            |                    |
            V                    V
         symbols[0] ( "ADD" )  symbols[1] ( "AND" )

如果你还记得Trie树,理解起来会容易一点。下面是不同的输入数组对应的树。
i=0

+-----------+-+--+
|       len |1| 2|
+-----------+-+--+
|first_char |0|-1|
|last_char  |0| 0|
|char_tails |0| x|
|ithis      |0| 0|
|iresult    |0| 0|
                |
               &&

static SYMBOL symbols[] = {
  { "&&",   SYM(AND_AND_SYM)},

static uchar symbols_map[8]= {
0,   0,   1, 0,                    0,   0,   0, 0,                    };

i=1

+-----------+--+--+
|       len | 1| 2|
+-----------+--+--+
|first_char |-1|-1|
|last_char  | 0| 0|
|char_tails | x| x|
|ithis      | 0| 0|
|iresult    | 1| 0|
              |  |
             
static SYMBOL symbols[] = {
  { "&&",   SYM(AND_AND_SYM)},
  { "
static uchar symbols_map[8]= {
0,   0,   1, 0,                    0,   0,   0, 0,                    };
             
i=2

+-----------+--+--+
|       len | 1| 2|
+-----------+--+--+
|first_char |-1| &|
|last_char  | 0| |char_tails | x| ^|
|ithis      | 0| 0|
|iresult    | 1| x|
              |  |
                               |          
       +----------+--+--+   +--+
       |    1 char| &|  |...|        +----------+--+--+   +--+
       |first_char|-1| 0|   |-1|
       |last_char | 0| 0|   | 0|
       |char_tails| 0| 0|   | x|
       |ithis     | 0| 0|   | 0|
       |iresult   | 0| 0|   | 2|
                   |          |
                   &&       
static SYMBOL symbols[] = {
  { "&&",   SYM(AND_AND_SYM)},
  { "   { "
static uchar symbols_map[100]= {
0,   0,   1, 0,
'&', ' 0,   0,   0, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   3, 0,
0,   0,   2, 0,
};

i=3

+-----------+--+--+
|       len | 1| 2|
+-----------+--+--+
|first_char |-1| &|
|last_char  | 0| |char_tails | x| ^|
|ithis      | 0| 0|
|iresult    | 1| x|
              |  |
                               |          
       +----------+--+--+   +--+
       |    1 char| &|  |...|        +----------+--+--+   +--+
       |first_char|-1| 0|   |-1|
       |last_char | 0| 0|   | 0|
       |char_tails| 0| 0|   | x|
       |ithis     | 0| 0|   | 0|
       |iresult   | 0| 0|   | p|
                   |          |
                   &&         |
                              |
                   +----------+--+--+
                   |    2 char| =| >|
                   +----------+--+--+
                   |first_char|-1|-1|
                   |last_char | 0| 0|
                   |char_tails| x| x|
                   |ithis     | 0| 0|
                   |iresult   | 2| 3|
                                |  |
                              
                              
static SYMBOL symbols[] = {
  { "&&",   SYM(AND_AND_SYM)},
  { "   { "   { "",   SYM(NE)},

static uchar symbols_map[108]= {
0,   0,   1, 0,
'&', ' 0,   0,   0, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
0,   0,   4, 0,
'=', '>', 25, 0,
0,   0,   2, 0,
0,   0,   3, 0,
};
                              
可以看到,数组表示中存在一定的空间浪费。要是不怕麻烦,我们还可以去榨出一点油水来。
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

<🎜>: Bubble Gum Simulator Infinity - Cara Mendapatkan dan Menggunakan Kekunci Diraja
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Sistem Fusion, dijelaskan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Cara Membuka Kunci Cangkuk Bergelut
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial Java
1677
14
Tutorial PHP
1279
29
Tutorial C#
1257
24
Contoh Pengenalan Laravel Contoh Pengenalan Laravel Apr 18, 2025 pm 12:45 PM

Laravel adalah rangka kerja PHP untuk membina aplikasi web yang mudah. Ia menyediakan pelbagai ciri yang kuat termasuk: Pemasangan: Pasang Laravel CLI secara global dengan komposer dan buat aplikasi dalam direktori projek. Routing: Tentukan hubungan antara URL dan pengendali dalam laluan/web.php. Lihat: Buat pandangan dalam sumber/pandangan untuk menjadikan antara muka aplikasi. Integrasi Pangkalan Data: Menyediakan integrasi keluar-of-the-box dengan pangkalan data seperti MySQL dan menggunakan penghijrahan untuk membuat dan mengubah suai jadual. Model dan Pengawal: Model mewakili entiti pangkalan data dan proses pengawal permintaan HTTP.

MySQL dan PHPMyAdmin: Ciri dan Fungsi Teras MySQL dan PHPMyAdmin: Ciri dan Fungsi Teras Apr 22, 2025 am 12:12 AM

MySQL dan phpmyadmin adalah alat pengurusan pangkalan data yang kuat. 1) MySQL digunakan untuk membuat pangkalan data dan jadual, dan untuk melaksanakan pertanyaan DML dan SQL. 2) Phpmyadmin menyediakan antara muka intuitif untuk pengurusan pangkalan data, pengurusan struktur meja, operasi data dan pengurusan kebenaran pengguna.

Mysql vs Bahasa Pengaturcaraan Lain: Perbandingan Mysql vs Bahasa Pengaturcaraan Lain: Perbandingan Apr 19, 2025 am 12:22 AM

Berbanding dengan bahasa pengaturcaraan lain, MySQL digunakan terutamanya untuk menyimpan dan mengurus data, manakala bahasa lain seperti Python, Java, dan C digunakan untuk pemprosesan logik dan pembangunan aplikasi. MySQL terkenal dengan prestasi tinggi, skalabilitas dan sokongan silang platform, sesuai untuk keperluan pengurusan data, sementara bahasa lain mempunyai kelebihan dalam bidang masing-masing seperti analisis data, aplikasi perusahaan, dan pengaturcaraan sistem.

Kaedah pemasangan kerangka Laravel Kaedah pemasangan kerangka Laravel Apr 18, 2025 pm 12:54 PM

Ringkasan Artikel: Artikel ini menyediakan arahan langkah demi langkah terperinci untuk membimbing pembaca tentang cara memasang rangka kerja Laravel dengan mudah. Laravel adalah rangka kerja PHP yang kuat yang mempercepat proses pembangunan aplikasi web. Tutorial ini merangkumi proses pemasangan dari keperluan sistem untuk mengkonfigurasi pangkalan data dan menyediakan penghalaan. Dengan mengikuti langkah -langkah ini, pembaca dapat dengan cepat dan cekap meletakkan asas yang kukuh untuk projek Laravel mereka.

Terangkan tujuan kunci asing di MySQL. Terangkan tujuan kunci asing di MySQL. Apr 25, 2025 am 12:17 AM

Di MySQL, fungsi kunci asing adalah untuk mewujudkan hubungan antara jadual dan memastikan konsistensi dan integriti data. Kekunci asing mengekalkan keberkesanan data melalui pemeriksaan integriti rujukan dan operasi cascading. Perhatikan pengoptimuman prestasi dan elakkan kesilapan biasa apabila menggunakannya.

Bandingkan dan kontras MySQL dan Mariadb. Bandingkan dan kontras MySQL dan Mariadb. Apr 26, 2025 am 12:08 AM

Perbezaan utama antara MySQL dan MariaDB adalah prestasi, fungsi dan lesen: 1. MySQL dibangunkan oleh Oracle, dan Mariadb adalah garpu. 2. MariaDB boleh melakukan lebih baik dalam persekitaran beban tinggi. 3.MariADB menyediakan lebih banyak enjin dan fungsi penyimpanan. 4.MYSQL mengamalkan lesen dua, dan MariaDB adalah sumber terbuka sepenuhnya. Infrastruktur yang sedia ada, keperluan prestasi, keperluan fungsional dan kos lesen perlu diambil kira apabila memilih.

MySQL: Pangkalan Data, Phpmyadmin: Antara Muka Pengurusan MySQL: Pangkalan Data, Phpmyadmin: Antara Muka Pengurusan Apr 29, 2025 am 12:44 AM

MySQL dan phpmyadmin boleh diuruskan dengan berkesan melalui langkah -langkah berikut: 1. Buat dan hapus pangkalan data: hanya klik phpmyadmin untuk diselesaikan. 2. Mengurus Jadual: Anda boleh membuat jadual, mengubahsuai struktur, dan menambah indeks. 3. Operasi Data: Menyokong memasukkan, mengemas kini, memadam data dan melaksanakan pertanyaan SQL. 4. Data Import dan Eksport: Menyokong SQL, CSV, XML dan format lain. 5. Pengoptimuman dan Pemantauan: Gunakan arahan yang boleh dioptimumkan untuk mengoptimumkan jadual dan gunakan penganalisis pertanyaan dan alat pemantauan untuk menyelesaikan masalah prestasi.

Perisian apa yang lebih baik untuk kerangka Yi? Perisian yang disyorkan untuk Rangka Kerja YI Perisian apa yang lebih baik untuk kerangka Yi? Perisian yang disyorkan untuk Rangka Kerja YI Apr 18, 2025 pm 11:03 PM

Abstrak perenggan pertama artikel: Apabila memilih perisian untuk membangunkan aplikasi rangka kerja YI, pelbagai faktor perlu dipertimbangkan. Walaupun alat pembangunan aplikasi mudah alih asli seperti Xcode dan Android Studio dapat memberikan kawalan dan fleksibiliti yang kukuh, rangka kerja silang platform seperti React Native dan Flutter menjadi semakin popular dengan manfaat yang dapat digunakan ke pelbagai platform sekaligus. Bagi pemaju yang baru untuk pembangunan mudah alih, kod rendah atau platform tidak kod seperti AppSheet dan Glide dapat dengan cepat dan mudah membina aplikasi. Di samping itu, penyedia perkhidmatan awan seperti AWS menguatkan dan Firebase menyediakan alat yang komprehensif

See all articles