精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

自己動(dòng)手寫(xiě)數(shù)據(jù)庫(kù):解析 Select 語(yǔ)句并生成查詢樹(shù)

開(kāi)發(fā) 前端
前面我們?cè)趯?shí)現(xiàn) sql 解析器后,在解析完一條查詢語(yǔ)句后會(huì)創(chuàng)建一個(gè) QueryData 對(duì)象,本節(jié)我們看看如何根據(jù)這個(gè)對(duì)象構(gòu)建出合適的查詢規(guī)劃器(Plan)。我們將采取由簡(jiǎn)單到負(fù)責(zé)的原則,首先我們直接構(gòu)建 QueryData 的信息去構(gòu)建查詢規(guī)劃對(duì)象,此時(shí)我們不考慮它所構(gòu)造的查詢樹(shù)是否足夠優(yōu)化,后面我們?cè)俾倪M(jìn)構(gòu)造算法,直到算法能構(gòu)建出足夠優(yōu)化的查詢樹(shù)。

首先,我們需要給原來(lái)代碼打個(gè)補(bǔ)丁,在SelectScan 結(jié)構(gòu)體初始化時(shí)需要傳入 UpdateScan 接口對(duì)象,但很多時(shí)候我們需要傳入的是 Scan 對(duì)象,因此我們需要做一個(gè)轉(zhuǎn)換,也就是當(dāng)初始化 SelectScan 時(shí),如果傳入的是 Scan 對(duì)象,那么我們就將其封裝成 UpdateScan 接口對(duì)象,因此在 query 目錄下增加一個(gè)名為 updatescan_wrapper.go 的文件,在其中輸入內(nèi)容如下:

package query

import (
    "record_manager"
)

type UpdateScanWrapper struct {
    scan Scan
}

func NewUpdateScanWrapper(s Scan) *UpdateScanWrapper {
    return &UpdateScanWrapper{
        scan: s,
    }
}

func (u *UpdateScanWrapper) GetScan() Scan {
    return u.scan
}

func (u *UpdateScanWrapper) SetInt(fldName string, val int) {
    //DO NOTHING
}

func (u *UpdateScanWrapper) SetString(fldName string, val string) {
    //DO NOTHING
}

func (u *UpdateScanWrapper) SetVal(fldName string, val *Constant) {
    //DO NOTHING
}

func (u *UpdateScanWrapper) Insert() {
    //DO NOTHING
}

func (u *UpdateScanWrapper) Delete() {
    //DO NOTHING
}

func (u *UpdateScanWrapper) GetRid() *record_manager.RID {
    return nil
}

func (u *UpdateScanWrapper) MoveToRid(rid *record_manager.RID) {
    // DO NOTHING
}

上面代碼邏輯簡(jiǎn)單,如果調(diào)用 Scan 對(duì)象接口時(shí),他直接調(diào)用其 Scan 內(nèi)部對(duì)象的接口,如果調(diào)用到 UpdateScan 的接口,那么它什么都不做。完成上面代碼后,我們?cè)趕elect_plan.go 中進(jìn)行一些修改:

func (s *SelectPlan) Open() interface{} {
    scan := s.p.Open()
    updateScan, ok := scan.(query.UpdateScan)
    if !ok {
        updateScanWrapper := query.NewUpdateScanWrapper(scan.(query.Scan))
        return query.NewSelectionScan(updateScanWrapper, s.pred)
    }
    return query.NewSelectionScan(updateScan, s.pred)
}

上面代碼在創(chuàng)建 SelectScan 對(duì)象時(shí),先判斷傳進(jìn)來(lái)的對(duì)象是否能類型轉(zhuǎn)換為 UpdateScan,如果不能,那意味著s.p.Open 獲取的是 Scan 對(duì)象,因此我們使用前面的代碼封裝一下再用來(lái)創(chuàng)建 SelectScan 對(duì)象。完成這里的修改后,我們進(jìn)入正題。

前面我們?cè)趯?shí)現(xiàn) sql 解析器后,在解析完一條查詢語(yǔ)句后會(huì)創(chuàng)建一個(gè) QueryData 對(duì)象,本節(jié)我們看看如何根據(jù)這個(gè)對(duì)象構(gòu)建出合適的查詢規(guī)劃器(Plan)。我們將采取由簡(jiǎn)單到負(fù)責(zé)的原則,首先我們直接構(gòu)建 QueryData 的信息去構(gòu)建查詢規(guī)劃對(duì)象,此時(shí)我們不考慮它所構(gòu)造的查詢樹(shù)是否足夠優(yōu)化,后面我們?cè)俾倪M(jìn)構(gòu)造算法,直到算法能構(gòu)建出足夠優(yōu)化的查詢樹(shù)。

我們先看一個(gè)具體例子,假設(shè)我們現(xiàn)在有兩個(gè)表 STUDENT, EXAM,第一個(gè)表包含兩個(gè)字段分別是學(xué)生 id 和姓名:
id | name
———— | ——-
1 | Tom
2 | Jim
3 | John

第二個(gè)表包含的是學(xué)生 id,科目名稱,考試乘機(jī):
stuid | exam|grad
———— | ——-|——-|
1 | math| A|
1 | algorithm| B
2 | writing| C |
2| physics| C|
3|chemical|B|
3|english| C|

現(xiàn)在我們使用 sql 語(yǔ)句查詢所有考試成績(jī)得過(guò) A 的學(xué)生:

select name from STUDENT, EXAM where id = student_id and grad='A'

當(dāng) sql 解釋器讀取上面語(yǔ)句后,他就會(huì)創(chuàng)建一個(gè) QueryData 結(jié)構(gòu),里面 Tables 對(duì)了就包含兩個(gè)表的名字,也就是 STUDENT, EXAM。由于這兩個(gè)表不是視圖,因此上面代碼中判斷 if viewDef != nil 不成立,于是進(jìn)入 else 部分,也就是代碼會(huì)為這兩個(gè)表創(chuàng)建對(duì)應(yīng)的 TablePlan 對(duì)象,接下來(lái)直接對(duì)這兩個(gè)表執(zhí)行 Product 操作,也就是將左邊表的一行跟右邊表的每一行合起來(lái)形成新表的一行,Product 操作在 STUDENT 和 EXAM 表后所得結(jié)果如下:
id|name|student_id | exam|grad
————|——-|———— | ——-|——-|
1|Tom|1|math|A|
1|Tom|1|algorithm|B|
1|Tom|2|writing|A|
1|Tom|2|physics|C|
1|Tom|3|chemical|B|
1|Tom|3|english|A|
…..|….|…..|…|…|

接下來(lái)代碼創(chuàng)建 ScanSelect 對(duì)象在上面的表上,接著獲取該表的每一行,然后檢測(cè)該行的 id 字段是否跟 student_id 字段一樣,如果相同,那么查看其 grad 字段,如果該字段是’A’,就將該行的 name 字段顯示出來(lái)。

下面我們看看如何使用代碼把上面描述的流程實(shí)現(xiàn)出來(lái)。首先我們先對(duì)接口進(jìn)行定義,在 Planner 目錄下的 interface.go 文件中增加如下內(nèi)容:

type QueryPlanner interface {
    CreatePlan(data *query.QueryData, tx tx.Transaction) Plan
}

接著在 Planner 目錄下創(chuàng)建文件 query_planner.go,同時(shí)輸入以下代碼,代碼的實(shí)現(xiàn)邏輯將接下來(lái)的文章中進(jìn)行說(shuō)明:

package planner

import (
    "metadata_management"
    "parser"
    "tx"
)

type BasicQueryPlanner struct {
    mdm *metadata_management.MetaDataManager
}

func CreateBasicQueryPlanner(mdm *metadata_management.MetaDataManager) QueryPlanner {
    return &BasicQueryPlanner{
        mdm: mdm,
    }
}

func (b *BasicQueryPlanner) CreatePlan(data *parser.QueryData, tx *tx.Transaction) Plan {
    //1,直接創(chuàng)建 QueryData 對(duì)象中的表
    plans := make([]Plan, 0)
    tables := data.Tables()
    for _, tblname := range tables {
        //獲取該表對(duì)應(yīng)視圖的 sql 代碼
        viewDef := b.mdm.GetViewDef(tblname, tx)
        if viewDef != nil {
            //直接創(chuàng)建表對(duì)應(yīng)的視圖
            parser := parser.NewSQLParser(viewDef)
            viewData := parser.Query()
            //遞歸的創(chuàng)建對(duì)應(yīng)表的規(guī)劃器
            plans = append(plans, b.CreatePlan(viewData, tx))
        } else {
            plans = append(plans, NewTablePlan(tx, tblname, b.mdm))
        }
    }

    //將所有表執(zhí)行 Product 操作,注意表的次序會(huì)對(duì)后續(xù)查詢效率有重大影響,但這里我們不考慮表的次序,只是按照
    //給定表依次執(zhí)行 Product 操作,后續(xù)我們會(huì)在這里進(jìn)行優(yōu)化
    p := plans[0]
    plans = plans[1:]

    for _, nextPlan := range plans {
        p = NewProductPlan(p, nextPlan)
    }

    p = NewSelectPlan(p, data.Pred())

    return NewProjectPlan(p, data.Fields())
}

上面代碼中 QueryData就是解析器在解析 select 語(yǔ)句后生成的對(duì)象,它的 Tables 數(shù)組包含了 select 語(yǔ)句要查詢的表,所以上面代碼的 CreatePlan 函數(shù)先從 QueryData 對(duì)象獲得 select 語(yǔ)句要查詢的表,然后使用遍歷這些表,使用 NewProductPlan 創(chuàng)建這些表對(duì)應(yīng)的 Product 操作,最后在 Product 的基礎(chǔ)上我們?cè)賱?chuàng)建 SelectPlan,這里我們就相當(dāng)于使用 where 語(yǔ)句中的條件,在 Product 操作基礎(chǔ)上將滿足條件的行選出來(lái),最后再創(chuàng)建 ProjectPlan,將在選出的行基礎(chǔ)上,將需要的字段選擇出來(lái)。

下面我們測(cè)試一下上面代碼的效果,首先在 main.go 中,我們先把 student, exam 兩個(gè)表構(gòu)造出來(lái),代碼如下:

func createStudentTable() (*tx.Transation, *metadata_manager.MetaDataManager) {
    file_manager, _ := fm.NewFileManager("student", 2048)
    log_manager, _ := lm.NewLogManager(file_manager, "logfile.log")
    buffer_manager := bmg.NewBufferManager(file_manager, log_manager, 3)
    tx := tx.NewTransation(file_manager, log_manager, buffer_manager)
    sch := record_manager.NewSchema()
    mdm := metadata_manager.NewMetaDataManager(false, tx)

    sch.AddStringField("name", 16)
    sch.AddIntField("id")
    layout := record_manager.NewLayoutWithSchema(sch)

    ts := query.NewTableScan(tx, "student", layout)
    ts.BeforeFirst()
    for i := 1; i <= 3; i++ {
        ts.Insert() //指向一個(gè)可用插槽
        ts.SetInt("id", i)
        if i == 1 {
            ts.SetString("name", "Tom")
        }
        if i == 2 {
            ts.SetString("name", "Jim")
        }
        if i == 3 {
            ts.SetString("name", "John")
        }
    }

    mdm.CreateTable("student", sch, tx)

    exam_sch := record_manager.NewSchema()

    exam_sch.AddIntField("stuid")
    exam_sch.AddStringField("exam", 16)
    exam_sch.AddStringField("grad", 16)
    exam_layout := record_manager.NewLayoutWithSchema(exam_sch)

    ts = query.NewTableScan(tx, "exam", exam_layout)
    ts.BeforeFirst()

    ts.Insert() //指向一個(gè)可用插槽
    ts.SetInt("stuid", 1)
    ts.SetString("exam", "math")
    ts.SetString("grad", "A")

    ts.Insert() //指向一個(gè)可用插槽
    ts.SetInt("stuid", 1)
    ts.SetString("exam", "algorithm")
    ts.SetString("grad", "B")

    ts.Insert() //指向一個(gè)可用插槽
    ts.SetInt("stuid", 2)
    ts.SetString("exam", "writing")
    ts.SetString("grad", "C")

    ts.Insert() //指向一個(gè)可用插槽
    ts.SetInt("stuid", 2)
    ts.SetString("exam", "physics")
    ts.SetString("grad", "C")

    ts.Insert() //指向一個(gè)可用插槽
    ts.SetInt("stuid", 3)
    ts.SetString("exam", "chemical")
    ts.SetString("grad", "B")

    ts.Insert() //指向一個(gè)可用插槽
    ts.SetInt("stuid", 3)
    ts.SetString("exam", "english")
    ts.SetString("grad", "C")

    mdm.CreateTable("exam", exam_sch, tx)

    return tx, mdm
}

然后我們用解析器解析select查詢語(yǔ)句生成 QueryData 對(duì)象,最后使用BasicQueryPlanner創(chuàng)建好執(zhí)行樹(shù)和對(duì)應(yīng)的 Scan 接口對(duì)象,最后我們調(diào)用 Scan 對(duì)象的 Next 接口來(lái)獲取給定字段,代碼如下:

func main() {
    //構(gòu)造 student 表
    tx, mdm := createStudentTable()
    queryStr := "select name from student, exam where id = stuid and grad=\"A\""
    p := parser.NewSQLParser(queryStr)
    queryData := p.Query()
    test_planner := planner.CreateBasicQueryPlanner(mdm)
    test_plan := test_planner.CreatePlan(queryData, tx)
    test_interface := (test_plan.Open())
    test_scan, _ := test_interface.(query.Scan)
    for test_scan.Next() {
        fmt.Printf("name: %s\n", test_scan.GetString("name"))
    }

}

上面代碼運(yùn)行后所得結(jié)果如下:

責(zé)任編輯:武曉燕 來(lái)源: Coding迪斯尼
相關(guān)推薦

2015-10-28 09:55:39

Swift解析生產(chǎn)庫(kù)

2020-09-29 12:13:46

SQL引擎底層

2018-09-12 10:58:11

NBA數(shù)據(jù)存儲(chǔ)

2019-04-08 14:58:36

數(shù)據(jù)庫(kù)SQL數(shù)據(jù)類型

2022-04-05 13:46:21

日志數(shù)據(jù)庫(kù)系統(tǒng)

2015-06-02 09:51:40

iOS網(wǎng)絡(luò)請(qǐng)求封裝接口

2015-06-02 10:24:43

iOS網(wǎng)絡(luò)請(qǐng)求降低耦合

2017-03-02 13:31:02

監(jiān)控系統(tǒng)

2015-07-23 14:53:50

貝葉斯分類器

2014-11-26 10:54:20

C#

2019-03-01 18:50:09

SQL Server數(shù)據(jù)庫(kù)備份并壓縮

2011-07-22 16:59:30

MySQL數(shù)據(jù)庫(kù)嵌套查詢

2018-02-07 10:46:20

數(shù)據(jù)存儲(chǔ)

2011-08-15 16:58:34

SQL Server遠(yuǎn)程查詢批量導(dǎo)入數(shù)據(jù)

2021-05-13 14:34:34

數(shù)據(jù)庫(kù)PolarDB

2021-05-07 09:25:34

數(shù)據(jù)庫(kù)工具技術(shù)

2021-12-01 06:40:32

Bind原理實(shí)現(xiàn)

2015-06-02 09:41:00

iOS網(wǎng)絡(luò)請(qǐng)求NSURLSessio

2010-09-07 10:47:42

DB2數(shù)據(jù)庫(kù)

2009-09-02 09:12:17

SELECT語(yǔ)句DB2
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

久热在线中文字幕色999舞| 午夜精品福利一区二区蜜股av| 国产精品久久久久久久久久久久| 中文字幕av久久爽一区| 在线日韩三级| 亚洲人成电影网站色mp4| 国产精品免费在线 | 国产欧美日韩一区二区三区四区| 欧美在线不卡视频| 国产高清不卡无码视频| 免费在线观看污视频| 麻豆国产欧美一区二区三区| 亚洲777理论| 久久久人人爽| 国产精品自拍电影| 亚洲影视综合| 久久夜色精品国产亚洲aⅴ| 国产精品九九视频| 欧美成人黄色| 色综合久久久久| 天天想你在线观看完整版电影免费| 偷拍25位美女撒尿视频在线观看| 热久久国产精品| 欧美激情影音先锋| 一级黄色片日本| 性欧美lx╳lx╳| 日韩三级在线观看| 成年人网站大全| 婷婷丁香在线| 亚洲欧美在线视频观看| 热舞福利精品大尺度视频| 99免费在线视频| 亚洲永久免费精品| 久久久久亚洲精品国产| 天堂网avav| 色综合天天爱| 在线观看日韩视频| 日本xxx在线播放| 精品麻豆剧传媒av国产九九九| 色哟哟一区二区三区| 日本欧美视频在线观看| 影院在线观看全集免费观看| 国产精品每日更新在线播放网址 | 国内精品久久久久久中文字幕| 超碰人人人人人人人| 女人丝袜激情亚洲| 精品亚洲永久免费精品| www.啪啪.com| 国产精品欧美大片| 精品国免费一区二区三区| 久久精品国产99久久99久久久| 色8久久影院午夜场| 色欧美乱欧美15图片| 免费无码不卡视频在线观看| 国产在线xxx| 亚洲国产日韩av| 国产 欧美 日韩 一区| 亚洲wwwww| 一区二区三区在线观看网站| 中文字幕av导航| 日本免费中文字幕在线| 一区在线播放视频| 日韩第一页在线观看| 麻豆电影在线播放| 亚洲美女区一区| av久久久久久| 黄色影院在线看| 午夜精品福利一区二区三区av| 免费一级特黄毛片| 中文在线中文资源| 91黄色免费看| а 天堂 在线| 国产精品tv| 亚洲精品中文字幕有码专区| av电影在线不卡| 99re久久最新地址获取| 久热精品视频在线观看一区| 久久久全国免费视频| 99精品福利视频| 国产www精品| 97人妻精品一区二区三区| 国产精品一二三四五| 国产伦一区二区三区色一情| 欧美性孕妇孕交| 国产精品久久一卡二卡| 中文字幕日韩精品无码内射| 色老头在线观看| 日韩欧美在线观看| 午夜精品久久久久久久99热影院| 亚洲五码在线| 亚洲精品视频二区| 大地资源高清在线视频观看| 激情自拍一区| 国产精品91在线观看| 国产精品久久久久久69| 成人18精品视频| 欧美日韩一区二 | 国产又粗又黄视频| 成人做爰69片免费看网站| 欧美中文娱乐网| 成人在线免费看黄| 欧美性猛交丰臀xxxxx网站| 日韩欧美国产片| 欧美一区 二区| 久久久精品日本| 国产精品第5页| 国产在线精品国自产拍免费| 久久久婷婷一区二区三区不卡| 调教视频免费在线观看| 精品动漫一区二区三区| 天天综合天天添夜夜添狠狠添| 麻豆国产欧美一区二区三区r| 中文字幕精品网| 国产成人无码精品久在线观看| 美女脱光内衣内裤视频久久网站| 国产一区在线观| 免费黄色在线网站| 日本高清不卡在线观看| wwwww在线观看| 首页国产精品| 欧美中文字幕在线播放| 亚洲av无码乱码在线观看性色| 国产日韩欧美制服另类| 男女猛烈激情xx00免费视频| www.久久爱.com| 亚洲人成电影网| av大片免费在线观看| 国产九色精品成人porny| 五月天亚洲综合| 成人免费看视频网站| 精品免费视频.| 国产性生活大片| 奇米四色…亚洲| 免费中文日韩| 欧美aa在线| 欧美精品一区在线观看| 欧美成人三级视频| 精品一区二区在线视频| 亚洲成人第一| 国产一区一一区高清不卡| 亚洲精品在线视频| 91精品国产高清一区二区三密臀| 99久久综合狠狠综合久久| 国产欧美精品aaaaaa片| 九九九九九九精品任你躁| 精品国产一区二区在线| 亚洲一区二区激情| 国产精品三级电影| 天天干天天操天天做| 色喇叭免费久久综合| 国产人妖伪娘一区91| 性开放的欧美大片| 欧美日韩激情一区二区| 国产又黄又粗又猛又爽的| 免费观看日韩电影| 亚洲一区二区三区欧美| 日韩伦理一区二区| 久久夜色精品国产| 丰满人妻一区二区三区免费| 亚洲一区二区三区精品在线| 中国特级黄色大片| 99国产精品| 欧美日韩一区二区三| 色老太综合网| 色黄久久久久久| 国产乱码久久久| 亚洲一区二区三区四区五区黄 | 啦啦啦免费高清视频在线观看| 成人午夜av影视| 久久视频这里有精品| 欧美色图婷婷| 国产精品久久久久久搜索| sese一区| 91精品国产乱| 国产亚洲欧美精品久久久www| 成人中文字幕在线| 日韩精品视频久久| 欧洲杯半决赛直播| 成人精品一区二区三区电影免费 | 亚州精品天堂中文字幕| 久久精品a一级国产免视看成人 | 好男人在线视频www| 都市激情亚洲色图| 国产精品无码无卡无需播放器| 国产一区激情在线| 久久久久久久午夜| 成人在线国产| 国产精品久久波多野结衣| xxxxxx欧美| 免费97视频在线精品国自产拍| 黄片毛片在线看| 欧美吻胸吃奶大尺度电影| 乱h高h女3p含苞待放| 91美女视频网站| 日韩av.com| 亚洲综合日韩| 国产麻豆电影在线观看| 亚洲天堂日韩在线| 亚洲一区二区三区久久| 中文字幕在线看片| 久久国产精品亚洲| 国产色a在线| 日韩亚洲欧美成人一区| 亚洲毛片一区二区三区| 亚洲一区二区综合| 九九九视频在线观看| 大尺度一区二区| mm131亚洲精品| 99精品视频免费观看视频| 中文字幕成人一区| 九九在线高清精品视频| av免费观看久久| 欧美黄色网络| 日韩av手机在线| 欧美1—12sexvideos| 日韩中文综合网| 看电影就来5566av视频在线播放| 日韩欧美电影一二三| 中文字幕有码视频| 狠狠色狠色综合曰曰| 久久久久久久蜜桃| 中文字幕亚洲电影| 色无极影院亚洲| 成人午夜精品一区二区三区| 国产精品区在线| 免费久久99精品国产自在现线| 精品国产一区二区三区无码| 外国成人免费视频| 视频一区二区三| 在线成人动漫av| 国产尤物99| 成人资源在线| 91手机在线观看| 国产精品**亚洲精品| 国产精品狼人色视频一区| 在线观看欧美日韩电影| 韩国美女主播一区| 7777kkk亚洲综合欧美网站| 久久国产精彩视频| 1024在线播放| 久久九九有精品国产23| 日本中文字幕在线观看| 中文字幕日韩有码| av在线资源站| 伊人精品在线观看| 99中文字幕一区| 在线观看成人黄色| 91大神在线网站| 中文字幕v亚洲ⅴv天堂| av在线收看| 中文精品99久久国产香蕉| av在线日韩国产精品| 自拍亚洲一区欧美另类| 日本在线视频网| 久久精品电影网站| 18+激情视频在线| 欧美激情伊人电影 | 狠狠躁天天躁日日躁欧美| 在线天堂中文字幕| 日韩欧美在线免费观看| 欧美国产成人精品一区二区三区| 欧美性xxxxx极品娇小| 老熟妇仑乱一区二区av| 欧洲av在线精品| 91亚洲国产成人精品一区| 欧美色区777第一页| 一级黄色免费片| 日韩一区二区麻豆国产| 亚洲精品久久久蜜桃动漫| 欧美精品一区二区久久婷婷| 天堂a√在线| 色青青草原桃花久久综合| 黄色成人影院| 久久久免费观看视频| 在线视频cao| 国产精自产拍久久久久久蜜| 日韩伦理一区二区| 成人在线观看av| 综合伊思人在钱三区| 天堂av一区二区| 欧美成人精品| 青青视频在线播放| 久久国产婷婷国产香蕉| 美女又黄又免费的视频| 91老师国产黑色丝袜在线| 懂色av蜜臀av粉嫩av永久| 亚洲蜜桃精久久久久久久| 97免费在线观看视频| 欧美三级欧美一级| 性中国古装videossex| 亚洲嫩模很污视频| 好了av在线| 日本a级片电影一区二区| 57pao成人永久免费| 精品欧美一区二区三区久久久 | www.中文字幕在线观看| 欧美丝袜丝nylons| 亚洲精品综合网| 永久免费毛片在线播放不卡| 日韩经典av| 国产精品久久久久久久美男| 国产精品18hdxxxⅹ在线| 亚洲国产激情一区二区三区| 国内久久精品| 亚洲天堂网一区| 成人app下载| 精品国产精品国产精品| 色婷婷综合久久久| 亚洲国产成人精品一区二区三区| 亚洲欧美精品suv| 欧美家庭影院| 国产区精品在线观看| 免费欧美一区| 国产96在线 | 亚洲| 精品一区二区三区久久| 中文字幕xxx| 亚洲国产一区二区视频| 国产又粗又猛又爽又黄视频| 亚洲欧美日韩网| 1234区中文字幕在线观看| 91久久精品视频| 日韩国产欧美| 白嫩少妇丰满一区二区| 99在线精品视频| 欧美国产在线看| 91精品免费观看| 自拍视频在线| 国产精品麻豆va在线播放| 日韩精品福利一区二区三区| 免费网站在线观看视频| 激情六月婷婷久久| 蜜桃av免费观看| 欧美三电影在线| 国产系列电影在线播放网址| 91成人免费观看网站| 精品视频高潮| 欧美图片激情小说| 福利视频网站一区二区三区| www.97视频| 欧美精品久久久久久久多人混战 | 粉嫩久久久久久久极品| 路边理发店露脸熟妇泻火| 精品一区二区三区在线播放视频 | 亚洲一区二三区| 亚洲爱爱综合网| 欧美激情欧美激情| 午夜免费欧美电影| 特级西西444| 国产91精品欧美| 国产第一页第二页| 精品国产乱码91久久久久久网站| 日本天码aⅴ片在线电影网站| 91免费在线观看网站| 午夜激情一区| 久久久久久久穴| 精品magnet| 国外av在线| 国产精品一区二区3区| 99久久夜色精品国产亚洲96| 污网站在线免费| 亚洲人成7777| 国产77777| 欧美影院久久久| 欧美日韩一区二区三区视频播放| 激情五月亚洲色图| 国产精品免费久久| 国产色片在线观看| 欧美激情视频一区| 色婷婷久久久| 一区二区三区 欧美| 综合在线观看色| 丰满熟妇乱又伦| 日本一区二区在线播放| 日韩不卡一区| 91精品人妻一区二区三区蜜桃2 | 久久亚洲私人国产精品va媚药| 区一区二在线观看| 色偷偷9999www| 一区二区在线视频观看| 大j8黑人w巨大888a片| 国产欧美中文在线| 99这里有精品视频| 91精品国产91久久| 日韩中字在线| xfplay5566色资源网站| 在线一区二区三区| 自由的xxxx在线视频| 六十路精品视频| 九九精品视频在线看| 国产成人啪精品午夜在线观看| 亚洲欧洲av一区二区| 日韩午夜视频在线| 131美女爱做视频| 国产精品区一区二区三| 丰满人妻一区二区三区无码av | 日韩在线观看中文字幕| 国产精品丝袜久久久久久消防器材| 国产精品乱码一区二区三区软件 | 久久亚洲国产精品尤物| 成人黄色大片网站|