国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

Postgres中UPDATE更新語句源碼分析

 更新時間:2022年03月05日 09:22:08   作者:chirpyli  
這篇文章主要給大家介紹了關(guān)于Postgres中UPDATE更新語句源碼分析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

PG中UPDATE源碼分析

本文主要描述SQL中UPDATE語句的源碼分析,代碼為PG13.3版本。

整體流程分析

update dtea set id = 1;這條最簡單的Update語句進行源碼分析(dtea不是分區(qū)表,不考慮并行等,沒有建立任何索引),幫助我們理解update的大致流程。

SQL流程如下:

  • parser(語法解析,生成語法解析樹UpdateStmt,檢查是否有語法層面的錯誤)

  • analyze(語義分析, UpdateStmt轉(zhuǎn)為查詢樹Query, 會查系統(tǒng)表檢查有無語義方面的錯誤)

  • rewrite(規(guī)則重寫, 根據(jù)規(guī)則rules重寫查詢樹Query, 根據(jù)事先存儲在系統(tǒng)表中的規(guī)則進行重寫,沒有的話不進行重寫,另外加一句,視圖的實現(xiàn)是根據(jù)規(guī)則系統(tǒng)實現(xiàn)的,也是在這里需要進行處理)

  • optimizer(優(yōu)化器:邏輯優(yōu)化、物理優(yōu)化、生成執(zhí)行計劃, 由Query生成對應(yīng)的執(zhí)行計劃PlannedStmt, 基于代價的優(yōu)化器,由最佳路徑Path生成最佳執(zhí)行計劃Plan)

  • executor(執(zhí)行器,會有各種算子,依據(jù)執(zhí)行計劃進行處理,火山模型,一次一元組)

  • storage(存儲引擎)。中間還有事務(wù)處理。事務(wù)處理部分的代碼這里不再進行分析,免得將問題復(fù)雜化。存儲引擎那部分也不進行分析,重點關(guān)注解析、優(yōu)化、執(zhí)行這三部分。

對應(yīng)的代碼:

exec_simple_query(const?char?*query_string)
//?-------?解析器部分--------------
-->?pg_parse_query(query_string);????//生成語法解析樹
-->?pg_analyze_and_rewrite(parsetree,?query_string,NULL,?0,?NULL);???//?生成查詢樹Query
????-->?parse_analyze(parsetree,?query_string,?paramTypes,?numParams,queryEnv);?//?語義分析
????-->?pg_rewrite_query(query);????//?規(guī)則重寫

//?--------優(yōu)化器----------
-->?pg_plan_queries()

//--------?執(zhí)行器----------
-->?PortalStart(portal,?NULL,?0,?InvalidSnapshot);
-->?PortalRun(portal,FETCH_ALL,true,true,receiver,receiver,&qc);????//?執(zhí)行器執(zhí)行
-->?PortalDrop(portal,?false);

解析部分——生成語法解析樹UpdateStmt

關(guān)鍵數(shù)據(jù)結(jié)構(gòu):UpdateStmt、RangeVarResTarget:

/*?Update?Statement??*/
typedef?struct?UpdateStmt
{
?NodeTag??type;
?RangeVar???*relation;??/*?relation?to?update?*/
?List????*targetList;??/*?the?target?list?(of?ResTarget)?*/?//?對應(yīng)語句中的set?id?=?0;信息在這里
?Node????*whereClause;?/*?qualifications?*/
?List????*fromClause;??/*?optional?from?clause?for?more?tables?*/
?List????*returningList;?/*?list?of?expressions?to?return?*/
?WithClause?*withClause;??/*?WITH?clause?*/
}?UpdateStmt;

//?dtea?表
typedef?struct?RangeVar
{
?NodeTag??type;
?char????*catalogname;?/*?the?catalog?(database)?name,?or?NULL?*/
?char????*schemaname;??/*?the?schema?name,?or?NULL?*/
?char????*relname;??/*?the?relation/sequence?name?*/
?bool??inh;???/*?expand?rel?by?inheritance??recursively?act
?????????*?on?children??*/
?char??relpersistence;?/*?see?RELPERSISTENCE_*?in?pg_class.h?*/
?Alias????*alias;???/*?table?alias?&?optional?column?aliases?*/
?int???location;??/*?token?location,?or?-1?if?unknown?*/
}?RangeVar;

//?set?id?=?0;???經(jīng)transformTargetList()?->?transformTargetEntry,會轉(zhuǎn)為TargetEntry
typedef?struct?ResTarget
{
?NodeTag??type;
?char????*name;???/*?column?name?or?NULL?*/?????//?id?column
?List????*indirection;?/*?subscripts,?field?names,?and?'*',?or?NIL?*/
?Node????*val;???/*?the?value?expression?to?compute?or?assign?*/??//?=?1表達(dá)式節(jié)點存在這里
?int???location;??/*?token?location,?or?-1?if?unknown?*/
}?ResTarget;

用戶輸入的update語句update dtea set id = 1由字符串會轉(zhuǎn)為可由數(shù)據(jù)庫理解的內(nèi)部數(shù)據(jù)結(jié)構(gòu)語法解析樹UpdateStmt。執(zhí)行邏輯在pg_parse_query(query_string);中,需要理解flex與bison。

gram.y中Update語法的定義:

/*****************************************************************************
?*??QUERY:
?*????UpdateStmt?(UPDATE)
?*****************************************************************************/
//結(jié)合這條語句分析?update?dtea?set?id?=?0;
UpdateStmt:?opt_with_clause?UPDATE?relation_expr_opt_alias
???SET?set_clause_list?from_clause?where_or_current_clause?returning_clause
????{
?????UpdateStmt?*n?=?makeNode(UpdateStmt);
?????n->relation?=?$3;
?????n->targetList?=?$5;
?????n->fromClause?=?$6;
?????n->whereClause?=?$7;
?????n->returningList?=?$8;
?????n->withClause?=?$1;
?????$$?=?(Node?*)n;
????}
??;

set_clause_list:
???set_clause???????{?$$?=?$1;?}
???|?set_clause_list?','?set_clause?{?$$?=?list_concat($1,$3);?}
??;
//?對應(yīng)的是?set?id?=?0
set_clause:???//?id?????=???0
???set_target?'='?a_expr
????{
?????$1->val?=?(Node?*)?$3;
?????$$?=?list_make1($1);
????}
???|?'('?set_target_list?')'?'='?a_expr
????{
?????int?ncolumns?=?list_length($2);
?????int?i?=?1;
?????ListCell?*col_cell;

?????foreach(col_cell,?$2)?/*?Create?a?MultiAssignRef?source?for?each?target?*/
?????{
??????ResTarget?*res_col?=?(ResTarget?*)?lfirst(col_cell);
??????MultiAssignRef?*r?=?makeNode(MultiAssignRef);

??????r->source?=?(Node?*)?$5;
??????r->colno?=?i;
??????r->ncolumns?=?ncolumns;
??????res_col->val?=?(Node?*)?r;
??????i++;
?????}

?????$$?=?$2;
????}
??;

set_target:
???ColId?opt_indirection
????{
?????$$?=?makeNode(ResTarget);
?????$$->name?=?$1;
?????$$->indirection?=?check_indirection($2,?yyscanner);
?????$$->val?=?NULL;?/*?upper?production?sets?this?*/
?????$$->location?=?@1;
????}
??;

set_target_list:
???set_target????????{?$$?=?list_make1($1);?}
???|?set_target_list?','?set_target??{?$$?=?lappend($1,$3);?}
??;

解析部分——生成查詢樹Query

生成了UpdateStmt后, 會經(jīng)由parse_analyze語義分析,生成查詢樹Query,以供后續(xù)優(yōu)化器生成執(zhí)行計劃。主要代碼在src/backent/parser/analyze.c

analyze.c : transform the raw parse tree into a query tree

parse_analyze()
-->?transformTopLevelStmt(pstate,?parseTree);
????-->?transformOptionalSelectInto(pstate,?parseTree->stmt);
????????-->?transformStmt(pstate,?parseTree);
????????????//?transforms?an?update?statement
????????????-->?transformUpdateStmt(pstate,?(UpdateStmt?*)?parseTree);??//?實際由UpdateStmt轉(zhuǎn)為Query的處理函數(shù)

具體的我們看一下transformUpdateStmt函數(shù)實現(xiàn):

/*?transformUpdateStmt?-??transforms?an?update?statement??*/
static?Query?*transformUpdateStmt(ParseState?*pstate,?UpdateStmt?*stmt)?{
?Query????*qry?=?makeNode(Query);
?ParseNamespaceItem?*nsitem;
?Node????*qual;

?qry->commandType?=?CMD_UPDATE;
?pstate->p_is_insert?=?false;

?/*?process?the?WITH?clause?independently?of?all?else?*/
?if?(stmt->withClause)?{
??qry->hasRecursive?=?stmt->withClause->recursive;
??qry->cteList?=?transformWithClause(pstate,?stmt->withClause);
??qry->hasModifyingCTE?=?pstate->p_hasModifyingCTE;
?}

?qry->resultRelation?=?setTargetTable(pstate,?stmt->relation,?stmt->relation->inh,?true,?ACL_UPDATE);
?nsitem?=?pstate->p_target_nsitem;

?/*?subqueries?in?FROM?cannot?access?the?result?relation?*/
?nsitem->p_lateral_only?=?true;
?nsitem->p_lateral_ok?=?false;

?/*?the?FROM?clause?is?non-standard?SQL?syntax.?We?used?to?be?able?to?do?this?with?REPLACE?in?POSTQUEL?so?we?keep?the?feature.*/
?transformFromClause(pstate,?stmt->fromClause);

?/*?remaining?clauses?can?reference?the?result?relation?normally?*/
?nsitem->p_lateral_only?=?false;
?nsitem->p_lateral_ok?=?true;

?qual?=?transformWhereClause(pstate,?stmt->whereClause,EXPR_KIND_WHERE,?"WHERE");
?qry->returningList?=?transformReturningList(pstate,?stmt->returningList);

?/*?Now?we?are?done?with?SELECT-like?processing,?and?can?get?on?with
??*?transforming?the?target?list?to?match?the?UPDATE?target?columns.*/
?qry->targetList?=?transformUpdateTargetList(pstate,?stmt->targetList);??//?處理SQL語句中的?set?id?=1?

?qry->rtable?=?pstate->p_rtable;
?qry->jointree?=?makeFromExpr(pstate->p_joinlist,?qual);
?qry->hasTargetSRFs?=?pstate->p_hasTargetSRFs;
?qry->hasSubLinks?=?pstate->p_hasSubLinks;

?assign_query_collations(pstate,?qry);

?return?qry;
}

這里面要重點關(guān)注一下transformTargetList,會將抽象語法樹中的ResTarget轉(zhuǎn)為查詢器的TargetEntry。

typedef?struct?TargetEntry
{
?Expr??xpr;
?Expr????*expr;???/*?expression?to?evaluate?*/
?AttrNumber?resno;???/*?attribute?number?(see?notes?above)?*/
?char????*resname;??/*?name?of?the?column?(could?be?NULL)?*/
?Index??ressortgroupref;?/*?nonzero?if?referenced?by?a?sort/group?clause?*/
?Oid???resorigtbl;??/*?OID?of?column's?source?table?*/
?AttrNumber?resorigcol;??/*?column's?number?in?source?table?*/
?bool??resjunk;??/*?set?to?true?to?eliminate?the?attribute?from?final?target?list?*/
}?TargetEntry;

對于其內(nèi)部處理可參考源碼src/backend/parser中的相關(guān)處理,這里不再細(xì)述。需要重點閱讀一下README,PG源碼中所有的README都是非常好的資料,一定要認(rèn)真讀。

優(yōu)化器——生成執(zhí)行計劃

這塊的內(nèi)容很多,主要的邏輯是先進行邏輯優(yōu)化,比如子查詢、子鏈接、常量表達(dá)式、選擇下推等等的處理,因為我們要分析的這條語句十分簡單,所以邏輯優(yōu)化的這部分都沒有涉及到。物理優(yōu)化,涉及到選擇率,代價估計,索引掃描還是順序掃描,選擇那種連接方式,應(yīng)用動態(tài)規(guī)劃呢還是基因算法,選擇nestloop-join、merge-join還是hash-join等。因為我們這個表沒有建索引,更新單表也不涉及到多表連接,所以物理優(yōu)化這塊涉及的也不多。路徑生成,生成最佳路徑,再由最佳路徑生成執(zhí)行計劃。

在路徑生成這塊,最基礎(chǔ)的是對表的掃描方式,比如順序掃描、索引掃描,再往上是連接方式,采用那種連接方式,再往上是比如排序、Limit等路徑......,由底向上生成路徑。我們要分析的語句很簡單,沒有其他處理,就順序掃描再更新就可以了。

這里先不考慮并行執(zhí)行計劃。我們先看一下其執(zhí)行計劃結(jié)果:

postgres@postgres=#?explain?update?dtea?set?id?=?0;
??????????????????????????QUERY?PLAN??????????????????????????
--------------------------------------------------------------
?Update?on?dtea??(cost=0.00..19.00?rows=900?width=68)
???->??Seq?Scan?on?dtea??(cost=0.00..19.00?rows=900?width=68)
(2?rows)

下面我們分析一下其執(zhí)行計劃的生成流程:

//?由查詢樹Query-->?Path?-->?Plan?(PlannedStmt)
pg_plan_queries()
-->?pg_plan_query()
????-->?planner()
????????-->?standard_planner(Query?*parse,?const?char?*query_string,?int?cursorOptions,ParamListInfo?boundParams)
????????????//?由Query--->?PlannerInfo
????????????-->?subquery_planner(glob,?parse,?NULL,false,?tuple_fraction);??//?涉及到很多邏輯優(yōu)化的內(nèi)容,很多不列出
????????????????-->?pull_up_sublinks(root);
????????????????-->?pull_up_subqueries(root);???//?這里只列出幾個重要的邏輯優(yōu)化內(nèi)容,其他的不再列出......
????????????????//?如果是update/delete分區(qū)表繼承表則走inheritance_planner(),其他情況走grouping_planner()
????????????????-->?inheritance_planner()???//?update/delete分區(qū)表繼承表的情況
????????????????????-->?grouping_planner()
????????????????-->?grouping_planner()?//?非分區(qū)表、繼承表的情況
????????????????????-->?preprocess_targetlist(root);?//?update雖然只更新一列,但是插入一條新元組的時候,需要知道其他列信息.
????????????????????????-->?rewriteTargetListUD(parse,?target_rte,?target_relation);
????????????????????????-->?expand_targetlist()
????????????????????-->?query_planner(root,?standard_qp_callback,?&qp_extra);???//?重要
????????????????????????-->?add_base_rels_to_query()
????????????????????????-->?deconstruct_jointree(root);
????????????????????????-->?add_other_rels_to_query(root);?//?展開分區(qū)表到PlannerInfo中的相關(guān)字段中?
????????????????????????????-->?expand_inherited_rtentry()??
????????-->?expand_planner_arrays(root,?num_live_parts);
????????????????????????-->?make_one_rel(root,?joinlist);???
????????????????????????????-->?set_base_rel_sizes(root);?
????????????????????????????????-->?set_rel_size();
?????????-->?set_append_rel_size(root,?rel,?rti,?rte);?//?如果是分區(qū)表或者繼承走這里,否則走下面
??????????-->?set_rel_size(root,?childrel,?childRTindex,?childRTE);?//?處理子分區(qū)表
???????????-->?set_plain_rel_size(root,?rel,?rte);
????????????????????????????????????-->?set_plain_rel_size()???//?如果不是分區(qū)表或者繼承
????????????????????????????????????????-->?set_baserel_size_estimates()
????????????????????????????-->?set_base_rel_pathlists(root);
????????-->?set_rel_pathlist(root,?rel,?rti,?root->simple_rte_array[rti]);
?????????-->?set_append_rel_pathlist(root,?rel,?rti,?rte);?//?生成各分區(qū)表的訪問路徑
????????????????????????????-->?make_rel_from_joinlist(root,?joinlist);//?動態(tài)規(guī)劃還是基因規(guī)劃
????????-->?standard_join_search()?//?動態(tài)規(guī)劃
????????-->?geqo()?//?基因規(guī)劃與動態(tài)規(guī)劃二選一
????????????????????-->?apply_scanjoin_target_to_paths()
????????????????????-->?create_modifytable_path()
????????????//?由PlannerInfo--->?RelOptInfo?
????????????-->?fetch_upper_rel(root,?UPPERREL_FINAL,?NULL);
????????????//?由RelOptInfo--->?Path
????????????-->?get_cheapest_fractional_path(final_rel,?tuple_fraction);
????????????//?由?PlannerInfo+Path??--->?Plan
????????????-->?create_plan(root,?best_path);
????????????//?后續(xù)處理,由Plan?--->?PlannedStmt

核心數(shù)據(jù)結(jié)構(gòu):PlannedStmt、PlannerInfo、RelOptInfo(存儲訪問路徑及其代價)、Path

Path:所有的路徑都繼承自Path,所以這個比較重要。

typedef?struct?Path
{
?NodeTag??type;
?NodeTag??pathtype;??/*?tag?identifying?scan/join?method?*/

?RelOptInfo?*parent;???/*?the?relation?this?path?can?build?*/
?PathTarget?*pathtarget;??/*?list?of?Vars/Exprs,?cost,?width?*/

?ParamPathInfo?*param_info;?/*?parameterization?info,?or?NULL?if?none?*/

?bool??parallel_aware;?/*?engage?parallel-aware?logic??*/
?bool??parallel_safe;?/*?OK?to?use?as?part?of?parallel?plan??*/
?int???parallel_workers;?/*?desired?#?of?workers;?0?=?not?parallel?*/

?/*?estimated?size/costs?for?path?(see?costsize.c?for?more?info)?*/
?double??rows;???/*?estimated?number?of?result?tuples?*/
?Cost??startup_cost;?/*?cost?expended?before?fetching?any?tuples?*/
?Cost??total_cost;??/*?total?cost?(assuming?all?tuples?fetched)?*/

?List????*pathkeys;??/*?sort?ordering?of?path's?output?*/
?/*?pathkeys?is?a?List?of?PathKey?nodes;?see?above?*/
}?Path;

/*?ModifyTablePath?represents?performing?INSERT/UPDATE/DELETE?modifications
?*?We?represent?most?things?that?will?be?in?the?ModifyTable?plan?node
?*?literally,?except?we?have?child?Path(s)?not?Plan(s).??But?analysis?of?the
?*?OnConflictExpr?is?deferred?to?createplan.c,?as?is?collection?of?FDW?data.?*/
typedef?struct?ModifyTablePath
{
?Path??path;???//?可以看到ModifyTablePath繼承自Path
?CmdType??operation;??/*?INSERT,?UPDATE,?or?DELETE?*/
?bool??canSetTag;??/*?do?we?set?the?command?tag/es_processed??*/
?Index??nominalRelation;?/*?Parent?RT?index?for?use?of?EXPLAIN?*/
?Index??rootRelation;?/*?Root?RT?index,?if?target?is?partitioned?*/
?bool??partColsUpdated;?/*?some?part?key?in?hierarchy?updated?*/
?List????*resultRelations;?/*?integer?list?of?RT?indexes?*/
?List????*subpaths;??/*?Path(s)?producing?source?data?*/
?List????*subroots;??/*?per-target-table?PlannerInfos?*/
?List????*withCheckOptionLists;?/*?per-target-table?WCO?lists?*/
?List????*returningLists;?/*?per-target-table?RETURNING?tlists?*/
?List????*rowMarks;??/*?PlanRowMarks?(non-locking?only)?*/
?OnConflictExpr?*onconflict;?/*?ON?CONFLICT?clause,?or?NULL?*/
?int???epqParam;??/*?ID?of?Param?for?EvalPlanQual?re-eval?*/
}?ModifyTablePath;

生成update執(zhí)行路徑,最終都是要生成ModifyTablePath,本例中路徑生成過程:Path-->ProjectionPath-->ModifyTablePath,也就是先順序掃描表,再修改表。后面由路徑生成執(zhí)行計劃。

/*?create_modifytable_path
?*???Creates?a?pathnode?that?represents?performing?INSERT/UPDATE/DELETE?mods
?*
?*?'rel'?is?the?parent?relation?associated?with?the?result
?*?'resultRelations'?is?an?integer?list?of?actual?RT?indexes?of?target?rel(s)
?*?'subpaths'?is?a?list?of?Path(s)?producing?source?data?(one?per?rel)
?*?'subroots'?is?a?list?of?PlannerInfo?structs?(one?per?rel)*/
ModifyTablePath?*create_modifytable_path(PlannerInfo?*root,?RelOptInfo?*rel,
??????CmdType?operation,?bool?canSetTag,
??????Index?nominalRelation,?Index?rootRelation,
??????bool?partColsUpdated,
??????List?*resultRelations,?List?*subpaths,
??????List?*subroots,
??????List?*withCheckOptionLists,?List?*returningLists,
??????List?*rowMarks,?OnConflictExpr?*onconflict,
??????int?epqParam)
{
?ModifyTablePath?*pathnode?=?makeNode(ModifyTablePath);
?double??total_size;
?ListCell???*lc;

?Assert(list_length(resultRelations)?==?list_length(subpaths));
?Assert(list_length(resultRelations)?==?list_length(subroots));
?Assert(withCheckOptionLists?==?NIL?||?list_length(resultRelations)?==?list_length(withCheckOptionLists));
?Assert(returningLists?==?NIL?||?list_length(resultRelations)?==?list_length(returningLists));

?pathnode->path.pathtype?=?T_ModifyTable;
?pathnode->path.parent?=?rel;

?pathnode->path.pathtarget?=?rel->reltarget;?/*?pathtarget?is?not?interesting,?just?make?it?minimally?valid?*/
?/*?For?now,?assume?we?are?above?any?joins,?so?no?parameterization?*/
?pathnode->path.param_info?=?NULL;
?pathnode->path.parallel_aware?=?false;
?pathnode->path.parallel_safe?=?false;
?pathnode->path.parallel_workers?=?0;
?pathnode->path.pathkeys?=?NIL;

?/**?Compute?cost?&?rowcount?as?sum?of?subpath?costs?&?rowcounts.
??*
??*?Currently,?we?don't?charge?anything?extra?for?the?actual?table
??*?modification?work,?nor?for?the?WITH?CHECK?OPTIONS?or?RETURNING
??*?expressions?if?any.??It?would?only?be?window?dressing,?since
??*?ModifyTable?is?always?a?top-level?node?and?there?is?no?way?for?the
??*?costs?to?change?any?higher-level?planning?choices.??But?we?might?want
??*?to?make?it?look?better?sometime.*/
?pathnode->path.startup_cost?=?0;
?pathnode->path.total_cost?=?0;
?pathnode->path.rows?=?0;
?total_size?=?0;
?foreach(lc,?subpaths)
?{
??Path????*subpath?=?(Path?*)?lfirst(lc);

??if?(lc?==?list_head(subpaths))?/*?first?node??*/
???pathnode->path.startup_cost?=?subpath->startup_cost;
??pathnode->path.total_cost?+=?subpath->total_cost;
??pathnode->path.rows?+=?subpath->rows;
??total_size?+=?subpath->pathtarget->width?*?subpath->rows;
?}

?/*?Set?width?to?the?average?width?of?the?subpath?outputs.??XXX?this?is
??*?totally?wrong:?we?should?report?zero?if?no?RETURNING,?else?an?average
??*?of?the?RETURNING?tlist?widths.??But?it's?what?happened?historically,
??*?and?improving?it?is?a?task?for?another?day.*/
?if?(pathnode->path.rows?>?0)
??total_size?/=?pathnode->path.rows;
?pathnode->path.pathtarget->width?=?rint(total_size);

?pathnode->operation?=?operation;
?pathnode->canSetTag?=?canSetTag;
?pathnode->nominalRelation?=?nominalRelation;
?pathnode->rootRelation?=?rootRelation;
?pathnode->partColsUpdated?=?partColsUpdated;
?pathnode->resultRelations?=?resultRelations;
?pathnode->subpaths?=?subpaths;
?pathnode->subroots?=?subroots;
?pathnode->withCheckOptionLists?=?withCheckOptionLists;
?pathnode->returningLists?=?returningLists;
?pathnode->rowMarks?=?rowMarks;
?pathnode->onconflict?=?onconflict;
?pathnode->epqParam?=?epqParam;

?return?pathnode;
}

現(xiàn)在我們生成了最優(yōu)的update路徑,需要由路徑生成執(zhí)行計劃:

Plan?*create_plan(PlannerInfo?*root,?Path?*best_path)
{
?Plan????*plan;
?Assert(root->plan_params?==?NIL);?/*?plan_params?should?not?be?in?use?in?current?query?level?*/

?/*?Initialize?this?module's?workspace?in?PlannerInfo?*/
?root->curOuterRels?=?NULL;
?root->curOuterParams?=?NIL;

?/*?Recursively?process?the?path?tree,?demanding?the?correct?tlist?result?*/
?plan?=?create_plan_recurse(root,?best_path,?CP_EXACT_TLIST);?//?實際實現(xiàn)是在這里

?/**?Make?sure?the?topmost?plan?node's?targetlist?exposes?the?original
??*?column?names?and?other?decorative?info.??Targetlists?generated?within
??*?the?planner?don't?bother?with?that?stuff,?but?we?must?have?it?on?the
??*?top-level?tlist?seen?at?execution?time.??However,?ModifyTable?plan
??*?nodes?don't?have?a?tlist?matching?the?querytree?targetlist.*/
?if?(!IsA(plan,?ModifyTable))
??apply_tlist_labeling(plan->targetlist,?root->processed_tlist);

?/**?Attach?any?initPlans?created?in?this?query?level?to?the?topmost?plan
??*?node.??(In?principle?the?initplans?could?go?in?any?plan?node?at?or
??*?above?where?they're?referenced,?but?there?seems?no?reason?to?put?them
??*?any?lower?than?the?topmost?node?for?the?query?level.??Also,?see
??*?comments?for?SS_finalize_plan?before?you?try?to?change?this.)*/
?SS_attach_initplans(root,?plan);

?/*?Check?we?successfully?assigned?all?NestLoopParams?to?plan?nodes?*/
?if?(root->curOuterParams?!=?NIL)
??elog(ERROR,?"failed?to?assign?all?NestLoopParams?to?plan?nodes");

?/**?Reset?plan_params?to?ensure?param?IDs?used?for?nestloop?params?are?not?re-used?later*/
?root->plan_params?=?NIL;

?return?plan;
}

//?由最佳路徑生成最佳執(zhí)行計劃
static?ModifyTable?*create_modifytable_plan(PlannerInfo?*root,?ModifyTablePath?*best_path)
{
?ModifyTable?*plan;
?List????*subplans?=?NIL;
?ListCell???*subpaths,
??????*subroots;

?/*?Build?the?plan?for?each?input?path?*/
?forboth(subpaths,?best_path->subpaths,?subroots,?best_path->subroots)
?{
??Path????*subpath?=?(Path?*)?lfirst(subpaths);
??PlannerInfo?*subroot?=?(PlannerInfo?*)?lfirst(subroots);
??Plan????*subplan;

??/*?In?an?inherited?UPDATE/DELETE,?reference?the?per-child?modified
???*?subroot?while?creating?Plans?from?Paths?for?the?child?rel.??This?is
???*?a?kluge,?but?otherwise?it's?too?hard?to?ensure?that?Plan?creation
???*?functions?(particularly?in?FDWs)?don't?depend?on?the?contents?of
???*?"root"?matching?what?they?saw?at?Path?creation?time.??The?main
???*?downside?is?that?creation?functions?for?Plans?that?might?appear
???*?below?a?ModifyTable?cannot?expect?to?modify?the?contents?of?"root"
???*?and?have?it?"stick"?for?subsequent?processing?such?as?setrefs.c.
???*?That's?not?great,?but?it?seems?better?than?the?alternative.*/
??subplan?=?create_plan_recurse(subroot,?subpath,?CP_EXACT_TLIST);

??/*?Transfer?resname/resjunk?labeling,?too,?to?keep?executor?happy?*/
??apply_tlist_labeling(subplan->targetlist,?subroot->processed_tlist);

??subplans?=?lappend(subplans,?subplan);
?}

?plan?=?make_modifytable(root,best_path->operation,best_path->canSetTag,
??????best_path->nominalRelation,best_path->rootRelation,
??????best_path->partColsUpdated,best_path->resultRelations,
??????subplans,best_path->subroots,best_path->withCheckOptionLists,
??????best_path->returningLists,best_path->rowMarks,
??????best_path->onconflict,best_path->epqParam);

?copy_generic_path_info(&plan->plan,?&best_path->path);

?return?plan;
}

最終的執(zhí)行計劃是ModifyTable:

/*?----------------
?*??ModifyTable?node?-
?*??Apply?rows?produced?by?subplan(s)?to?result?table(s),
?*??by?inserting,?updating,?or?deleting.
?*
?*?If?the?originally?named?target?table?is?a?partitioned?table,?both
?*?nominalRelation?and?rootRelation?contain?the?RT?index?of?the?partition
?*?root,?which?is?not?otherwise?mentioned?in?the?plan.??Otherwise?rootRelation
?*?is?zero.??However,?nominalRelation?will?always?be?set,?as?it's?the?rel?that
?*?EXPLAIN?should?claim?is?the?INSERT/UPDATE/DELETE?target.
?*
?*?Note?that?rowMarks?and?epqParam?are?presumed?to?be?valid?for?all?the
?*?subplan(s);?they?can't?contain?any?info?that?varies?across?subplans.
?*?----------------*/
typedef?struct?ModifyTable
{
?Plan??plan;
?CmdType??operation;??/*?INSERT,?UPDATE,?or?DELETE?*/
?bool??canSetTag;??/*?do?we?set?the?command?tag/es_processed??*/
?Index??nominalRelation;?/*?Parent?RT?index?for?use?of?EXPLAIN?*/
?Index??rootRelation;?/*?Root?RT?index,?if?target?is?partitioned?*/
?bool??partColsUpdated;?/*?some?part?key?in?hierarchy?updated?*/
?List????*resultRelations;?/*?integer?list?of?RT?indexes?*/
?int???resultRelIndex;?/*?index?of?first?resultRel?in?plan's?list?*/
?int???rootResultRelIndex;?/*?index?of?the?partitioned?table?root?*/
?List????*plans;???/*?plan(s)?producing?source?data?*/
?List????*withCheckOptionLists;?/*?per-target-table?WCO?lists?*/
?List????*returningLists;?/*?per-target-table?RETURNING?tlists?*/
?List????*fdwPrivLists;?/*?per-target-table?FDW?private?data?lists?*/
?Bitmapset??*fdwDirectModifyPlans;?/*?indices?of?FDW?DM?plans?*/
?List????*rowMarks;??/*?PlanRowMarks?(non-locking?only)?*/
?int???epqParam;??/*?ID?of?Param?for?EvalPlanQual?re-eval?*/
?OnConflictAction?onConflictAction;?/*?ON?CONFLICT?action?*/
?List????*arbiterIndexes;?/*?List?of?ON?CONFLICT?arbiter?index?OIDs??*/
?List????*onConflictSet;?/*?SET?for?INSERT?ON?CONFLICT?DO?UPDATE?*/
?Node????*onConflictWhere;?/*?WHERE?for?ON?CONFLICT?UPDATE?*/
?Index??exclRelRTI;??/*?RTI?of?the?EXCLUDED?pseudo?relation?*/
?List????*exclRelTlist;?/*?tlist?of?the?EXCLUDED?pseudo?relation?*/
}?ModifyTable;

執(zhí)行器

根據(jù)上面的執(zhí)行計劃,去執(zhí)行。主要是各種算子的實現(xiàn),其中要理解執(zhí)行器的運行原理,主要是火山模型,一次一元組。我們看一下其調(diào)用過程。

CreatePortal("",?true,?true);
PortalDefineQuery(portal,NULL,query_string,commandTag,plantree_list,NULL);
PortalStart(portal,?NULL,?0,?InvalidSnapshot);
PortalRun(portal,FETCH_ALL,true,true,receiver,receiver,&qc);
-->?PortalRunMulti()
?-->?ProcessQuery()
??-->?ExecutorStart(queryDesc,?0);
???-->?standard_ExecutorStart()
????-->?estate?=?CreateExecutorState();?//?創(chuàng)建EState
????-->?estate->es_output_cid?=?GetCurrentCommandId(true);?//?獲得cid,后面更新的時候要用
????-->?InitPlan(queryDesc,?eflags);
?????-->?ExecInitNode(plan,?estate,?eflags);??
??????-->?ExecInitModifyTable()?//?初始化ModifyTableState
??-->?ExecutorRun(queryDesc,?ForwardScanDirection,?0L,?true);
???-->?standard_ExecutorRun()
????-->?ExecutePlan()
?????-->?ExecProcNode(planstate);?//?一次一元組?火山模型
??????-->?node->ExecProcNode(node);
???????-->?ExecProcNodeFirst(PlanState?*node)
????????-->?node->ExecProcNode(node);
?????????-->?ExecModifyTable(PlanState?*pstate)
??????????-->?ExecUpdate()
???????????-->?table_tuple_update(Relation?rel,?......)
????????????-->?rel->rd_tableam->tuple_update()
?????????????-->?heapam_tuple_update(Relation?relation,?......)
??????????????-->?heap_update(relation,?otid,?tuple,?cid,?......)

??-->?ExecutorFinish(queryDesc);
??-->?ExecutorEnd(queryDesc);
PortalDrop(portal,?false);

關(guān)鍵數(shù)據(jù)結(jié)構(gòu):

//?ModifyTableState?information
typedef?struct?ModifyTableState
{
?PlanState?ps;????/*?its?first?field?is?NodeTag?*/
?CmdType??operation;??/*?INSERT,?UPDATE,?or?DELETE?*/
?bool??canSetTag;??/*?do?we?set?the?command?tag/es_processed??*/
?bool??mt_done;??/*?are?we?done??*/
?PlanState?**mt_plans;??/*?subplans?(one?per?target?rel)?*/
?int???mt_nplans;??/*?number?of?plans?in?the?array?*/
?int???mt_whichplan;?/*?which?one?is?being?executed?(0..n-1)?*/
?TupleTableSlot?**mt_scans;?/*?input?tuple?corresponding?to?underlying
?????????*?plans?*/
?ResultRelInfo?*resultRelInfo;?/*?per-subplan?target?relations?*/
?ResultRelInfo?*rootResultRelInfo;?/*?root?target?relation?(partitioned
???????????*?table?root)?*/
?List???**mt_arowmarks;?/*?per-subplan?ExecAuxRowMark?lists?*/
?EPQState?mt_epqstate;?/*?for?evaluating?EvalPlanQual?rechecks?*/
?bool??fireBSTriggers;?/*?do?we?need?to?fire?stmt?triggers??*/

?/*?Slot?for?storing?tuples?in?the?root?partitioned?table's?rowtype?during
??*?an?UPDATE?of?a?partitioned?table.?*/
?TupleTableSlot?*mt_root_tuple_slot;

?struct?PartitionTupleRouting?*mt_partition_tuple_routing;?/*?Tuple-routing?support?info?*/

?struct?TransitionCaptureState?*mt_transition_capture;?/*?controls?transition?table?population?for?specified?operation?*/

?/*?controls?transition?table?population?for?INSERT...ON?CONFLICT?UPDATE?*/
?struct?TransitionCaptureState?*mt_oc_transition_capture;

?/*?Per?plan?map?for?tuple?conversion?from?child?to?root?*/
?TupleConversionMap?**mt_per_subplan_tupconv_maps;
}?ModifyTableState;

核心執(zhí)行算子實現(xiàn):

/*?----------------------------------------------------------------
?*????ExecModifyTable
?*
?*??Perform?table?modifications?as?required,?and?return?RETURNING?results
?*??if?needed.
?*?----------------------------------------------------------------?*/
static?TupleTableSlot?*ExecModifyTable(PlanState?*pstate)
{
?ModifyTableState?*node?=?castNode(ModifyTableState,?pstate);
?PartitionTupleRouting?*proute?=?node->mt_partition_tuple_routing;
?EState????*estate?=?node->ps.state;
?CmdType??operation?=?node->operation;
?ResultRelInfo?*saved_resultRelInfo;
?ResultRelInfo?*resultRelInfo;
?PlanState??*subplanstate;
?JunkFilter?*junkfilter;
?TupleTableSlot?*slot;
?TupleTableSlot?*planSlot;
?ItemPointer?tupleid;
?ItemPointerData?tuple_ctid;
?HeapTupleData?oldtupdata;
?HeapTuple?oldtuple;

?CHECK_FOR_INTERRUPTS();

?/*?This?should?NOT?get?called?during?EvalPlanQual;?we?should?have?passed?a
??*?subplan?tree?to?EvalPlanQual,?instead.??Use?a?runtime?test?not?just
??*?Assert?because?this?condition?is?easy?to?miss?in?testing.?*/
?if?(estate->es_epq_active?!=?NULL)
??elog(ERROR,?"ModifyTable?should?not?be?called?during?EvalPlanQual");

?/*?If?we've?already?completed?processing,?don't?try?to?do?more.??We?need
??*?this?test?because?ExecPostprocessPlan?might?call?us?an?extra?time,?and
??*?our?subplan's?nodes?aren't?necessarily?robust?against?being?called
??*?extra?times.*/
?if?(node->mt_done)
??return?NULL;

?/*?On?first?call,?fire?BEFORE?STATEMENT?triggers?before?proceeding.*/
?if?(node->fireBSTriggers)
?{
??fireBSTriggers(node);
??node->fireBSTriggers?=?false;
?}

?/*?Preload?local?variables?*/
?resultRelInfo?=?node->resultRelInfo?+?node->mt_whichplan;
?subplanstate?=?node->mt_plans[node->mt_whichplan];
?junkfilter?=?resultRelInfo->ri_junkFilter;

?/*?es_result_relation_info?must?point?to?the?currently?active?result?relation?while?we?are?within?this?ModifyTable?node.??
??*?Even?though?ModifyTable?nodes?can't?be?nested?statically,?they?can?be?nested
??*?dynamically?(since?our?subplan?could?include?a?reference?to?a?modifying
??*?CTE).??So?we?have?to?save?and?restore?the?caller's?value.*/
?saved_resultRelInfo?=?estate->es_result_relation_info;
?estate->es_result_relation_info?=?resultRelInfo;

?/*?Fetch?rows?from?subplan(s),?and?execute?the?required?table?modification?for?each?row.*/
?for?(;;)
?{
??/*?Reset?the?per-output-tuple?exprcontext.??This?is?needed?because
???*?triggers?expect?to?use?that?context?as?workspace.??It's?a?bit?ugly
???*?to?do?this?below?the?top?level?of?the?plan,?however.??We?might?need?to?rethink?this?later.*/
??ResetPerTupleExprContext(estate);

??/*?Reset?per-tuple?memory?context?used?for?processing?on?conflict?and
???*?returning?clauses,?to?free?any?expression?evaluation?storage?allocated?in?the?previous?cycle.?*/
??if?(pstate->ps_ExprContext)
???ResetExprContext(pstate->ps_ExprContext);

??planSlot?=?ExecProcNode(subplanstate);
??if?(TupIsNull(planSlot))
??{
???/*?advance?to?next?subplan?if?any?*/
???node->mt_whichplan++;?//?分區(qū)表的update,每個分區(qū)分布對應(yīng)一個subplan,當(dāng)執(zhí)行完一個分區(qū)再執(zhí)行下一個分區(qū)
???if?(node->mt_whichplan?<?node->mt_nplans)
???{
????resultRelInfo++;
????subplanstate?=?node->mt_plans[node->mt_whichplan];
????junkfilter?=?resultRelInfo->ri_junkFilter;
????estate->es_result_relation_info?=?resultRelInfo;
????EvalPlanQualSetPlan(&node->mt_epqstate,?subplanstate->plan,?node->mt_arowmarks[node->mt_whichplan]);
????/*?Prepare?to?convert?transition?tuples?from?this?child.?*/
????if?(node->mt_transition_capture?!=?NULL)?{
?????node->mt_transition_capture->tcs_map?=?tupconv_map_for_subplan(node,?node->mt_whichplan);
????}
????if?(node->mt_oc_transition_capture?!=?NULL)?{
?????node->mt_oc_transition_capture->tcs_map?=?tupconv_map_for_subplan(node,?node->mt_whichplan);
????}
????continue;
???}
???else
????break;
??}

??/*?Ensure?input?tuple?is?the?right?format?for?the?target?relation.*/
??if?(node->mt_scans[node->mt_whichplan]->tts_ops?!=?planSlot->tts_ops)?{
???ExecCopySlot(node->mt_scans[node->mt_whichplan],?planSlot);
???planSlot?=?node->mt_scans[node->mt_whichplan];
??}

??/*?If?resultRelInfo->ri_usesFdwDirectModify?is?true,?all?we?need?to?do?here?is?compute?the?RETURNING?expressions.*/
??if?(resultRelInfo->ri_usesFdwDirectModify)
??{
???Assert(resultRelInfo->ri_projectReturning);
???slot?=?ExecProcessReturning(resultRelInfo->ri_projectReturning,?RelationGetRelid(resultRelInfo->ri_RelationDesc),?NULL,?planSlot);

???estate->es_result_relation_info?=?saved_resultRelInfo;
???return?slot;
??}

??EvalPlanQualSetSlot(&node->mt_epqstate,?planSlot);
??slot?=?planSlot;

??tupleid?=?NULL;
??oldtuple?=?NULL;
??if?(junkfilter?!=?NULL)
??{
???/*?extract?the?'ctid'?or?'wholerow'?junk?attribute.*/
???if?(operation?==?CMD_UPDATE?||?operation?==?CMD_DELETE)
???{
????char??relkind;
????Datum??datum;
????bool??isNull;

????relkind?=?resultRelInfo->ri_RelationDesc->rd_rel->relkind;
????if?(relkind?==?RELKIND_RELATION?||?relkind?==?RELKIND_MATVIEW)
????{
?????datum?=?ExecGetJunkAttribute(slot,junkfilter->jf_junkAttNo,&isNull);
?????/*?shouldn't?ever?get?a?null?result...?*/
?????if?(isNull)
??????elog(ERROR,?"ctid?is?NULL");

?????tupleid?=?(ItemPointer)?DatumGetPointer(datum);
?????tuple_ctid?=?*tupleid;?/*?be?sure?we?don't?free?ctid!!?*/
?????tupleid?=?&tuple_ctid;
????}
????/*?Use?the?wholerow?attribute,?when?available,?to?reconstruct?the?old?relation?tuple.*/
????else?if?(AttributeNumberIsValid(junkfilter->jf_junkAttNo))
????{
?????datum?=?ExecGetJunkAttribute(slot,junkfilter->jf_junkAttNo,&isNull);
?????/*?shouldn't?ever?get?a?null?result...?*/
?????if?(isNull)
??????elog(ERROR,?"wholerow?is?NULL");

?????oldtupdata.t_data?=?DatumGetHeapTupleHeader(datum);
?????oldtupdata.t_len?=?HeapTupleHeaderGetDatumLength(oldtupdata.t_data);
?????ItemPointerSetInvalid(&(oldtupdata.t_self));
?????/*?Historically,?view?triggers?see?invalid?t_tableOid.?*/
?????oldtupdata.t_tableOid?=?(relkind?==?RELKIND_VIEW)???InvalidOid?:?RelationGetRelid(resultRelInfo->ri_RelationDesc);
?????oldtuple?=?&oldtupdata;
????}
????else
?????Assert(relkind?==?RELKIND_FOREIGN_TABLE);
???}

???/*?apply?the?junkfilter?if?needed.?*/
???if?(operation?!=?CMD_DELETE)
????slot?=?ExecFilterJunk(junkfilter,?slot);
??}

??switch?(operation)
??{
???case?CMD_INSERT:
????if?(proute)????/*?Prepare?for?tuple?routing?if?needed.?*/
?????slot?=?ExecPrepareTupleRouting(node,?estate,?proute,?resultRelInfo,?slot);
????slot?=?ExecInsert(node,?slot,?planSlot,?NULL,?estate->es_result_relation_info,?estate,?node->canSetTag);
????if?(proute)????/*?Revert?ExecPrepareTupleRouting's?state?change.?*/
?????estate->es_result_relation_info?=?resultRelInfo;
????break;
???case?CMD_UPDATE:
????slot?=?ExecUpdate(node,?tupleid,?oldtuple,?slot,?planSlot,
??????????&node->mt_epqstate,?estate,?node->canSetTag);
????break;
???case?CMD_DELETE:
????slot?=?ExecDelete(node,?tupleid,?oldtuple,?planSlot,
??????????&node->mt_epqstate,?estate,
??????????true,?node->canSetTag,?false?/*?changingPart?*/?,?NULL,?NULL);
????break;
???default:
????elog(ERROR,?"unknown?operation");
????break;
??}

??/*?If?we?got?a?RETURNING?result,?return?it?to?caller.??We'll?continue?the?work?on?next?call.*/
??if?(slot)?{
???estate->es_result_relation_info?=?saved_resultRelInfo;
???return?slot;
??}
?}

?estate->es_result_relation_info?=?saved_resultRelInfo;?/*?Restore?es_result_relation_info?before?exiting?*/
?fireASTriggers(node);?/*?We're?done,?but?fire?AFTER?STATEMENT?triggers?before?exiting.*/

?node->mt_done?=?true;

?return?NULL;
}

我們看一下具體執(zhí)行Update的實現(xiàn)

```c++
/*?----------------------------------------------------------------
?*??ExecUpdate
?*
?*??note:?we?can't?run?UPDATE?queries?with?transactions?off?because?UPDATEs?are?actually?INSERTs?and?our
?*??scan?will?mistakenly?loop?forever,?updating?the?tuple?it?just?inserted..??This?should?be?fixed?but?until?it
?*??is,?we?don't?want?to?get?stuck?in?an?infinite?loop?which?corrupts?your?database..
?*
?*??When?updating?a?table,?tupleid?identifies?the?tuple?to?update?and?oldtuple?is?NULL.??
?*
?*??Returns?RETURNING?result?if?any,?otherwise?NULL.
?*?----------------------------------------------------------------*/
static?TupleTableSlot?*
ExecUpdate(ModifyTableState?*mtstate,
?????ItemPointer?tupleid,
?????HeapTuple?oldtuple,
?????TupleTableSlot?*slot,
?????TupleTableSlot?*planSlot,
?????EPQState?*epqstate,
?????EState?*estate,
?????bool?canSetTag)
{
?ResultRelInfo?*resultRelInfo;
?Relation?resultRelationDesc;
?TM_Result?result;
?TM_FailureData?tmfd;
?List????*recheckIndexes?=?NIL;
?TupleConversionMap?*saved_tcs_map?=?NULL;

?/*?abort?the?operation?if?not?running?transactions*/
?if?(IsBootstrapProcessingMode())
??elog(ERROR,?"cannot?UPDATE?during?bootstrap");

?ExecMaterializeSlot(slot);

?/*?get?information?on?the?(current)?result?relation*/
?resultRelInfo?=?estate->es_result_relation_info;
?resultRelationDesc?=?resultRelInfo->ri_RelationDesc;

?/*?BEFORE?ROW?UPDATE?Triggers?*/
?if?(resultRelInfo->ri_TrigDesc?&&?resultRelInfo->ri_TrigDesc->trig_update_before_row)
?{
??if?(!ExecBRUpdateTriggers(estate,?epqstate,?resultRelInfo,?tupleid,?oldtuple,?slot))
???return?NULL;??/*?"do?nothing"?*/
?}

?/*?INSTEAD?OF?ROW?UPDATE?Triggers?*/
?if?(resultRelInfo->ri_TrigDesc?&&?resultRelInfo->ri_TrigDesc->trig_update_instead_row)
?{
??if?(!ExecIRUpdateTriggers(estate,?resultRelInfo,?oldtuple,?slot))
???return?NULL;??/*?"do?nothing"?*/
?}
?else?if?(resultRelInfo->ri_FdwRoutine)
?{
??/*?Compute?stored?generated?columns*/
??if?(resultRelationDesc->rd_att->constr?&&?resultRelationDesc->rd_att->constr->has_generated_stored)
???ExecComputeStoredGenerated(estate,?slot,?CMD_UPDATE);

??/*?update?in?foreign?table:?let?the?FDW?do?it*/
??slot?=?resultRelInfo->ri_FdwRoutine->ExecForeignUpdate(estate,?resultRelInfo,?slot,?planSlot);

??if?(slot?==?NULL)??/*?"do?nothing"?*/
???return?NULL;

??/*?AFTER?ROW?Triggers?or?RETURNING?expressions?might?reference?the
???*?tableoid?column,?so?(re-)initialize?tts_tableOid?before?evaluating?them.?*/
??slot->tts_tableOid?=?RelationGetRelid(resultRelationDesc);
?}
?else
?{
??LockTupleMode?lockmode;
??bool??partition_constraint_failed;
??bool??update_indexes;

??/*?Constraints?might?reference?the?tableoid?column,?so?(re-)initialize
???*?tts_tableOid?before?evaluating?them.*/
??slot->tts_tableOid?=?RelationGetRelid(resultRelationDesc);

??/*?Compute?stored?generated?columns*/
??if?(resultRelationDesc->rd_att->constr?&&?resultRelationDesc->rd_att->constr->has_generated_stored)
???ExecComputeStoredGenerated(estate,?slot,?CMD_UPDATE);

??/*
???*?Check?any?RLS?UPDATE?WITH?CHECK?policies
???*
???*?If?we?generate?a?new?candidate?tuple?after?EvalPlanQual?testing,?we
???*?must?loop?back?here?and?recheck?any?RLS?policies?and?constraints.
???*?(We?don't?need?to?redo?triggers,?however.??If?there?are?any?BEFORE
???*?triggers?then?trigger.c?will?have?done?table_tuple_lock?to?lock?the
???*?correct?tuple,?so?there's?no?need?to?do?them?again.)?*/
lreplace:;

??/*?ensure?slot?is?independent,?consider?e.g.?EPQ?*/
??ExecMaterializeSlot(slot);

??/*?If?partition?constraint?fails,?this?row?might?get?moved?to?another
???*?partition,?in?which?case?we?should?check?the?RLS?CHECK?policy?just
???*?before?inserting?into?the?new?partition,?rather?than?doing?it?here.
???*?This?is?because?a?trigger?on?that?partition?might?again?change?the
???*?row.??So?skip?the?WCO?checks?if?the?partition?constraint?fails.?*/
??partition_constraint_failed?=?resultRelInfo->ri_PartitionCheck?&&?!ExecPartitionCheck(resultRelInfo,?slot,?estate,?false);

??if?(!partition_constraint_failed?&&?resultRelInfo->ri_WithCheckOptions?!=?NIL)
??{
???/*?ExecWithCheckOptions()?will?skip?any?WCOs?which?are?not?of?the?kind?we?are?looking?for?at?this?point.?*/
???ExecWithCheckOptions(WCO_RLS_UPDATE_CHECK,?resultRelInfo,?slot,?estate);
??}

??/*?If?a?partition?check?failed,?try?to?move?the?row?into?the?right?partition.*/
??if?(partition_constraint_failed)
??{
???bool??tuple_deleted;
???TupleTableSlot?*ret_slot;
???TupleTableSlot?*orig_slot?=?slot;
???TupleTableSlot?*epqslot?=?NULL;
???PartitionTupleRouting?*proute?=?mtstate->mt_partition_tuple_routing;
???int???map_index;
???TupleConversionMap?*tupconv_map;

???/*?Disallow?an?INSERT?ON?CONFLICT?DO?UPDATE?that?causes?the
????*?original?row?to?migrate?to?a?different?partition.??Maybe?this
????*?can?be?implemented?some?day,?but?it?seems?a?fringe?feature?with
????*?little?redeeming?value.*/
???if?(((ModifyTable?*)?mtstate->ps.plan)->onConflictAction?==?ONCONFLICT_UPDATE)
????ereport(ERROR,
??????(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
???????errmsg("invalid?ON?UPDATE?specification"),
???????errdetail("The?result?tuple?would?appear?in?a?different?partition?than?the?original?tuple.")));

???/*?When?an?UPDATE?is?run?on?a?leaf?partition,?we?will?not?have
????*?partition?tuple?routing?set?up.?In?that?case,?fail?with
????*?partition?constraint?violation?error.*/
???if?(proute?==?NULL)
????ExecPartitionCheckEmitError(resultRelInfo,?slot,?estate);

???/*?Row?movement,?part?1.??Delete?the?tuple,?but?skip?RETURNING
????*?processing.?We?want?to?return?rows?from?INSERT.*/
???ExecDelete(mtstate,?tupleid,?oldtuple,?planSlot,?epqstate,?estate,?false,?false?/*?canSetTag?*/?,?true?/*?changingPart?*/?,?&tuple_deleted,?&epqslot);

???/*?For?some?reason?if?DELETE?didn't?happen?(e.g.?trigger?prevented
????*?it,?or?it?was?already?deleted?by?self,?or?it?was?concurrently
????*?deleted?by?another?transaction),?then?we?should?skip?the?insert
????*?as?well;?otherwise,?an?UPDATE?could?cause?an?increase?in?the
????*?total?number?of?rows?across?all?partitions,?which?is?clearly?wrong.
????*
????*?For?a?normal?UPDATE,?the?case?where?the?tuple?has?been?the
????*?subject?of?a?concurrent?UPDATE?or?DELETE?would?be?handled?by
????*?the?EvalPlanQual?machinery,?but?for?an?UPDATE?that?we've
????*?translated?into?a?DELETE?from?this?partition?and?an?INSERT?into
????*?some?other?partition,?that's?not?available,?because?CTID?chains
????*?can't?span relation?boundaries.??We?mimic?the?semantics?to?a
????*?limited?extent?by?skipping?the?INSERT?if?the?DELETE?fails?to
????*?find?a?tuple.?This?ensures?that?two?concurrent?attempts?to
????*?UPDATE?the?same?tuple?at?the?same?time?can't?turn?one?tuple
????*?into?two,?and?that?an?UPDATE?of?a?just-deleted?tuple?can't?resurrect?it.*/
???if?(!tuple_deleted)
???{
????/*
?????*?epqslot?will?be?typically?NULL.??But?when?ExecDelete()
?????*?finds?that?another?transaction?has?concurrently?updated?the
?????*?same?row,?it?re-fetches?the?row,?skips?the?delete,?and
?????*?epqslot?is?set?to?the?re-fetched?tuple?slot.?In?that?case,
?????*?we?need?to?do?all?the?checks?again.
?????*/
????if?(TupIsNull(epqslot))
?????return?NULL;
????else
????{
?????slot?=?ExecFilterJunk(resultRelInfo->ri_junkFilter,?epqslot);
?????goto?lreplace;
????}
???}

???/*?Updates?set?the?transition?capture?map?only?when?a?new?subplan
????*?is?chosen.??But?for?inserts,?it?is?set?for?each?row.?So?after
????*?INSERT,?we?need?to?revert?back?to?the?map?created?for?UPDATE;
????*?otherwise?the?next?UPDATE?will?incorrectly?use?the?one?created
????*?for?INSERT.??So?first?save?the?one?created?for?UPDATE.?*/
???if?(mtstate->mt_transition_capture)
????saved_tcs_map?=?mtstate->mt_transition_capture->tcs_map;

???/*?resultRelInfo?is?one?of?the?per-subplan?resultRelInfos.??So?we
????*?should?convert?the?tuple?into?root's?tuple?descriptor,?since
????*?ExecInsert()?starts?the?search?from?root.??The?tuple?conversion
????*?map?list?is?in?the?order?of?mtstate->resultRelInfo[],?so?to
????*?retrieve?the?one?for?this?resultRel,?we?need?to?know?the
????*?position?of?the?resultRel?in?mtstate->resultRelInfo[].?*/
???map_index?=?resultRelInfo?-?mtstate->resultRelInfo;
???Assert(map_index?>=?0?&&?map_index?<?mtstate->mt_nplans);
???tupconv_map?=?tupconv_map_for_subplan(mtstate,?map_index);
???if?(tupconv_map?!=?NULL)
????slot?=?execute_attr_map_slot(tupconv_map->attrMap,?slot,?mtstate->mt_root_tuple_slot);

???/*?Prepare?for?tuple?routing,?making?it?look?like?we're?inserting?into?the?root.?*/
???Assert(mtstate->rootResultRelInfo?!=?NULL);
???slot?=?ExecPrepareTupleRouting(mtstate,?estate,?proute,?mtstate->rootResultRelInfo,?slot);

???ret_slot?=?ExecInsert(mtstate,?slot,?planSlot,
??????????orig_slot,?resultRelInfo,
??????????estate,?canSetTag);

???/*?Revert?ExecPrepareTupleRouting's?node?change.?*/
???estate->es_result_relation_info?=?resultRelInfo;
???if?(mtstate->mt_transition_capture)
???{
????mtstate->mt_transition_capture->tcs_original_insert_tuple?=?NULL;
????mtstate->mt_transition_capture->tcs_map?=?saved_tcs_map;
???}

???return?ret_slot;
??}

??/*?Check?the?constraints?of?the?tuple.??We've?already?checked?the
???*?partition?constraint?above;?however,?we?must?still?ensure?the?tuple
???*?passes?all?other?constraints,?so?we?will?call?ExecConstraints()?and
???*?have?it?validate?all?remaining?checks.*/
??if?(resultRelationDesc->rd_att->constr)
???ExecConstraints(resultRelInfo,?slot,?estate);

??/*?replace?the?heap?tuple
???*
???*?Note:?if?es_crosscheck_snapshot?isn't?InvalidSnapshot,?we?check
???*?that?the?row?to?be?updated?is?visible?to?that?snapshot,?and?throw?a
???*?can't-serialize?error?if?not.?This?is?a?special-case?behavior
???*?needed?for?referential?integrity?updates?in?transaction-snapshot?mode?transactions.?*/
??result?=?table_tuple_update(resultRelationDesc,?tupleid,?slot,?estate->es_output_cid,
?????????estate->es_snapshot,?estate->es_crosscheck_snapshot,?true?/*?wait?for?commit?*/?,&tmfd,?&lockmode,?&update_indexes);

??switch?(result)
??{
???case?TM_SelfModified:

????/*?The?target?tuple?was?already?updated?or?deleted?by?the
?????*?current?command,?or?by?a?later?command?in?the?current
?????*?transaction.??The?former?case?is?possible?in?a?join?UPDATE
?????*?where?multiple?tuples?join?to?the?same?target?tuple.?This
?????*?is?pretty?questionable,?but?Postgres?has?always?allowed?it:
?????*?we?just?execute?the?first?update?action?and?ignore
?????*?additional?update?attempts.
?????*
?????*?The?latter?case?arises?if?the?tuple?is?modified?by?a
?????*?command?in?a?BEFORE?trigger,?or?perhaps?by?a?command?in?a
?????*?volatile?function?used?in?the?query.??In?such?situations?we
?????*?should?not?ignore?the?update,?but?it?is?equally?unsafe?to
?????*?proceed.??We?don't?want?to?discard?the?original?UPDATE
?????*?while?keeping?the?triggered?actions?based?on?it;?and?we
?????*?have?no?principled?way?to?merge?this?update?with?the
?????*?previous?ones.??So?throwing?an?error?is?the?only?safe
?????*?course.
?????*
?????*?If?a?trigger?actually?intends?this?type?of?interaction,?it
?????*?can?re-execute?the?UPDATE?(assuming?it?can?figure?out?how)
?????*?and?then?return?NULL?to?cancel?the?outer?update.*/
????if?(tmfd.cmax?!=?estate->es_output_cid)
?????ereport(ERROR,(errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION),
????????errmsg("tuple?to?be?updated?was?already?modified?by?an?operation?triggered?by?the?current?command"),
????????errhint("Consider?using?an?AFTER?trigger?instead?of?a?BEFORE?trigger?to?propagate?changes?to?other?rows.")));

????/*?Else,?already?updated?by?self;?nothing?to?do?*/
????return?NULL;

???case?TM_Ok:
????break;

???case?TM_Updated:
????{
?????TupleTableSlot?*inputslot;
?????TupleTableSlot?*epqslot;

?????if?(IsolationUsesXactSnapshot())
??????ereport(ERROR,(errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),errmsg("could?not?serialize?access?due?to?concurrent?update")));

?????/*?Already?know?that?we're?going?to?need?to?do?EPQ,?so?fetch?tuple?directly?into?the?right?slot.?*/
?????inputslot?=?EvalPlanQualSlot(epqstate,?resultRelationDesc,resultRelInfo->ri_RangeTableIndex);

?????result?=?table_tuple_lock(resultRelationDesc,?tupleid,?estate->es_snapshot,inputslot,?estate->es_output_cid,?lockmode,?LockWaitBlock,?TUPLE_LOCK_FLAG_FIND_LAST_VERSION,&tmfd);

?????switch?(result)
?????{
??????case?TM_Ok:
???????Assert(tmfd.traversed);
???????epqslot?=?EvalPlanQual(epqstate,?resultRelationDesc,?resultRelInfo->ri_RangeTableIndex,?inputslot);
???????if?(TupIsNull(epqslot))
????????/*?Tuple?not?passing?quals?anymore,?exiting...?*/
????????return?NULL;

???????slot?=?ExecFilterJunk(resultRelInfo->ri_junkFilter,?epqslot);
???????goto?lreplace;

??????case?TM_Deleted:
???????/*?tuple?already?deleted;?nothing?to?do?*/
???????return?NULL;

??????case?TM_SelfModified:

???????/*
????????*?This?can?be?reached?when?following?an?update?chain?from?a?tuple?updated?by?another?session,
????????*?reaching?a?tuple?that?was?already?updated?in?this?transaction.?If?previously?modified?by
????????*?this?command,?ignore?the?redundant?update,?otherwise?error?out.
????????*
????????*?See?also?TM_SelfModified?response?to?table_tuple_update()?above.*/
???????if?(tmfd.cmax?!=?estate->es_output_cid)
????????ereport(ERROR,(errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION),
???????????errmsg("tuple?to?be?updated?was?already?modified?by?an?operation?triggered?by?the?current?command"),errhint("Consider?using?an?AFTER?trigger?instead?of?a?BEFORE?trigger?to?propagate?changes?to?other?rows.")));
???????return?NULL;

??????default:
???????/*?see?table_tuple_lock?call?in?ExecDelete()?*/
???????elog(ERROR,?"unexpected?table_tuple_lock?status:?%u",?result);
???????return?NULL;
?????}
????}

????break;

???case?TM_Deleted:
????if?(IsolationUsesXactSnapshot())
?????ereport(ERROR,(errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),errmsg("could?not?serialize?access?due?to?concurrent?delete")));
????/*?tuple?already?deleted;?nothing?to?do?*/
????return?NULL;

???default:
????elog(ERROR,?"unrecognized?table_tuple_update?status:?%u",
??????result);
????return?NULL;
??}

??/*?insert?index?entries?for?tuple?if?necessary?*/
??if?(resultRelInfo->ri_NumIndices?>?0?&&?update_indexes)
???recheckIndexes?=?ExecInsertIndexTuples(slot,?estate,?false,?NULL,?NIL);
?}

?if?(canSetTag)
??(estate->es_processed)++;

?/*?AFTER?ROW?UPDATE?Triggers?*/
?ExecARUpdateTriggers(estate,?resultRelInfo,?tupleid,?oldtuple,?slot,recheckIndexes,mtstate->operation?==?CMD_INSERT??mtstate->mt_oc_transition_capture?:?mtstate->mt_transition_capture);

?list_free(recheckIndexes);

?/*?Check?any?WITH?CHECK?OPTION?constraints?from?parent?views.??We?are
??*?required?to?do?this?after?testing?all?constraints?and?uniqueness
??*?violations?per?the?SQL?spec,?so?we?do?it?after?actually?updating?the
??*?record?in?the?heap?and?all?indexes.
??*
??*?ExecWithCheckOptions()?will?skip?any?WCOs?which?are?not?of?the?kind?we
??*?are?looking?for?at?this?point.?*/
?if?(resultRelInfo->ri_WithCheckOptions?!=?NIL)
??ExecWithCheckOptions(WCO_VIEW_CHECK,?resultRelInfo,?slot,?estate);

?if?(resultRelInfo->ri_projectReturning)?/*?Process?RETURNING?if?present?*/
??return?ExecProcessReturning(resultRelInfo->ri_projectReturning,RelationGetRelid(resultRelationDesc),slot,?planSlot);

?return?NULL;
}

再往下就是涉及到存儲引擎的部分了,我們重點看一下其對外的接口輸入?yún)?shù)。重點是這4個參數(shù):

  • relation - table to be modified (caller must hold suitable lock) (要更新的那個表)

  • otid - TID of old tuple to be replaced (要更新的元組ID,對應(yīng)的是老的元組,更新后相當(dāng)于是插入一條新元組,老元組的tid值要更新為新的tid值)

  • slot - newly constructed tuple data to store (新元組的值)

  • cid - update command ID (used for visibility test, and stored into cmax/cmin if successful) (cid值,事務(wù)相關(guān)) 執(zhí)行器層面的更新算子是建立在存儲引擎提供的底層table_tuple_update接口之上的。是我們編寫ExecUpdate以及ExecModifyTable的基礎(chǔ)。

/*
?*?Update?a?tuple.

?*?Input?parameters:
?*?relation?-?table?to?be?modified?(caller?must?hold?suitable?lock)
?*?otid?-?TID?of?old?tuple?to?be?replaced
?*?slot?-?newly?constructed?tuple?data?to?store
?*?cid?-?update?command?ID?(used?for?visibility?test,?and?stored?into?cmax/cmin?if?successful)
?*?crosscheck?-?if?not?InvalidSnapshot,?also?check?old?tuple?against?this
?*?wait?-?true?if?should?wait?for?any?conflicting?update?to?commit/abort

?*?Output?parameters:
?*?tmfd?-?filled?in?failure?cases?(see?below)
?*?lockmode?-?filled?with?lock?mode?acquired?on?tuple
?*??update_indexes?-?in?success?cases?this?is?set?to?true?if?new?index?entries?are?required?for?this?tuple
?*
?*?Normal,?successful?return?value?is?TM_Ok,?which?means?we?did?actually?update?it.?*/
static?inline?TM_Result
table_tuple_update(Relation?rel,?ItemPointer?otid,?TupleTableSlot?*slot,?CommandId?cid,?
???????Snapshot?snapshot,?Snapshot?crosscheck,?bool?wait,?TM_FailureData?*tmfd,?LockTupleMode?*lockmode,?bool?*update_indexes)
{
?return?rel->rd_tableam->tuple_update(rel,?otid,?slot,?cid,?
???????????snapshot,?crosscheck,?wait,?tmfd,?lockmode,?update_indexes);
}

事務(wù)

這一塊主要是要理解PG中update語句并不是原地更新元組,而是插入一條新元組。因為PG實現(xiàn)MVCC與Mysql,Oracle的實現(xiàn)方式有所不同,并不是通過undo日志實現(xiàn)的,相當(dāng)于把undo日志記錄到了原有的表中,并不是單獨存放在一個地方。具體的不再細(xì)述,內(nèi)容太多了,以后再分析事務(wù)部分。

好了,內(nèi)容很多,分析源碼的時候,涉及到的知識點以及邏輯是非常多的,我們最好每次分析只抓一個主干,不然每個都分析,最后就會比較亂。就先分析到這里吧。

總結(jié)

到此這篇關(guān)于Postgres中UPDATE更新語句源碼分析的文章就介紹到這了,更多相關(guān)Postgres中UPDATE源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • postgresql實現(xiàn)對已有數(shù)據(jù)表分區(qū)處理的操作詳解

    postgresql實現(xiàn)對已有數(shù)據(jù)表分區(qū)處理的操作詳解

    這篇文章主要為大家詳細(xì)介紹了postgresql實現(xiàn)對已有數(shù)據(jù)表分區(qū)處理的操作的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • Postgresql數(shù)據(jù)庫中的json類型字段使用示例詳解

    Postgresql數(shù)據(jù)庫中的json類型字段使用示例詳解

    JSON的主要用于在服務(wù)器與web應(yīng)用之間傳輸數(shù)據(jù),這篇文章主要介紹了Postgresql數(shù)據(jù)庫中的json類型字段使用,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-02-02
  • PostgreSQL查看數(shù)據(jù)庫占用空間大小的幾種常用方法

    PostgreSQL查看數(shù)據(jù)庫占用空間大小的幾種常用方法

    在PostgreSQL中,查看數(shù)據(jù)庫及數(shù)據(jù)表當(dāng)前數(shù)據(jù)的占用量可以通過執(zhí)行特定的SQL查詢來實現(xiàn),本文給大家介紹了幾種常用的方法,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Postgresql 解決pg掉電后無法重啟的問題

    Postgresql 解決pg掉電后無法重啟的問題

    這篇文章主要介紹了Postgresql 解決pg掉電后無法重啟的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • pgsql查詢優(yōu)化之模糊查詢實例詳解

    pgsql查詢優(yōu)化之模糊查詢實例詳解

    這篇文章主要給大家介紹了關(guān)于pgsql查詢優(yōu)化之模糊查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用pgsql具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • postgreSQL 數(shù)字與字符串類型轉(zhuǎn)換操作

    postgreSQL 數(shù)字與字符串類型轉(zhuǎn)換操作

    這篇文章主要介紹了postgreSQL 數(shù)字與字符串類型轉(zhuǎn)換操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • PostgreSQL中使用數(shù)組改進性能實例代碼

    PostgreSQL中使用數(shù)組改進性能實例代碼

    這篇文章主要給大家介紹了關(guān)于PostgreSQL中使用數(shù)組改進性能的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • PostgreSQL的generate_series()函數(shù)的用法說明

    PostgreSQL的generate_series()函數(shù)的用法說明

    這篇文章主要介紹了PostgreSQL的generate_series()函數(shù)的用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL 如何獲取當(dāng)前日期時間及注意事項

    PostgreSQL 如何獲取當(dāng)前日期時間及注意事項

    這篇文章主要介紹了PostgreSQL 如何獲取當(dāng)前日期時間及注意事項,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • PostgreSQL教程(三):表的繼承和分區(qū)表詳解

    PostgreSQL教程(三):表的繼承和分區(qū)表詳解

    這篇文章主要介紹了PostgreSQL教程(三):表的繼承和分區(qū)表詳解,本文講解了多表繼承、 繼承和權(quán)限、什么是分區(qū)表、分區(qū)表實現(xiàn)、分區(qū)和約束排除等內(nèi)容,需要的朋友可以參考下
    2015-05-05

最新評論

鸡巴操逼一级黄色气| 91试看福利一分钟| 国产精品三级三级三级| 亚洲一区二区三区五区| 青青青艹视频在线观看| 五月天中文字幕内射| 91精品国产麻豆国产| 国产精品人妻一区二区三区网站| 亚洲伊人久久精品影院一美女洗澡| 无码精品一区二区三区人| 日韩美女综合中文字幕pp| 国产美女精品福利在线| 国产美女午夜福利久久| 国产福利小视频大全| 老司机你懂得福利视频| 午夜国产免费福利av| 欧美激情电影免费在线| av中文字幕在线观看第三页| 免费成人va在线观看| 黄色黄色黄片78在线| 都市激情校园春色狠狠| 欧美男人大鸡吧插女人视频| 日日夜夜狠狠干视频| www日韩a级s片av| 国产精品日韩欧美一区二区| 东京热男人的av天堂| 2020久久躁狠狠躁夜夜躁 | av网站色偷偷婷婷网男人的天堂| 午夜频道成人在线91| 少妇人妻久久久久视频黄片| 久草视频首页在线观看| 熟女少妇激情五十路| 2018最新中文字幕在线观看| 硬鸡巴动态操女人逼视频| 亚洲精品在线资源站| 一区二区三区精品日本| 国产女人被做到高潮免费视频| 欧美激情精品在线观看| 中国黄色av一级片| 亚洲最大黄 嗯色 操 啊| 亚洲自拍偷拍精品网| 国产亚洲视频在线观看| 欧美一区二区三区久久久aaa| 国产精品一区二区av国| 青青青青青操视频在线观看| 午夜国产免费福利av| 亚洲视频在线观看高清| 免费岛国喷水视频在线观看| 青青社区2国产视频| 动漫美女的小穴视频| 亚洲国产精品黑丝美女| 最新中文字幕免费视频| 中文字幕av一区在线观看| 亚洲图片偷拍自拍区| 亚洲熟女女同志女同| 美女大bxxxx内射| 中英文字幕av一区| 老司机福利精品免费视频一区二区| 在线观看国产网站资源| 女同久久精品秋霞网| 九九视频在线精品播放| 亚洲麻豆一区二区三区| 亚洲欧美自拍另类图片| 中文字幕无码日韩专区免费| 亚洲高清自偷揄拍自拍| 白嫩白嫩美女极品国产在线观看| 国产九色91在线观看精品| 人妻自拍视频中国大陆| 日本少妇人妻xxxxx18| 国产又粗又黄又硬又爽| 久久午夜夜伦痒痒想咳嗽P| 在线观看一区二区三级| www久久久久久久久久久| 国产精品国产精品一区二区| 性色av一区二区三区久久久| 国产麻豆剧果冻传媒app| 国产亚洲四十路五十路| 色av色婷婷人妻久久久精品高清| 夏目彩春在线中文字幕| 四川五十路熟女av| 国产午夜福利av导航| 国产va精品免费观看| 插小穴高清无码中文字幕| 一区二区三区另类在线| 啪啪啪18禁一区二区三区| 国产一区自拍黄视频免费观看| 国产精品视频欧美一区二区 | 青青青青操在线观看免费| 初美沙希中文字幕在线| 欧美xxx成人在线| 欧美另类重口味极品在线观看| 日本一二三区不卡无| 日本在线一区二区不卡视频| 在线免费观看视频一二区| 人妻少妇亚洲一区二区| 91九色porny蝌蚪国产成人| 亚洲精品高清自拍av| 欧美亚洲自偷自拍 在线| 中文字幕一区二 区二三区四区| 沙月文乃人妻侵犯中文字幕在线| 国产美女一区在线观看| 热99re69精品8在线播放| 337p日本大胆欧美人| 亚洲国产在线精品国偷产拍| 一区二区三区四区中文| 99精品视频在线观看婷婷| av网址国产在线观看| 国产在线拍揄自揄视频网站| av天堂加勒比在线| 天天日天天天天天天天天天天| 欧美黑人巨大性xxxxx猛交| 久久久久国产成人精品亚洲午夜| 2020久久躁狠狠躁夜夜躁| 亚洲免费在线视频网站| 91色网站免费在线观看| 自拍偷拍,中文字幕| 伊人日日日草夜夜草| 精品亚洲在线免费观看| 99国产精品窥熟女精品| 亚洲午夜电影之麻豆| 国产成人午夜精品福利| 东游记中文字幕版哪里可以看到| 91精品综合久久久久3d动漫| 欧美在线一二三视频| 北条麻妃高跟丝袜啪啪| 91免费观看在线网站| 首之国产AV医生和护士小芳| 91香蕉成人app下载| 午夜极品美女福利视频| 精品亚洲在线免费观看| 国产精品黄大片在线播放| 亚洲精品中文字幕下载| 丰满的子国产在线观看| 青草亚洲视频在线观看| 天码人妻一区二区三区在线看| 中文字幕—97超碰网| rct470中文字幕在线| 亚洲美女自偷自拍11页| 国产大鸡巴大鸡巴操小骚逼小骚逼| 2021年国产精品自拍| 日韩欧美一级aa大片| 国产实拍勾搭女技师av在线| 欧洲日韩亚洲一区二区三区| 亚洲福利精品福利精品福利| 国产一区二区久久久裸臀| 精品乱子伦一区二区三区免费播| 夜夜操,天天操,狠狠操| 2021年国产精品自拍| 人人人妻人人澡人人| caoporm超碰国产| 国产在线拍揄自揄视频网站| 黑人变态深video特大巨大| 亚洲av无码成人精品区辽| 亚洲成人三级在线播放| 天天操天天干天天插| 天天爽夜夜爽人人爽QC| 91精品综合久久久久3d动漫 | 久久美欧人妻少妇一区二区三区| 端庄人妻堕落挣扎沉沦| 亚洲精品乱码久久久久久密桃明| 亚洲福利天堂久久久久久| 在线观看的a站 最新| 男女之间激情网午夜在线| 人妻在线精品录音叫床| 成年午夜免费无码区| 国产成人精品午夜福利训2021| 亚洲卡1卡2卡三卡四老狼| 国产精品自拍在线视频| 人妻熟女在线一区二区| 女生自摸在线观看一区二区三区| 老鸭窝在线观看一区| 国产成人无码精品久久久电影 | 国产又粗又硬又猛的毛片视频| 日韩三级黄色片网站| 亚洲 中文 自拍 无码| 国产黄色片蝌蚪九色91| 亚洲中文字幕人妻一区| 午夜在线观看岛国av,com| 99久久99一区二区三区| 免费av岛国天堂网站| 97人妻人人澡爽人人精品| 成人av电影免费版| 久久这里有免费精品| 成人资源在线观看免费官网| 中文字幕人妻一区二区视频| 中文字幕人妻熟女在线电影| 成年人黄色片免费网站| 这里有精品成人国产99| 欧美另类一区二区视频| 亚洲av无女神免非久久| 顶级尤物粉嫩小尤物网站| 久久久久91精品推荐99| 色综合久久无码中文字幕波多| 啊啊好大好爽啊啊操我啊啊视频 | 亚洲国产欧美一区二区三区…| 一区二区免费高清黄色视频| 中文字幕高清免费在线人妻| 91九色porny国产蝌蚪视频| 中文字幕一区二区三区人妻大片| 我想看操逼黄色大片| 中文字幕av熟女人妻| 91精品国产91久久自产久强| 97人妻夜夜爽二区欧美极品| 日日夜夜大香蕉伊人| free性日本少妇| 1区2区3区不卡视频| 天天操天天干天天日狠狠插| 精品亚洲在线免费观看| 国产精品久久久久网| 动色av一区二区三区| 综合精品久久久久97| 日韩美女搞黄视频免费| 精品一区二区三区三区色爱| 漂亮 人妻被中出中文| 中文字幕中文字幕人妻| av无限看熟女人妻另类av| 国产成人自拍视频在线免费观看| 男女之间激情网午夜在线| 人妻熟女中文字幕aⅴ在线| 午夜精品一区二区三区4| 91精品国产91青青碰| 欧美性受xx黑人性猛交| 搞黄色在线免费观看| 亚洲色偷偷综合亚洲AV伊人| 欧美偷拍亚洲一区二区| 日本成人一区二区不卡免费在线| 国产真实乱子伦a视频| 天天日天天透天天操| 成人精品在线观看视频| 在线成人日韩av电影| 蜜桃精品久久久一区二区| 99热色原网这里只有精品| 都市激情校园春色狠狠| 亚洲1区2区3区精华液| 日本美女性生活一级片| 国产日韩av一区二区在线| 高清成人av一区三区| 人妻少妇精品久久久久久| 骚货自慰被发现爆操| 亚洲精品色在线观看视频| 国产男女视频在线播放| 精品国产午夜视频一区二区| 欧美在线一二三视频| 99热国产精品666| 天天综合天天综合天天网| 男人插女人视频网站| 精品国产亚洲av一淫| AV天堂一区二区免费试看| 精品视频一区二区三区四区五区| 3344免费偷拍视频| 亚洲人成精品久久久久久久| 中国黄色av一级片| 91试看福利一分钟| 久久久久久久久久一区二区三区| 91福利在线视频免费观看| 又黄又刺激的午夜小视频| 成年人免费看在线视频| 精品欧美一区二区vr在线观看| 亚洲区欧美区另类最新章节| 女生自摸在线观看一区二区三区 | 午夜福利资源综合激情午夜福利资| 免费成人va在线观看| 激情五月婷婷综合色啪| 中文字幕免费在线免费| 成人国产影院在线观看| 91天堂精品一区二区| 中文字幕乱码人妻电影| 日韩视频一区二区免费观看| 亚洲 欧美 自拍 偷拍 在线| 亚洲卡1卡2卡三卡四老狼| 黄色片一级美女黄色片| 天天日天天干天天要| 日韩av熟妇在线观看| 国产在线一区二区三区麻酥酥| 馒头大胆亚洲一区二区| 91‖亚洲‖国产熟女| av亚洲中文天堂字幕网| 99热99这里精品6国产| 在线观看视频 你懂的| 一区二区三区国产精选在线播放| 亚洲av在线观看尤物| 国产在线一区二区三区麻酥酥| 亚洲成人av一区在线| 国产高清精品一区二区三区| 日本高清在线不卡一区二区| 亚洲精品欧美日韩在线播放 | 欧美日本在线观看一区二区| 九一传媒制片厂视频在线免费观看 | 啊慢点鸡巴太大了啊舒服视频| 四川乱子伦视频国产vip| 风流唐伯虎电视剧在线观看| 91福利视频免费在线观看| 不卡一不卡二不卡三| 国产一区二区在线欧美| 国产亚洲欧美45p| 日本美女成人在线视频| 午夜在线观看岛国av,com| 91久久精品色伊人6882| 亚洲一级 片内射视正片| 快插进小逼里大鸡吧视频| 国产久久久精品毛片| 少妇人妻二三区视频| 亚洲卡1卡2卡三卡四老狼| 欧美亚洲国产成人免费在线 | 嫩草aⅴ一区二区三区| jiujiure精品视频在线| 最新91精品视频在线| 亚洲国产精品久久久久蜜桃| 老司机福利精品免费视频一区二区| 精品人妻每日一部精品| 偷拍自拍视频图片免费| 人妻少妇av在线观看| 亚洲欧美人精品高清| 欧美另类一区二区视频| 亚洲公开视频在线观看| 国产日韩欧美美利坚蜜臀懂色| 亚洲成人线上免费视频观看| 久久久久久国产精品| 大鸡巴操b视频在线| 人妻最新视频在线免费观看| 亚洲熟女女同志女同| 熟女视频一区,二区,三区| 男人的天堂av日韩亚洲| 午夜在线一区二区免费| 大胆亚洲av日韩av| 最新黄色av网站在线观看| 免费观看理论片完整版| 日本人妻精品久久久久久| 在线视频精品你懂的| 欧美80老妇人性视频| 国产亚洲国产av网站在线| 超碰97免费人妻麻豆| 中字幕人妻熟女人妻a62v网 | 激情五月婷婷综合色啪| 大胸性感美女羞爽操逼毛片| 欧洲国产成人精品91铁牛tv | 亚洲高清免费在线观看视频| 日韩精品中文字幕播放| 亚洲福利天堂久久久久久| 天天干天天日天天干天天操| 天天日夜夜干天天操| 欧美一区二区三区高清不卡tv| 午夜在线一区二区免费| 精品区一区二区三区四区人妻| 国产日本精品久久久久久久| 男人插女人视频网站| 亚洲国际青青操综合网站| 动漫av网站18禁| 国产精品3p和黑人大战| 免费啪啪啪在线观看视频| 91麻豆精品传媒国产黄色片| 性感美女诱惑福利视频| 亚洲Av无码国产综合色区| 亚洲人人妻一区二区三区| 亚洲国产最大av综合| 黄色片黄色片wyaa| 国产精品国产三级国产精东| 国产伦精品一区二区三区竹菊| 瑟瑟视频在线观看免费视频| av天堂中文免费在线| 国产高清女主播在线| 护士特殊服务久久久久久久| 最新欧美一二三视频| 婷婷午夜国产精品久久久| 日日夜夜大香蕉伊人| 国际av大片在线免费观看| 伊人日日日草夜夜草| 女警官打开双腿沦为性奴| 国产精品伦理片一区二区| 人妻少妇av在线观看| a v欧美一区=区三区| av手机在线观播放网站| 社区自拍揄拍尻屁你懂的| 亚洲自拍偷拍精品网| 水蜜桃一区二区三区在线观看视频| 青青青青青操视频在线观看| 午夜在线一区二区免费| 亚洲成人情色电影在线观看| 国产chinesehd精品麻豆| 2020久久躁狠狠躁夜夜躁| 欧美一区二区三区久久久aaa| 99热久久极品热亚洲| 亚洲天堂第一页中文字幕| 精品美女久久久久久| 国产精品国产三级国产精东| 色婷婷六月亚洲综合香蕉| 最新国产精品拍在线观看| 国产精品一二三不卡带免费视频 | 日韩三级黄色片网站| 亚洲最大黄了色网站| 干逼又爽又黄又免费的视频| 国产精彩对白一区二区三区| 精品久久久久久久久久中文蒉 | 久久久麻豆精亚洲av麻花| 亚洲综合色在线免费观看| 亚洲中文字字幕乱码| 男人和女人激情视频| www天堂在线久久| 日本熟妇一区二区x x| 操的小逼流水的文章| 3337p日本欧洲大胆色噜噜| 新婚人妻聚会被中出| 国产精品黄片免费在线观看| 国产麻豆精品人妻av| 黄页网视频在线免费观看| 国产在线拍揄自揄视频网站| 中文字幕1卡1区2区3区| 久草视频在线一区二区三区资源站| 顶级尤物粉嫩小尤物网站| 成人24小时免费视频| 久草视频在线看免费| 偷拍美女一区二区三区| 制服丝袜在线人妻中文字幕| 欧美日韩v中文在线| 天天干狠狠干天天操| 日本五十路熟新垣里子| 热久久只有这里有精品| 亚洲图库另类图片区| 精品一线二线三线日本| 亚洲一区二区三区精品视频在线| 日本熟妇色熟妇在线观看| 日韩二区视频一线天婷婷五| 午夜频道成人在线91| 成人高潮aa毛片免费| 亚洲自拍偷拍精品网| 亚洲国产精品免费在线观看| 日韩中文字幕福利av| 国产av自拍偷拍盛宴| 国产精彩福利精品视频| 午夜精品一区二区三区福利视频| 亚洲高清一区二区三区视频在线| 最新97国产在线视频| 97超碰最新免费在线观看| 亚洲精品一区二区三区老狼| 五十路熟女人妻一区二区9933| 中文字幕高清在线免费播放| 国产又粗又黄又硬又爽| 国产日韩一区二区在线看| 中文字幕在线欧美精品| 2025年人妻中文字幕乱码在线| 丰满熟女午夜福利视频| 天天干天天日天天谢综合156| 98视频精品在线观看| 激情啪啪啪啪一区二区三区| 欧美日本在线观看一区二区| 亚洲欧洲一区二区在线观看| 日本熟妇色熟妇在线观看| 91色秘乱一区二区三区| 中文字幕在线欧美精品| 日本一区二区三区免费小视频| 美女视频福利免费看| 成人av在线资源网站| 亚洲熟妇x久久av久久| 最新91精品视频在线| 成人蜜臀午夜久久一区| 天天日天天鲁天天操| 粉嫩av蜜乳av蜜臀| 婷婷色国产黑丝少妇勾搭AV | 75国产综合在线视频| 亚洲av男人的天堂你懂的| 蜜臀av久久久久蜜臀av麻豆| 天码人妻一区二区三区在线看 | 亚洲精品 日韩电影| 岛国av高清在线成人在线| 中文字幕 人妻精品| 黄色大片免费观看网站| 午夜在线精品偷拍一区二| 国产97在线视频观看| 日本一二三中文字幕| 国产伦精品一区二区三区竹菊| 成人网18免费视频版国产| 性感美女福利视频网站| 欧美成人综合视频一区二区| 早川濑里奈av黑人番号| 亚洲国产成人在线一区| 天天日天天操天天摸天天舔| 在线观看日韩激情视频| 亚洲在线免费h观看网站| 精品美女久久久久久| 伊人精品福利综合导航| 鸡巴操逼一级黄色气| 一区二区三区日韩久久| 日本高清成人一区二区三区| 国内资源最丰富的网站| 午夜青青草原网在线观看| 绯色av蜜臀vs少妇| 99精品亚洲av无码国产另类| 欧美一级片免费在线成人观看| 大骚逼91抽插出水视频| 国产av自拍偷拍盛宴| 中文亚洲欧美日韩无线码| 视频一区 二区 三区 综合| 欧美日本在线观看一区二区| 日本精品视频不卡一二三| 日本午夜久久女同精女女| 欧美日本国产自视大全| 亚洲欧美清纯唯美另类| 色天天天天射天天舔| 97香蕉碰碰人妻国产樱花| 青青尤物在线观看视频网站| 国产精品成人xxxx| 日本一区精品视频在线观看| 精品成人午夜免费看| 中国无遮挡白丝袜二区精品| 一个色综合男人天堂| yy6080国产在线视频| 亚洲欧美激情中文字幕| 日韩一个色综合导航| 亚洲成人三级在线播放| 在线免费观看欧美小视频| 精品一区二区三四区| 亚洲一区制服丝袜美腿| 午夜激情久久不卡一区二区| 婷婷久久一区二区字幕网址你懂得| 国产97视频在线精品| 丰满的继坶3中文在线观看| 亚洲国产第一页在线观看| 亚洲 色图 偷拍 欧美| 天天色天天爱天天爽| 97国产精品97久久| 久久久久久9999久久久久| 鸡巴操逼一级黄色气| 日本a级视频老女人| 国产精品三级三级三级| 国产美女一区在线观看| 夜夜嗨av蜜臀av| 亚洲欧美久久久久久久久| 这里有精品成人国产99| 人妻无码色噜噜狠狠狠狠色| 久草视频首页在线观看| 啊啊好大好爽啊啊操我啊啊视频| 91久久国产成人免费网站| 中文字幕一区二区人妻电影冢本| 熟女俱乐部一二三区| 国产免费高清视频视频| 亚洲伊人色一综合网| 三级等保密码要求条款| 一区二区三区久久中文字幕| 青青青青操在线观看免费| 日本丰满熟妇大屁股久久| 天天干夜夜操天天舔| 欧美日韩v中文在线| 99久久中文字幕一本人| 国产av国片精品一区二区| 国产精品久久久久网| 日韩欧美一级精品在线观看| 超碰97免费人妻麻豆| 青青青青青青青青青青草青青| 天天干天天操天天扣| 天天干天天啪天天舔| 3344免费偷拍视频| 91国语爽死我了不卡| 青青色国产视频在线| av线天堂在线观看| 一区二区在线视频中文字幕| 大陆胖女人与丈夫操b国语高清| 日本脱亚入欧是指什么| 天堂va蜜桃一区入口| 亚洲一区自拍高清免费视频| 伊人日日日草夜夜草| 天天干夜夜操啊啊啊| 动漫美女的小穴视频| 干逼又爽又黄又免费的视频| 精品国产在线手机在线| 久久丁香婷婷六月天| 久久久久久久精品老熟妇| 亚洲另类伦春色综合小| 青青青青青青青青青青草青青| 国产午夜无码福利在线看| 日本午夜爽爽爽爽爽视频在线观看 | 99亚洲美女一区二区三区| 国产污污污污网站在线| 亚洲蜜臀av一区二区三区九色| 好吊操视频这里只有精品| 成人亚洲国产综合精品| 大尺度激情四射网站| 夜女神免费福利视频| 一区国内二区日韩三区欧美| 国产va在线观看精品| 中文字幕视频一区二区在线观看| 欧美日本在线观看一区二区| 91人妻人人做人人爽在线| 亚洲男人的天堂a在线| 风流唐伯虎电视剧在线观看| 午夜激情久久不卡一区二区| 国产午夜福利av导航| 欧美日韩激情啪啪啪| 91精品国产观看免费| av在线资源中文字幕| 无码中文字幕波多野不卡| www,久久久,com| 色综合色综合色综合色| 青青草成人福利电影| 欧美久久久久久三级网| av视屏免费在线播放| 欧美精品中文字幕久久二区| 国产成人自拍视频播放 | 在线免费观看国产精品黄色| 九一传媒制片厂视频在线免费观看| 91精品视频在线观看免费| 亚洲国产精品久久久久久6| 91在线免费观看成人| 日本精品一区二区三区在线视频。 | 99久久成人日韩欧美精品| gav成人免费播放| 色哟哟在线网站入口| 区一区二区三国产中文字幕| 视频一区二区综合精品| 蜜臀av久久久久蜜臀av麻豆| 日本xx片在线观看| 久久久久久cao我的性感人妻 | 欧美一区二区三区在线资源| 国产janese在线播放| 在线观看日韩激情视频| 1000部国产精品成人观看视频| 啊啊好慢点插舔我逼啊啊啊视频| 亚洲欧美综合另类13p| 五十路熟女人妻一区二区9933| 制服丝袜在线人妻中文字幕| 爆乳骚货内射骚货内射在线| 日本啪啪啪啪啪啪啪| 91国产在线视频免费观看| 福利午夜视频在线合集| 亚洲自拍偷拍精品网| 狠狠操狠狠操免费视频| 午夜精品久久久久久99热| 亚洲最大免费在线观看| 国产午夜亚洲精品麻豆| 97人妻色免费视频| 99人妻视频免费在线| 亚洲一区二区三区在线高清| 欧洲精品第一页欧洲精品亚洲| 黑人3p华裔熟女普通话| 亚洲福利天堂久久久久久| 桃色视频在线观看一区二区| 亚洲另类在线免费观看| 中文字幕 码 在线视频| 久久久超爽一二三av| 欧美日韩人妻久久精品高清国产 | 快点插进来操我逼啊视频| 九色精品视频在线播放| 亚洲天堂精品福利成人av| 插逼视频双插洞国产操逼插洞 | 亚洲护士一区二区三区| 久久综合老鸭窝色综合久久| 插小穴高清无码中文字幕| 国产av一区2区3区| 国产乱弄免费视频观看| 97国产精品97久久| 日韩美av高清在线| 欧美亚洲牲夜夜综合久久| 黑人变态深video特大巨大| 深田咏美亚洲一区二区| 色婷婷久久久久swag精品| 97国产在线av精品| 成人区人妻精品一区二视频| 粉嫩小穴流水视频在线观看| 免费费一级特黄真人片| 人妻激情图片视频小说| 97青青青手机在线视频| 国内资源最丰富的网站| 777奇米久久精品一区| 亚洲熟妇x久久av久久| av视屏免费在线播放| 97瑟瑟超碰在线香蕉| 青青草亚洲国产精品视频| 欧美亚洲偷拍自拍色图| 欧美爆乳肉感大码在线观看| 狠狠躁夜夜躁人人爽天天天天97| 538精品在线观看视频| 男生舔女生逼逼的视频| 欧美精品资源在线观看| 成熟丰满熟妇高潮xx×xx| 91片黄在线观看喷潮| 亚洲自拍偷拍精品网| 欧美区一区二区三视频| 人妻丰满熟妇综合网| 91精品国产91青青碰| 少妇人妻二三区视频| 日日日日日日日日夜夜夜夜夜夜| 老司机欧美视频在线看| 91精品综合久久久久3d动漫| 国产a级毛久久久久精品| 亚洲图库另类图片区| 日韩美女综合中文字幕pp| 99热国产精品666| 国产又粗又硬又大视频| 91中文字幕免费在线观看| 日本三极片中文字幕| 成人在线欧美日韩国产| 免费黄高清无码国产| 国产精品成久久久久三级蜜臀av| 二区中出在线观看老师| 日韩欧美一级精品在线观看| 绯色av蜜臀vs少妇| 中文字幕乱码av资源| 可以免费看的www视频你懂的| 天天日天天干天天插舔舔| 欧美日韩一区二区电影在线观看| 国产精品精品精品999| 狠狠的往里顶撞h百合| 激情综合治理六月婷婷| 色综合久久五月色婷婷综合 | 男女之间激情网午夜在线| 亚洲狠狠婷婷综合久久app | av中文字幕网址在线| 中文字幕在线欧美精品| 欧美日韩激情啪啪啪| AV无码一区二区三区不卡| 超污视频在线观看污污污| 国产一区二区欧美三区| 2022国产综合在线干| 91亚洲精品干熟女蜜桃频道| 国产91精品拍在线观看| 夜色福利视频在线观看| 日韩美女精品视频在线观看网站 | 婷婷久久久综合中文字幕| 不卡日韩av在线观看| 黑人巨大的吊bdsm| av视屏免费在线播放| 婷婷综合亚洲爱久久| 久久久久久久久久一区二区三区| 狠狠躁狠狠爱网站视频| 亚洲久久午夜av一区二区| 成人久久精品一区二区三区| 国产熟妇人妻ⅹxxxx麻豆| 深田咏美亚洲一区二区| 少妇露脸深喉口爆吞精| 亚洲码av无色中文| 青青青青操在线观看免费| 国产乱子伦精品视频潮优女| 亚洲av无硬久久精品蜜桃| 亚洲av午夜免费观看| 久久热久久视频在线观看| 好吊视频—区二区三区| 红桃av成人在线观看| 青青擦在线视频国产在线| 这里只有精品双飞在线播放| 亚洲推理片免费看网站| 熟女人妻在线观看视频| 五十路在线观看完整版| 三级黄色亚洲成人av| 精品av久久久久久久| 91在线视频在线精品3| 亚洲1卡2卡三卡4卡在线观看| 在线观看日韩激情视频| 又色又爽又黄又刺激av网站| 午夜影院在线观看视频羞羞羞| 亚洲av男人的天堂你懂的| 亚洲福利精品视频在线免费观看| 亚洲国产40页第21页| 亚洲护士一区二区三区| 亚洲成人av一区在线| 女同性ⅹxx女同hd| 国产精品自拍在线视频| 四虎永久在线精品免费区二区| 人妻丝袜精品中文字幕| 国产精品成人xxxx| 欧美亚洲少妇福利视频| 日本性感美女写真视频| 最新91九色国产在线观看| 日本a级视频老女人| 亚洲一区二区激情在线| 巨乳人妻日下部加奈被邻居中出| 大香蕉伊人中文字幕| 姐姐的朋友2在线观看中文字幕| 天天日天天干天天爱| 亚洲av日韩av网站| 亚洲推理片免费看网站| 99的爱精品免费视频| 欧美少妇性一区二区三区| 青青草精品在线视频观看| 大香蕉大香蕉在线看| 91久久综合男人天堂| 国产夫妻视频在线观看免费| 国产精品成久久久久三级蜜臀av| 欧美日韩熟女一区二区三区| 1区2区3区4区视频在线观看| 黄工厂精品视频在线观看| 欧美3p在线观看一区二区三区| 欧美日本aⅴ免费视频| 蜜桃久久久久久久人妻| 白白操白白色在线免费视频 | 国产又色又刺激在线视频| 五十路老熟女码av| 精品久久久久久久久久久久人妻| 狠狠嗨日韩综合久久| 欧美日韩熟女一区二区三区| 88成人免费av网站| h国产小视频福利在线观看| 亚洲男人的天堂a在线| 哥哥姐姐综合激情小说| 欧美交性又色又爽又黄麻豆| 一区二区三区av高清免费| 伊人精品福利综合导航| 美女福利写真在线观看视频| 亚洲国产精品免费在线观看| 香港三日本三韩国三欧美三级| 人人妻人人爽人人澡人人精品| 最新国产亚洲精品中文在线| 亚洲一区自拍高清免费视频| 精品区一区二区三区四区人妻| 久久农村老妇乱69系列| 久久久久久久久久久免费女人| 久久亚洲天堂中文对白| 91桃色成人网络在线观看| 一二三中文乱码亚洲乱码one| 中文字幕国产专区欧美激情| 人妻少妇亚洲一区二区| 亚洲熟女综合色一区二区三区四区| 国产第一美女一区二区三区四区| 丝袜肉丝一区二区三区四区在线 | 999九九久久久精品| 3344免费偷拍视频| 国产精品手机在线看片| 国产高潮无码喷水AV片在线观看| 亚洲嫩模一区二区三区| 亚洲第一黄色在线观看| 日韩美在线观看视频黄| 欧美日韩在线精品一区二区三| 国产乱子伦精品视频潮优女| 中文字幕在线视频一区二区三区| 18禁污污污app下载| 人妻自拍视频中国大陆| 日韩欧美国产一区ab| 国语对白xxxx乱大交| 国产女人被做到高潮免费视频| 在线观看免费岛国av| 欧美80老妇人性视频| 欧美日韩熟女一区二区三区| 91免费放福利在线观看| 日韩少妇人妻精品无码专区| 一区二区三区日韩久久| 国产一线二线三线的区别在哪| 国产精品一二三不卡带免费视频| 五十路息与子猛烈交尾视频 | 无码日韩人妻精品久久| 天堂av在线播放免费| 亚洲在线一区二区欧美| 97人妻总资源视频| 成人网18免费视频版国产| 91麻豆精品秘密入口在线观看 | 肏插流水妹子在线乐播下载| 男人的天堂av日韩亚洲| tube69日本少妇| 不卡日韩av在线观看| 国产一级麻豆精品免费| 亚洲av日韩高清hd| 亚洲欧美精品综合图片小说| 亚洲 欧美 精品 激情 偷拍| 欧美区一区二区三视频| 超级福利视频在线观看| 青青青青爽手机在线| 午夜福利人人妻人人澡人人爽| 亚洲成高清a人片在线观看| 亚洲午夜高清在线观看| 亚洲人妻30pwc| 综合激情网激情五月五月婷婷| 国产一区二区火爆视频| 国产高清在线观看1区2区| www天堂在线久久| 国产又粗又黄又硬又爽| 精品高潮呻吟久久av| 日韩av中文在线免费观看| 亚洲偷自拍高清视频| 亚洲国产精品免费在线观看| 一区二区视频在线观看视频在线| 亚洲精品在线资源站| 北条麻妃高跟丝袜啪啪| 亚洲粉嫩av一区二区三区| 2020韩国午夜女主播在线| 深夜男人福利在线观看| 久久这里只有精彩视频免费| 天天日夜夜干天天操| 91中文字幕免费在线观看| 欧美视频中文一区二区三区| 2021久久免费视频| 93人妻人人揉人人澡人人| 青青草原色片网站在线观看| 天天干天天啪天天舔| 日本脱亚入欧是指什么| 蜜桃专区一区二区在线观看| 精产国品久久一二三产区区别| 成人午夜电影在线观看 久久| yy96视频在线观看| 人妻无码色噜噜狠狠狠狠色| 日本熟女50视频免费| 动色av一区二区三区| 美女福利视频导航网站| 丝袜长腿第一页在线| 在线观看国产免费麻豆| 国产卡一卡二卡三乱码手机| 班长撕开乳罩揉我胸好爽| 天天操天天弄天天射| 91超碰青青中文字幕| 大鸡吧插入女阴道黄色片| 国产性色生活片毛片春晓精品| 五色婷婷综合狠狠爱| 欧美天堂av无线av欧美| 综合激情网激情五月天| 少妇深喉口爆吞精韩国| 色婷婷久久久久swag精品| 综合色区亚洲熟妇shxstz| 亚洲人人妻一区二区三区| 好吊视频—区二区三区| 护士特殊服务久久久久久久| 亚洲精品福利网站图片| 强行扒开双腿猛烈进入免费版| 亚洲2021av天堂| 日韩成人性色生活片| 在线免费91激情四射| 97色视频在线观看| 国产欧美日韩第三页| 久草电影免费在线观看| 99的爱精品免费视频| 亚洲av色图18p| 自拍偷拍亚洲精品第2页| 天天操天天干天天日狠狠插| 国产普通话插插视频| 欧美一级视频一区二区| 久精品人妻一区二区三区 | 久久久久久久精品老熟妇| 欧洲日韩亚洲一区二区三区| 日韩人妻丝袜中文字幕| 在线免费视频 自拍| 红杏久久av人妻一区| 日本脱亚入欧是指什么| 99视频精品全部15| 亚洲欧美另类自拍偷拍色图| 亚洲最大黄 嗯色 操 啊| 丰满少妇人妻xxxxx| 人妻凌辱欧美丰满熟妇| 在线网站你懂得老司机| 中文字幕一区二区人妻电影冢本| 久草视频在线看免费| 日韩欧美国产精品91| 欧美日本国产自视大全| 中文字母永久播放1区2区3区| 日韩欧美高清免费在线| 免费大片在线观看视频网站| 一区二区三区美女毛片| 午夜久久香蕉电影网| 97a片免费在线观看| av在线免费观看亚洲天堂| eeuss鲁片一区二区三区| 大鸡巴操娇小玲珑的女孩逼| 日本人妻欲求不满中文字幕| 欧美爆乳肉感大码在线观看| 国产熟妇人妻ⅹxxxx麻豆| 日本熟妇一区二区x x| 精品av国产一区二区三区四区| 欧美黄色录像免费看的| 国产在线91观看免费观看| 激情五月婷婷免费视频| 啪啪啪啪啪啪啪免费视频| 亚洲精品久久视频婷婷| 蜜桃臀av蜜桃臀av| 99热这里只有精品中文| 亚洲中文字幕乱码区| 国内自拍第一页在线观看| 自拍偷拍,中文字幕| 久久精品视频一区二区三区四区| 超鹏97历史在线观看| 五月色婷婷综合开心网4438| 成人蜜桃美臀九一一区二区三区| 亚洲最大黄 嗯色 操 啊| 懂色av之国产精品| 91高清成人在线视频| 亚洲人妻30pwc| 性生活第二下硬不起来| av在线shipin| 国产日韩欧美美利坚蜜臀懂色| 一区二区三区国产精选在线播放| 欧美精品一区二区三区xxxx| 亚洲精品av在线观看| 久久久久久久一区二区三| 人人超碰国字幕观看97| 黄工厂精品视频在线观看| 天天摸天天干天天操科普| 无码日韩人妻精品久久| 一区二区三区 自拍偷拍| 巨乳人妻日下部加奈被邻居中出| 综合国产成人在线观看| 最近中文字幕国产在线| 一区二区三区蜜臀在线| 精品国产在线手机在线| 精品黑人巨大在线一区| 亚洲福利精品视频在线免费观看 | 美女被肏内射视频网站| 色狠狠av线不卡香蕉一区二区| 午夜国产福利在线观看| 老鸭窝日韩精品视频观看| 亚洲欧美综合在线探花| 98视频精品在线观看| 超碰公开大香蕉97| 97超碰免费在线视频| 日本后入视频在线观看| 日韩熟女av天堂系列| 亚洲人妻av毛片在线| 日韩剧情片电影在线收看| 人人爽亚洲av人人爽av| 日本韩国免费一区二区三区视频| 亚洲码av无色中文| 国产欧美精品一区二区高清| 精品一区二区三区午夜| 亚洲丝袜老师诱惑在线观看| 日韩成人综艺在线播放| 欧美中文字幕一区最新网址| 国产品国产三级国产普通话三级| 在线观看的黄色免费网站| 成年午夜影片国产片| 91高清成人在线视频| 久草福利电影在线观看| 最近中文字幕国产在线| 亚洲av日韩精品久久久久久hd| 夜夜骑夜夜操夜夜奸| 天堂女人av一区二区| 9色精品视频在线观看| 一级黄色av在线观看| 日韩无码国产精品强奸乱伦| 亚洲成人午夜电影在线观看 | 亚洲欧美国产综合777| 操日韩美女视频在线免费看| 亚洲图片偷拍自拍区| 中文字幕中文字幕 亚洲国产| 亚洲av成人网在线观看| 国产片免费观看在线观看| 最新国产亚洲精品中文在线| 伊人综合免费在线视频| 人人妻人人爽人人添夜| 人妻少妇亚洲一区二区| 国产高清女主播在线| 1024久久国产精品| 在线免费视频 自拍| 欧美一区二区三区四区性视频| 青娱乐蜜桃臀av色| 极品性荡少妇一区二区色欲| 婷婷久久一区二区字幕网址你懂得| 亚洲嫩模一区二区三区| 成人sm视频在线观看| 99热这里只有国产精品6| 天天日天天干天天插舔舔| 一区二区三区激情在线| 人人妻人人澡欧美91精品| 免费成人av中文字幕| 免费av岛国天堂网站| 国产av福利网址大全| 操人妻嗷嗷叫视频一区二区| 久碰精品少妇中文字幕av | 黄色录像鸡巴插进去| 日本人竟这样玩学生妹| 日韩加勒比东京热二区| 午夜在线观看岛国av,com| 综合色区亚洲熟妇shxstz| 在线观看av亚洲情色| 少妇露脸深喉口爆吞精| 国产男女视频在线播放| sw137 中文字幕 在线| 99久久超碰人妻国产| 国产精品视频资源在线播放 | 99热这里只有精品中文| 人妻少妇精品久久久久久| 欧美成一区二区三区四区| 免费国产性生活视频| 日韩av有码中文字幕| 五十路av熟女松本翔子| 国产美女午夜福利久久| 日韩加勒比东京热二区| 福利在线视频网址导航| 亚洲熟色妇av日韩熟色妇在线 | 玖玖一区二区在线观看| 五十路在线观看完整版| gay gay男男瑟瑟在线网站| 亚洲欧美激情中文字幕| 久久精品国产999| 国产使劲操在线播放| 东京热男人的av天堂| 狠狠操狠狠操免费视频| 亚洲欧美自拍另类图片| 亚洲国产精品中文字幕网站| 亚洲高清免费在线观看视频| 国产成人综合一区2区| 久久久超爽一二三av| 国产日本欧美亚洲精品视| 精品人妻伦一二三区久| 91she九色精品国产| 亚洲av可乐操首页| 经典国语激情内射视频| 国产日韩av一区二区在线| 国产亚洲欧美另类在线观看| 中文字幕在线观看极品视频| 亚洲激情av一区二区| 亚洲人一区二区中文字幕| 男人靠女人的逼视频| 丰满少妇人妻xxxxx| 天天射夜夜操综合网| 做爰视频毛片下载蜜桃视频1| 美味人妻2在线播放| 色综合久久无码中文字幕波多| 三上悠亚和黑人665番号| 亚洲一区二区三区在线高清| 99久久99一区二区三区| 人妻丝袜av在线播放网址| 伊人成人在线综合网| 午夜久久久久久久99| 日韩精品中文字幕在线| 欧美综合婷婷欧美综合| 成人亚洲国产综合精品| 哥哥姐姐综合激情小说| 日韩精品中文字幕在线| 三级等保密码要求条款| 日本最新一二三区不卡在线 | 91精品资源免费观看| 青青青青青免费视频| 经典亚洲伊人第一页| 日韩美女福利视频网| 日本三极片视频网站观看| 亚洲蜜臀av一区二区三区九色 | 在线可以看的视频你懂的| 久久久久久九九99精品| 99国内精品永久免费视频| 日韩午夜福利精品试看| 中文字幕 人妻精品| 做爰视频毛片下载蜜桃视频1| 青草久久视频在线观看| 婷婷色国产黑丝少妇勾搭AV| 亚洲国产精品美女在线观看| av森泽佳奈在线观看| 国产精品国产三级国产午| 欧美国产亚洲中英文字幕| 欧美精品资源在线观看| 天天插天天色天天日| 国产午夜亚洲精品不卡在线观看| 亚洲成人熟妇一区二区三区| 超碰公开大香蕉97| 国产av一区2区3区| 亚洲免费av在线视频| 99热国产精品666| 看一级特黄a大片日本片黑人| 久久机热/这里只有| 亚洲免费av在线视频| chinese国产盗摄一区二区| av天堂中文字幕最新| 天天操天天干天天日狠狠插 | 人人超碰国字幕观看97| 人妻少妇av在线观看| 中国熟女一区二区性xx| 一区二区三区av高清免费| tube69日本少妇| 80电影天堂网官网| brazzers欧熟精品系列| 亚洲综合另类精品小说| 中文字幕最新久久久| 青草亚洲视频在线观看| 午夜成午夜成年片在线观看| 亚洲熟女综合色一区二区三区四区| 欧美另类重口味极品在线观看| 亚洲国产欧美一区二区三区久久| 精品91自产拍在线观看一区| av大全在线播放免费| 动漫av网站18禁| 久精品人妻一区二区三区| 99久久超碰人妻国产| 免费观看成年人视频在线观看| 青青青青青青青在线播放视频| 天天色天天舔天天射天天爽| 亚洲女人的天堂av| 亚洲综合另类精品小说| 大胸性感美女羞爽操逼毛片| 中文字幕在线欧美精品| 免费岛国喷水视频在线观看| 美日韩在线视频免费看| 欧美精品久久久久久影院| 国产精品黄大片在线播放| 久久99久久99精品影院| 又粗又硬又猛又爽又黄的| 亚洲精品福利网站图片| 亚洲成人情色电影在线观看| 国产普通话插插视频| 91啪国自产中文字幕在线| 99精品国产aⅴ在线观看 | 美女在线观看日本亚洲一区| 少妇人妻二三区视频| 色婷婷六月亚洲综合香蕉| 天堂av在线官网中文| 高潮喷水在线视频观看| 又粗又长 明星操逼小视频| www天堂在线久久| 黄色中文字幕在线播放| 国产高潮无码喷水AV片在线观看| 亚洲激情av一区二区| 亚洲免费福利一区二区三区| 91人妻精品久久久久久久网站| 老司机在线精品福利视频| 成年午夜免费无码区| 99一区二区在线观看| 啪啪啪啪啪啪啪啪av| 日本一本午夜在线播放| 可以免费看的www视频你懂的| 国产在线自在拍91国语自产精品 | 老鸭窝日韩精品视频观看| 制服丝袜在线人妻中文字幕| 男人和女人激情视频| 福利片区一区二体验区| 丝袜美腿欧美另类 中文字幕| 日韩激情文学在线视频 | 91精品国产91久久自产久强| 亚洲免费va在线播放| 一区二区三区在线视频福利| 国内自拍第一页在线观看| 精产国品久久一二三产区区别| 一区二区久久成人网| 欧美成一区二区三区四区| 国产精品人妻一区二区三区网站 | 国产黑丝高跟鞋视频在线播放| 国产精品人妻一区二区三区网站| eeuss鲁片一区二区三区| 蜜桃视频入口久久久| 午夜在线观看岛国av,com| 91p0rny九色露脸熟女| 午夜福利资源综合激情午夜福利资 | 天天日夜夜干天天操| 中文字幕人妻熟女在线电影| av森泽佳奈在线观看| 天天操天天干天天插| 国产性色生活片毛片春晓精品| 人妻丝袜精品中文字幕| 一级a看免费观看网站| 亚洲国产在线精品国偷产拍| 老熟妇xxxhd老熟女| 另类av十亚洲av| 日韩美女搞黄视频免费| 美女日逼视频免费观看| 青青在线视频性感少妇和隔壁黑丝| 国产污污污污网站在线| 亚洲av自拍偷拍综合| 狠狠的往里顶撞h百合| 91大神福利视频网| 青青青青青青青青青国产精品视频| 亚洲精品久久视频婷婷| 18禁美女无遮挡免费| 色花堂在线av中文字幕九九| 亚洲日产av一区二区在线| 日韩加勒比东京热二区| 欧美激情电影免费在线| 亚洲另类图片蜜臀av| 可以在线观看的av中文字幕| 亚洲无线观看国产高清在线| 91色老99久久九九爱精品| 日日夜夜精品一二三| 亚洲精品欧美日韩在线播放| 干逼又爽又黄又免费的视频| 啊啊好慢点插舔我逼啊啊啊视频| 99国产精品窥熟女精品| 亚洲国产第一页在线观看| 五十路丰满人妻熟妇| 欧美老妇精品另类不卡片| aiss午夜免费视频| 亚洲综合另类精品小说| 欧美精品欧美极品欧美视频| 日本少妇高清视频xxxxx| 成人亚洲国产综合精品| 色伦色伦777国产精品| 日本男女操逼视频免费看| 青草亚洲视频在线观看| 动色av一区二区三区| 日韩av免费观看一区| av视屏免费在线播放| 99婷婷在线观看视频| 国产视频一区在线观看| 中文字幕高清免费在线人妻 | 免费一级特黄特色大片在线观看| 中文字幕综合一区二区| 国产av自拍偷拍盛宴| 蜜桃久久久久久久人妻| 黑人巨大的吊bdsm| 亚洲区欧美区另类最新章节| 93人妻人人揉人人澡人人| av手机在线免费观看日韩av| 人人妻人人人操人人人爽| 啪啪啪啪啪啪啪啪av| 免费观看理论片完整版| 日韩无码国产精品强奸乱伦| 亚洲 中文字幕在线 日韩| 欧洲黄页网免费观看| 宅男噜噜噜666国产| AV天堂一区二区免费试看| 丰满的继坶3中文在线观看| 白嫩白嫩美女极品国产在线观看| 免费一级特黄特色大片在线观看| 免费观看成年人视频在线观看| 天天操天天射天天操天天天| 国产午夜亚洲精品麻豆| 亚洲综合乱码一区二区| 久草视频中文字幕在线观看| 极品丝袜一区二区三区| 免费看美女脱光衣服的视频| 青青青青青免费视频| 一区二区三区av高清免费| 只有精品亚洲视频在线观看| 久草电影免费在线观看| 日比视频老公慢点好舒服啊| 亚洲嫩模一区二区三区| 一区二区三区另类在线| 亚洲欧美清纯唯美另类| 大鸡八强奸视频在线观看| 4个黑人操素人视频网站精品91| 国产成人精品av网站| 亚洲天堂成人在线观看视频网站| 热99re69精品8在线播放| 日本真人性生活视频免费看| 天天躁夜夜躁日日躁a麻豆| 日本午夜久久女同精女女| 欧美亚洲一二三区蜜臀| 人妻丝袜精品中文字幕| 精品欧美一区二区vr在线观看| 一本一本久久a久久精品综合不卡| 女生被男生插的视频网站| 99精品国产免费久久| 久久久久久国产精品| 男女啪啪视频免费在线观看| 在线不卡成人黄色精品| 亚洲天堂精品福利成人av| 国产精品自拍偷拍a| 亚洲成人午夜电影在线观看 | 欧美日本aⅴ免费视频| 日韩欧美亚洲熟女人妻| 97色视频在线观看| 日本精品视频不卡一二三| 亚洲卡1卡2卡三卡四老狼| 国产夫妻视频在线观看免费| 黑人解禁人妻叶爱071| 国产亚洲视频在线观看| 成人在线欧美日韩国产| 国产精品黄色的av| 亚洲av天堂在线播放| 欧美成人猛片aaaaaaa| 日韩av大胆在线观看| 亚洲第17页国产精品| 福利在线视频网址导航| 无忧传媒在线观看视频| 美女张开两腿让男人桶av| 五十路熟女人妻一区二区9933| 国产精品久久综合久久| 人人妻人人人操人人人爽| 一色桃子久久精品亚洲| 国产日韩精品电影7777| 亚洲熟妇无码一区二区三区| 福利片区一区二体验区| 欧美日韩人妻久久精品高清国产| jiuse91九色视频| 国产精品系列在线观看一区二区| 亚洲图片偷拍自拍区| 色哟哟国产精品入口| 国产乱子伦精品视频潮优女| 日本人妻精品久久久久久| 精品91高清在线观看| 欧洲日韩亚洲一区二区三区| 好吊操视频这里只有精品| 国产露脸对白在线观看| 日日摸夜夜添夜夜添毛片性色av| 亚洲成人熟妇一区二区三区 | 日本脱亚入欧是指什么| 综合页自拍视频在线播放| 女生自摸在线观看一区二区三区 | 亚洲 欧美 精品 激情 偷拍| 在线可以看的视频你懂的| 亚洲欧美激情中文字幕| 成人av免费不卡在线观看| 欧美男同性恋69视频| 亚洲日本一区二区三区| 99久久成人日韩欧美精品| 2020久久躁狠狠躁夜夜躁| 国产福利小视频大全| 亚洲欧美色一区二区| 中文字幕第三十八页久久| 18禁无翼鸟成人在线| 涩涩的视频在线观看视频| 无码国产精品一区二区高潮久久4| 9久在线视频只有精品| 伊人综合免费在线视频| 自拍偷拍日韩欧美亚洲| 亚洲综合另类精品小说| 97精品人妻一区二区三区精品| 天天干天天操天天爽天天摸| 国产精品免费不卡av| 亚洲av日韩精品久久久| 91九色porny国产蝌蚪视频| 欧美成一区二区三区四区| 中文字幕无码一区二区免费| 大鸡巴操b视频在线| 欧美日韩v中文在线| 中文字幕av男人天堂| 在线观看亚洲人成免费网址| 好吊操视频这里只有精品| 91九色porny蝌蚪国产成人| 最新欧美一二三视频 | 亚洲av琪琪男人的天堂| 2018在线福利视频| 日本少妇在线视频大香蕉在线观看| 国产精品自拍在线视频| 69精品视频一区二区在线观看| 国产福利在线视频一区| 亚洲精品无码久久久久不卡| 福利在线视频网址导航| 大香蕉大香蕉在线看| 一区二区三区的久久的蜜桃的视频| 97国产精品97久久| 日本韩国免费一区二区三区视频| 亚洲护士一区二区三区| 国产女人露脸高潮对白视频| 国产av自拍偷拍盛宴| 91高清成人在线视频| 99久久超碰人妻国产| 亚洲精品久久视频婷婷| 精品成人午夜免费看| 中国黄色av一级片| 337p日本大胆欧美人| 午夜影院在线观看视频羞羞羞| 国产精彩对白一区二区三区 | 亚洲av男人天堂久久| 女同性ⅹxx女同hd| 97精品人妻一区二区三区精品| 久青青草视频手机在线免费观看| 国产精品午夜国产小视频| 国产在线91观看免费观看| 成人av中文字幕一区| 成熟熟女国产精品一区| 亚洲在线一区二区欧美| jul—619中文字幕在线| 视频在线亚洲一区二区| 中文亚洲欧美日韩无线码| 亚洲熟女久久久36d| 在线观看免费视频网| 91超碰青青中文字幕| 99久久99久国产黄毛片| 99婷婷在线观看视频| 端庄人妻堕落挣扎沉沦| 亚洲欧美人精品高清| 日本熟女50视频免费| 99的爱精品免费视频| 蜜桃色婷婷久久久福利在线| 免费av岛国天堂网站| 亚洲高清免费在线观看视频| 天天干夜夜操啊啊啊| 天堂av狠狠操蜜桃| 国产亚洲精品品视频在线| 天干天天天色天天日天天射| 色狠狠av线不卡香蕉一区二区| 青青伊人一精品视频| 天天日天天干天天舔天天射| 国产日韩精品免费在线| av天堂资源最新版在线看| 亚洲欧美综合另类13p| 少妇人妻真实精品视频| 蜜臀成人av在线播放| 国产福利小视频免费观看| 成年人中文字幕在线观看| 97人妻总资源视频| 88成人免费av网站| av黄色成人在线观看| 性感美女高潮视频久久久| 青青草精品在线视频观看| 亚洲欧美一区二区三区电影| 中国老熟女偷拍第一页| 中文字幕在线永久免费播放| 天天想要天天操天天干| 中国熟女一区二区性xx| 日本av熟女在线视频| 100%美女蜜桃视频| 午夜场射精嗯嗯啊啊视频| 亚洲狠狠婷婷综合久久app | 天天干天天操天天爽天天摸| 精品日产卡一卡二卡国色天香| 国产麻豆剧传媒精品国产av蜜桃| 夜夜嗨av蜜臀av| 亚洲日本一区二区三区| 91人妻人人做人人爽在线| 91精品免费久久久久久| 最新91九色国产在线观看| 亚洲 清纯 国产com| 超碰公开大香蕉97| 欧美黄片精彩在线免费观看| 日本一道二三区视频久久 | 成人av免费不卡在线观看| 欧美日韩在线精品一区二区三| 天天草天天色天天干| 98视频精品在线观看| 少妇露脸深喉口爆吞精| 一色桃子人妻一区二区三区| 噜噜色噜噜噜久色超碰| 人人人妻人人澡人人| 动漫黑丝美女的鸡巴| 99久久99一区二区三区| 狠狠的往里顶撞h百合| 视频 国产 精品 熟女 | 东京干手机福利视频| 大黑人性xxxxbbbb| 亚洲综合在线观看免费| 亚洲变态另类色图天堂网| 日韩欧美国产精品91| 天天综合天天综合天天网| 亚洲精品av在线观看| 真实国模和老外性视频| 欧美va不卡视频在线观看| 午夜成午夜成年片在线观看| av黄色成人在线观看| 亚洲一级特黄特黄黄色录像片| 天天日天天舔天天射进去| 538精品在线观看视频| 熟女在线视频一区二区三区| 综合一区二区三区蜜臀| 天天干天天啪天天舔| 日韩欧美中文国产在线| 国产一线二线三线的区别在哪| 麻豆精品成人免费视频| 中文字幕乱码av资源| 国产97视频在线精品| 男生用鸡操女生视频动漫| 国产白袜脚足J棉袜在线观看| 欧美精品久久久久久影院| 亚洲综合另类精品小说| 硬鸡巴动态操女人逼视频| 欧美国品一二三产区区别| 欧美黑人性猛交xxxxⅹooo| 亚洲天堂精品久久久| 久久久久久性虐视频| 任我爽精品视频在线播放| 好吊操视频这里只有精品| 国产午夜男女爽爽爽爽爽视频| 精品人妻一二三区久久| 天天摸天天日天天操| 大陆精品一区二区三区久久| 天天日天天干天天舔天天射| 做爰视频毛片下载蜜桃视频1| 成人av亚洲一区二区| 在线观看免费av网址大全| 一个色综合男人天堂| 午夜极品美女福利视频| 只有精品亚洲视频在线观看| 大鸡吧插逼逼视频免费看| 亚洲精品欧美日韩在线播放| 精品区一区二区三区四区人妻 | 老熟妇凹凸淫老妇女av在线观看| h国产小视频福利在线观看| 色花堂在线av中文字幕九九| 国产日韩欧美美利坚蜜臀懂色| 可以免费看的www视频你懂的 | 黄色大片男人操女人逼| 天天日天天干天天要| 精品成人午夜免费看| 91精品国产高清自在线看香蕉网| 日韩在线视频观看有码在线| 成人高清在线观看视频| 亚洲色偷偷综合亚洲AV伊人| 人妻久久久精品69系列| 国产精品黄色的av| 日本脱亚入欧是指什么| 亚洲 色图 偷拍 欧美| 国产精品久久久久久久久福交| 超pen在线观看视频公开97| 美女小视频网站在线| 日本乱人一区二区三区| 日本男女操逼视频免费看| 成熟丰满熟妇高潮xx×xx| 大香蕉福利在线观看| 欧美怡红院视频在线观看| 传媒在线播放国产精品一区| 少妇ww搡性bbb91| 天天射夜夜操狠狠干| 欧美爆乳肉感大码在线观看| 亚洲熟女久久久36d| 美味人妻2在线播放| 亚洲公开视频在线观看| 国产精品视频欧美一区二区| 色97视频在线播放| 特黄老太婆aa毛毛片| 日韩中文字幕在线播放第二页| 欧美精品一区二区三区xxxx| 一级黄片久久久久久久久| 天堂av在线官网中文| 91九色porny国产在线| 动漫美女的小穴视频| 免费福利av在线一区二区三区| 欧美精品久久久久久影院| 100%美女蜜桃视频| 人妻少妇精品久久久久久| 日韩亚国产欧美三级涩爱| 97超碰最新免费在线观看| 偷拍自拍国产在线视频| 婷婷六月天中文字幕| 日本av熟女在线视频| 青青青国产片免费观看视频 | 91精品国产91青青碰| 欧美成人综合视频一区二区| 日韩中文字幕在线播放第二页 | 日曰摸日日碰夜夜爽歪歪| 任你操任你干精品在线视频| 清纯美女在线观看国产| 丝袜国产专区在线观看| 人人妻人人人操人人人爽| 18禁污污污app下载| 人妻久久久精品69系列| 欧洲日韩亚洲一区二区三区| 4个黑人操素人视频网站精品91| 中文字幕中文字幕 亚洲国产| 亚洲欧美另类自拍偷拍色图| 99久久中文字幕一本人| 真实国产乱子伦一区二区| 9l人妻人人爽人人爽| 国产精品自拍在线视频| 超污视频在线观看污污污| 唐人色亚洲av嫩草| 久久免费看少妇高潮完整版| 日本熟女50视频免费| jiuse91九色视频| 51国产偷自视频在线播放| 含骚鸡巴玩逼逼视频| 免费在线观看污污视频网站| 91国内精品自线在拍白富美| 美女福利视频网址导航| 在线观看的a站 最新| 日韩在线中文字幕色| 四川五十路熟女av| 精品国产高潮中文字幕| 啪啪啪啪啪啪啪免费视频| 日本在线不卡免费视频| 天天色天天爱天天爽| 黄色在线观看免费观看在线| 免费福利av在线一区二区三区| 亚洲精品午夜久久久久| 欧美乱妇无乱码一区二区| 成人性黑人一级av| 久久这里只有精彩视频免费| 美女吃鸡巴操逼高潮视频| 亚洲福利午夜久久久精品电影网| japanese五十路熟女熟妇| 欧美精品中文字幕久久二区| 97精品视频在线观看| 97色视频在线观看| 精品高跟鞋丝袜一区二区| 欧洲精品第一页欧洲精品亚洲| 亚洲精品午夜aaa久久| 国产之丝袜脚在线一区二区三区| 人妻少妇亚洲一区二区| 天天通天天透天天插| 在线观看av亚洲情色| 午夜福利人人妻人人澡人人爽| 午夜福利资源综合激情午夜福利资 | 国产丰满熟女成人视频| 成人国产小视频在线观看| 欧美80老妇人性视频| 青青色国产视频在线| 一色桃子久久精品亚洲| 亚洲在线一区二区欧美| 馒头大胆亚洲一区二区| 欧美精品 日韩国产| 2018最新中文字幕在线观看| 欧美天堂av无线av欧美| 40道精品招牌菜特色| 午夜精彩视频免费一区| 黄色成年网站午夜在线观看| 中英文字幕av一区| 精品日产卡一卡二卡国色天香| 国产精彩对白一区二区三区| 早川濑里奈av黑人番号| 2020久久躁狠狠躁夜夜躁| 97人妻无码AV碰碰视频| 日本在线不卡免费视频| 特级欧美插插插插插bbbbb| 国产日韩精品电影7777| 91中文字幕免费在线观看| 少妇人妻久久久久视频黄片| av日韩在线观看大全| 亚洲一级 片内射视正片| 亚洲欧美成人综合在线观看| 五月色婷婷综合开心网4438| 国产自拍在线观看成人| 国产密臀av一区二区三| japanese五十路熟女熟妇| 午夜久久久久久久精品熟女| 亚洲最大黄了色网站| 经典国语激情内射视频| 91色网站免费在线观看| 亚洲欧美综合在线探花| 亚洲码av无色中文| 中文字幕1卡1区2区3区| 天天射夜夜操综合网| 人妻丝袜榨强中文字幕| 欧美日韩熟女一区二区三区| 老师让我插进去69AV| 人人爱人人妻人人澡39| 美女大bxxxx内射| 亚洲精品成人网久久久久久小说 | 亚洲美女高潮喷浆视频| 亚洲综合一区成人在线| 中文字幕一区二区自拍| 午夜免费观看精品视频| 国产亚洲视频在线二区| 韩国三级aaaaa高清视频| 亚洲国产中文字幕啊啊啊不行了| 动漫精品视频在线观看| 亚洲av日韩av第一区二区三区| 美女吃鸡巴操逼高潮视频| 天天射,天天操,天天说| 国产又粗又猛又爽又黄的视频美国| 快插进小逼里大鸡吧视频| 91人妻精品久久久久久久网站| 日韩a级黄色小视频| 涩爱综合久久五月蜜臀| 一区二区三区四区视频在线播放| 99久久久无码国产精品性出奶水| 国产91久久精品一区二区字幕| 91精品视频在线观看免费| 久草极品美女视频在线观看| 一区二区三区毛片国产一区| 三级黄色亚洲成人av| 男生舔女生逼逼视频| 黄色中文字幕在线播放| 99精品久久久久久久91蜜桃| 2022国产综合在线干| 丝袜亚洲另类欧美变态| 天天插天天狠天天操| 亚洲成人av一区在线| 亚洲国产在线精品国偷产拍| 午夜极品美女福利视频| 超级福利视频在线观看| 国产福利小视频大全| 国产视频一区在线观看| a v欧美一区=区三区| 亚洲熟女女同志女同| 中文字幕av男人天堂| 亚洲免费成人a v| 国产日韩精品一二三区久久久| 国产真实灌醉下药美女av福利| 国产高清97在线观看视频| av日韩在线免费播放| 欧美精品 日韩国产| 老司机福利精品免费视频一区二区 | 男人操女人的逼免费视频| 欧美老妇精品另类不卡片| 国产又大又黄免费观看| 久久久制服丝袜中文字幕| 福利午夜视频在线观看| 国产性色生活片毛片春晓精品 | AV天堂一区二区免费试看| 午夜福利资源综合激情午夜福利资| 大鸡巴操娇小玲珑的女孩逼| sw137 中文字幕 在线| 欧美天堂av无线av欧美| 国产又大又黄免费观看| 久久久久久cao我的性感人妻| 激情内射在线免费观看| 2022天天干天天操| 热思思国产99re| 亚洲天堂第一页中文字幕| 日本三极片视频网站观看| 日本一区精品视频在线观看| 四川乱子伦视频国产vip| 久久免费看少妇高潮完整版| 熟女在线视频一区二区三区| 亚洲码av无色中文| av黄色成人在线观看| 免费成人av中文字幕| 99精品国产aⅴ在线观看 | 中国黄片视频一区91| 2022天天干天天操| 免费在线播放a级片| 做爰视频毛片下载蜜桃视频1| 中文字日产幕乱六区蜜桃| 日本午夜爽爽爽爽爽视频在线观看 | 亚洲免费国产在线日韩| av大全在线播放免费| 在线视频精品你懂的| 97超碰国语国产97超碰| 岳太深了紧紧的中文字幕| 超级av免费观看一区二区三区| 亚洲国产精品久久久久久6| www天堂在线久久| 欧美成人综合视频一区二区 | 999热精品视频在线| 婷婷五月亚洲综合在线| 热久久只有这里有精品| 蜜桃视频17c在线一区二区| 免费岛国喷水视频在线观看| 亚洲欧美激情中文字幕| 亚洲va国产va欧美va在线| 99久久中文字幕一本人| 免费无码人妻日韩精品一区二区 | 青青青青操在线观看免费| 日韩精品中文字幕播放| 亚洲精品在线资源站| 最新国产精品网址在线观看| 亚洲国产中文字幕啊啊啊不行了 | 午夜在线观看岛国av,com| 亚洲熟女女同志女同| 91人妻精品一区二区久久| 亚洲乱码中文字幕在线| 福利一二三在线视频观看| 成人精品视频99第一页| 黄色中文字幕在线播放| 久草电影免费在线观看| 欧美怡红院视频在线观看| 日韩一区二区电国产精品| 男人插女人视频网站| 男人靠女人的逼视频| 好吊操视频这里只有精品| 老司机深夜免费福利视频在线观看| 免费费一级特黄真人片| 人妻熟女在线一区二区| 欧美80老妇人性视频| 亚洲精品国产久久久久久| 1区2区3区4区视频在线观看| 青娱乐在线免费视频盛宴| 中文字幕成人日韩欧美| 日本午夜爽爽爽爽爽视频在线观看 | 久久亚洲天堂中文对白| 国产熟妇乱妇熟色T区| 少妇深喉口爆吞精韩国| 99精品免费观看视频| 亚洲一区二区三区久久午夜| 人妻激情图片视频小说| 免费观看国产综合视频| 日韩伦理短片在线观看| av天堂中文免费在线| 中字幕人妻熟女人妻a62v网| 国产真实乱子伦a视频| xxx日本hd高清| 亚洲av一妻不如妾| 国产亚洲欧美视频网站| 一色桃子久久精品亚洲| 性欧美日本大妈母与子| 久久久精品国产亚洲AV一| 亚洲va国产va欧美精品88| 91免费观看国产免费| 天天干天天插天天谢| 色吉吉影音天天干天天操| 久久久久久久精品老熟妇| 天天日天天爽天天干| 国产精品sm调教视频| 欧美国品一二三产区区别| 亚洲卡1卡2卡三卡四老狼| 涩爱综合久久五月蜜臀| 国产91精品拍在线观看| 亚洲成人线上免费视频观看| 日本熟妇丰满厨房55| av网址国产在线观看| 青娱乐蜜桃臀av色| 果冻传媒av一区二区三区| 亚洲av可乐操首页| 91极品大一女神正在播放| 97精品人妻一区二区三区精品| 又大又湿又爽又紧A视频| av高潮迭起在线观看| 伊人开心婷婷国产av| 熟女91pooyn熟女| 99热久久这里只有精品| 日韩av熟妇在线观看| 91九色国产porny蝌蚪| 男女之间激情网午夜在线| 欧美亚洲牲夜夜综合久久| 国产精品黄片免费在线观看| 免费男阳茎伸入女阳道视频 | 久草视频 久草视频2| 黄片色呦呦视频免费看| 含骚鸡巴玩逼逼视频| 人妻熟女在线一区二区| 午夜精品久久久久久99热 | 日本福利午夜电影在线观看| 家庭女教师中文字幕在线播放| 男人在床上插女人视频| 九色porny九色9l自拍视频| 二区中出在线观看老师| av高潮迭起在线观看| 婷婷久久一区二区字幕网址你懂得 | 无码精品一区二区三区人| 国产露脸对白在线观看| 天天日天天舔天天射进去| 日本少妇人妻xxxxxhd| 亚洲av琪琪男人的天堂| 国产成人精品亚洲男人的天堂| 在线观看免费视频色97| 国产男女视频在线播放| 色综合久久五月色婷婷综合| 深田咏美亚洲一区二区| 爆乳骚货内射骚货内射在线| 欧美怡红院视频在线观看| 亚洲精品午夜久久久久| 免费无码人妻日韩精品一区二区| 免费在线看的黄网站| 午夜影院在线观看视频羞羞羞| 精品久久久久久久久久久久人妻| 自拍偷拍一区二区三区图片| 亚洲熟色妇av日韩熟色妇在线| 国产精品黄片免费在线观看| 老司机你懂得福利视频| 巨乳人妻日下部加奈被邻居中出 | 日本在线一区二区不卡视频| 韩国三级aaaaa高清视频| 日韩亚洲高清在线观看| 人人妻人人爽人人澡人人精品| 蜜臀av久久久久久久| 午夜国产免费福利av| 91色网站免费在线观看| 大香蕉玖玖一区2区| 日本一二三中文字幕| 中文字幕高清免费在线人妻| 色婷婷综合激情五月免费观看 | 日本三极片中文字幕| 成年人黄色片免费网站| 欧美一区二区三区啪啪同性| 日本少妇在线视频大香蕉在线观看 | 天天操天天干天天插| 在线观看的a站 最新| 国产欧美精品不卡在线| 精品一区二区亚洲欧美| 天天干天天操天天插天天日| 亚洲中文精品人人免费| 一区二区三区久久中文字幕| 国产综合精品久久久久蜜臀| 98精产国品一二三产区区别| 国产熟妇乱妇熟色T区| 欧美成人猛片aaaaaaa| 国产va精品免费观看 | 国产aⅴ一线在线观看| 欧美激情电影免费在线| 91精品视频在线观看免费| 男人的天堂一区二区在线观看| 中文字幕1卡1区2区3区| av手机在线观播放网站| 91人妻精品一区二区久久| 国产va精品免费观看| 99精品视频在线观看婷婷| 涩爱综合久久五月蜜臀| 成熟丰满熟妇高潮xx×xx| 国产免费高清视频视频| 天天日天天爽天天爽| 久久一区二区三区人妻欧美| 99久久99一区二区三区| 夜色17s精品人妻熟女| 欧美viboss性丰满| 日比视频老公慢点好舒服啊| 激情小视频国产在线| 成人亚洲精品国产精品| 午夜精品亚洲精品五月色| 粗大的内捧猛烈进出爽大牛汉子| 色综合久久久久久久久中文| avjpm亚洲伊人久久| 黄色片一级美女黄色片| 久久一区二区三区人妻欧美| 久久精品亚洲成在人线a| 亚洲伊人久久精品影院一美女洗澡 | 综合一区二区三区蜜臀| 欧洲日韩亚洲一区二区三区| 亚洲熟女久久久36d| 亚洲高清国产一区二区三区| 亚洲变态另类色图天堂网| 少妇人妻久久久久视频黄片| 亚洲蜜臀av一区二区三区九色| 久久久精品欧洲亚洲av| 一区二区麻豆传媒黄片| 99热这里只有精品中文| 婷婷五月亚洲综合在线| 中文字幕一区二区亚洲一区| 四川乱子伦视频国产vip| 亚洲人妻国产精品综合| 天天干天天操天天扣| 岛国免费大片在线观看| 婷婷综合亚洲爱久久| 无码中文字幕波多野不卡| 国产一级麻豆精品免费| 日本三极片中文字幕| 中文字幕日韩精品日本| 一个人免费在线观看ww视频| 日本少妇的秘密免费视频| 粉嫩av懂色av蜜臀av| 国产熟妇人妻ⅹxxxx麻豆| 男人的网址你懂的亚洲欧洲av| 色在线观看视频免费的| 日本丰满熟妇BBXBBXHD| 国产精品久久综合久久| 岛国毛片视频免费在线观看| 把腿张开让我插进去视频| 91精品一区二区三区站长推荐| 国际av大片在线免费观看| 黄色大片男人操女人逼| 男生舔女生逼逼视频| 成人av天堂丝袜在线观看| 日韩av熟妇在线观看| 少妇ww搡性bbb91| 成人久久精品一区二区三区| 国产在线自在拍91国语自产精品 | 91国产资源在线视频| 91国内精品自线在拍白富美| 在线观看免费岛国av| 高潮喷水在线视频观看| 一区二区三区美女毛片| 97人妻色免费视频| 亚洲福利精品视频在线免费观看| 亚洲老熟妇日本老妇| 不卡一区一区三区在线| 亚洲精品高清自拍av| 色在线观看视频免费的| av在线观看网址av| 欧美3p在线观看一区二区三区| 毛茸茸的大外阴中国视频| 青青社区2国产视频| 天天操天天污天天射| 日本少妇人妻xxxxx18| 午夜精品在线视频一区| 自拍偷拍亚洲另类色图| 欧美激情电影免费在线| 亚洲中文字字幕乱码| 又黄又刺激的午夜小视频| heyzo蜜桃熟女人妻| 日本精品视频不卡一二三| 2020韩国午夜女主播在线| 国产免费高清视频视频| 66久久久久久久久久久| 综合激情网激情五月天| 北条麻妃av在线免费观看| 福利视频网久久91| 国产亚洲成人免费在线观看| 日日爽天天干夜夜操| 国产品国产三级国产普通话三级| 五十路在线观看完整版| 日本av高清免费网站| 国产亚洲视频在线观看| 天天干天天操天天玩天天射| 97超碰人人搞人人| 日韩伦理短片在线观看| 国产不卡av在线免费| 自拍偷拍日韩欧美一区二区| 欧美精品欧美极品欧美视频| 好了av中文字幕在线| 天天想要天天操天天干| 夜夜骑夜夜操夜夜奸| 中文字幕亚洲久久久| 亚洲中文字幕校园春色| 一区二区三区四区中文| 美女福利视频导航网站| 一级A一级a爰片免费免会员| 欧美日韩情色在线观看| 精品久久久久久久久久中文蒉| 欧美成人小视频在线免费看| 日韩精品中文字幕福利| 亚洲精品三级av在线免费观看| 成年女人免费播放视频| 白白操白白色在线免费视频| 沈阳熟妇28厘米大战黑人| 日韩中文字幕精品淫| 一区二区在线观看少妇| 亚洲成人黄色一区二区三区| 大鸡巴操娇小玲珑的女孩逼| 日曰摸日日碰夜夜爽歪歪| 青青青视频自偷自拍38碰| 91精品国产麻豆国产| jiuse91九色视频| 久草免费人妻视频在线| 在线观看视频污一区| 日本中文字幕一二区视频| 亚洲日产av一区二区在线| 国产av欧美精品高潮网站| 日本人妻精品久久久久久| 亚洲av自拍偷拍综合| 国产精品午夜国产小视频| 亚洲男人的天堂a在线| 精品久久久久久久久久久a√国产| 国产亚洲精品品视频在线| 色噜噜噜噜18禁止观看| 超碰中文字幕免费观看| 熟女视频一区,二区,三区| 3337p日本欧洲大胆色噜噜| 亚洲va欧美va人人爽3p| 97少妇精品在线观看| 麻豆精品成人免费视频| 特黄老太婆aa毛毛片| 亚洲一级美女啪啪啪| 精品高潮呻吟久久av| 最近中文字幕国产在线| 亚洲高清视频在线不卡| 爆乳骚货内射骚货内射在线| 大骚逼91抽插出水视频| 中文字幕之无码色多多| 久碰精品少妇中文字幕av| 五十路熟女人妻一区二区9933| 最近中文字幕国产在线| 午夜精品亚洲精品五月色| 五十路丰满人妻熟妇| 九色porny九色9l自拍视频| 人妻另类专区欧美制服| 午夜激情精品福利视频| 亚洲高清免费在线观看视频| 天堂va蜜桃一区入口| 美女骚逼日出水来了| 天天干夜夜操天天舔| 538精品在线观看视频| 美女日逼视频免费观看| 在线不卡日韩视频播放| 免费费一级特黄真人片| av网站色偷偷婷婷网男人的天堂| 综合页自拍视频在线播放| 久草视频在线免播放| 2021天天色天天干| 日本人妻欲求不满中文字幕| 国产乱弄免费视频观看| 日韩一个色综合导航| 2019av在线视频| 亚洲av自拍偷拍综合| 97黄网站在线观看| 日本丰满熟妇大屁股久久| 欧美日韩熟女一区二区三区| 久久久久五月天丁香社区| 红杏久久av人妻一区| 在线免费观看靠比视频的网站 | 免费一级黄色av网站| 国产黄色片在线收看| 国产高清在线在线视频| 国产1区,2区,3区| 五十路熟女av天堂| 国产精品一区二区av国| 国产精品视频一区在线播放| 亚洲欧美国产麻豆综合| 黑人进入丰满少妇视频| 99热这里只有国产精品6| ka0ri在线视频| 日本性感美女三级视频| 超级av免费观看一区二区三区| 51精品视频免费在线观看| 男女第一次视频在线观看| 亚洲欧美色一区二区| 精品区一区二区三区四区人妻| 一区二区三区精品日本| 超污视频在线观看污污污 | 天天操夜夜骑日日摸| 国产麻豆乱子伦午夜视频观看| 人妻熟女在线一区二区| 看一级特黄a大片日本片黑人| 在线免费观看黄页视频| lutube在线成人免费看| 天天干天天操天天摸天天射| 无码精品一区二区三区人| 日韩三级黄色片网站| 天天插天天狠天天操| 欧美80老妇人性视频| 亚洲欧美另类手机在线| 日本高清在线不卡一区二区| 一区二区视频视频视频| 国产亚州色婷婷久久99精品| 国产高清在线观看1区2区| 亚洲一区二区三区偷拍女厕91| 女生自摸在线观看一区二区三区 | 91综合久久亚洲综合| 欧美一区二区三区激情啪啪啪| 超碰97人人澡人人| 激情啪啪啪啪一区二区三区| 成年女人免费播放视频| 在线视频这里只有精品自拍| 日本精品视频不卡一二三| 99精品视频在线观看免费播放| 精品老妇女久久9g国产| 哥哥姐姐综合激情小说| 馒头大胆亚洲一区二区| 天天操天天弄天天射| 日本一二三中文字幕| 欧美日韩熟女一区二区三区| 日本韩国免费福利精品| 男生舔女生逼逼视频| 伊人成人综合开心网| 中文字幕 人妻精品| 欧美3p在线观看一区二区三区| 国产刺激激情美女网站| 国产成人精品亚洲男人的天堂| 美女视频福利免费看| 天天插天天狠天天操| 亚洲另类图片蜜臀av| 日韩伦理短片在线观看| 亚洲va国产va欧美精品88| 99久久超碰人妻国产| 在线观看av2025| 少妇人妻二三区视频| 3344免费偷拍视频| 二区中出在线观看老师| 91中文字幕最新合集| 国产精品国产精品一区二区| 男人在床上插女人视频| 色哟哟国产精品入口| 欧美视频不卡一区四区| 黑人借宿ntr人妻的沦陷2| 中英文字幕av一区| 美味人妻2在线播放| 中文字幕在线观看国产片| av网址在线播放大全| 57pao国产一区二区| AV无码一区二区三区不卡| 天天干狠狠干天天操| 嫩草aⅴ一区二区三区| 熟女少妇激情五十路| 国产亚洲欧美另类在线观看| 国产高清在线在线视频| 亚洲天堂成人在线观看视频网站| av在线shipin| 鸡巴操逼一级黄色气| 亚洲激情,偷拍视频| 九九视频在线精品播放| 亚洲精品精品国产综合| 免费成人va在线观看| 蜜臀av久久久久久久| 在线观看一区二区三级| 9久在线视频只有精品| 粉嫩av蜜乳av蜜臀| 婷婷久久久综合中文字幕| 免费在线看的黄网站| brazzers欧熟精品系列| 久久尻中国美女视频| 免费黄高清无码国产| 精品亚洲在线免费观看| 国产极品美女久久久久久| 少妇被强干到高潮视频在线观看| 超碰97人人澡人人| 精品国产高潮中文字幕| 人人妻人人澡欧美91精品| 激情五月婷婷免费视频| 欧美精品 日韩国产| 日韩少妇人妻精品无码专区| 日韩成人免费电影二区| 国产精彩对白一区二区三区| 免费黄页网站4188| 亚洲一级av无码一级久久精品| 精内国产乱码久久久久久| 在线免费观看欧美小视频| 女生被男生插的视频网站| 成年美女黄网站18禁久久| 日本一本午夜在线播放| 国产又粗又黄又硬又爽| 天天做天天干天天操天天射| 中文字幕奴隷色的舞台50| 亚洲图片偷拍自拍区| 揄拍成人国产精品免费看视频| 性感美女诱惑福利视频| 亚洲精品 欧美日韩| 亚洲va国产va欧美va在线| 婷婷色国产黑丝少妇勾搭AV| 亚洲国产成人在线一区| 美女福利视频导航网站| 97资源人妻免费在线视频| 欧美激情精品在线观看| 国产在线拍揄自揄视频网站| brazzers欧熟精品系列| 欧美成人黄片一区二区三区| 亚洲老熟妇日本老妇| 中出中文字幕在线观看| 欧美交性又色又爽又黄麻豆| 日韩美av高清在线| 亚洲免费av在线视频| 国产精品女邻居小骚货| 爱爱免费在线观看视频| 国产精彩福利精品视频| 美女av色播在线播放| 久草电影免费在线观看| av手机在线免费观看日韩av| 国产亚洲欧美45p| 色综合天天综合网国产成人| 55夜色66夜色国产精品站| 中文字幕av男人天堂| 亚洲美女高潮喷浆视频| 亚洲精品三级av在线免费观看| 男人天堂色男人av| 日本女大学生的黄色小视频| 性欧美激情久久久久久久| 国产视频一区二区午夜| 午夜频道成人在线91| 视频一区二区在线免费播放| 国产又色又刺激在线视频| 偷拍自拍亚洲美腿丝袜| 婷婷综合亚洲爱久久| 一级黄色av在线观看| 日韩av有码一区二区三区4| 免费在线福利小视频| 首之国产AV医生和护士小芳| 人妻熟女中文字幕aⅴ在线| 91国产在线免费播放| 色伦色伦777国产精品| 亚洲成人激情av在线| 成人18禁网站在线播放| 超碰97免费人妻麻豆| 国产亚洲四十路五十路| 啊啊啊想要被插进去视频| 午夜精品九一唐人麻豆嫩草成人| 婷婷午夜国产精品久久久| 精品日产卡一卡二卡国色天香 | 青青青艹视频在线观看| 香蕉91一区二区三区| 国产麻豆精品人妻av| 亚洲中文字字幕乱码| 亚洲国产精品黑丝美女| 欧美老鸡巴日小嫩逼| 亚洲欧美在线视频第一页| 亚洲精品午夜久久久久| 国产高清在线观看1区2区| 在线观看av2025| 久久久久久久亚洲午夜综合福利| 姐姐的朋友2在线观看中文字幕| 偷拍自拍国产在线视频| 国产中文精品在线观看| 亚洲一区二区三区av网站| 老司机免费视频网站在线看| 98视频精品在线观看| 高潮喷水在线视频观看| 经典国语激情内射视频| 无码精品一区二区三区人| 青青青青青青青青青国产精品视频| 4个黑人操素人视频网站精品91| 亚洲精品国产久久久久久| 天天日天天干天天要| 亚洲美女自偷自拍11页| 神马午夜在线观看视频| 少妇人妻100系列| 亚洲国产欧美一区二区三区久久| 日韩美av高清在线| 久久热久久视频在线观看| 97精品视频在线观看| 欧美日韩高清午夜蜜桃大香蕉| 亚洲精品国产综合久久久久久久久 | 亚洲2021av天堂| 亚洲欧洲一区二区在线观看| 丝袜国产专区在线观看| 亚洲中文字幕人妻一区| 欧美第一页在线免费观看视频| 自拍 日韩 欧美激情| 精品国产成人亚洲午夜| 91精品免费久久久久久| 女同互舔一区二区三区| 欧美日韩人妻久久精品高清国产| 国产午夜亚洲精品麻豆| 3337p日本欧洲大胆色噜噜| 人人妻人人澡人人爽人人dvl| 久久久久久九九99精品| 100%美女蜜桃视频| 特级欧美插插插插插bbbbb| 亚洲av香蕉一区区二区三区犇| 欧美日韩情色在线观看| 日本午夜福利免费视频| weyvv5国产成人精品的视频| 一级黄片大鸡巴插入美女| 99精品免费久久久久久久久a| 天天通天天透天天插| 不卡一不卡二不卡三| 摧残蹂躏av一二三区| sw137 中文字幕 在线| 不卡一区一区三区在线| 欧洲日韩亚洲一区二区三区| 99热久久极品热亚洲| 欧美精品中文字幕久久二区| 亚洲av男人天堂久久| 亚洲天堂成人在线观看视频网站| 中文字幕最新久久久| 久久精品36亚洲精品束缚| 国产成人午夜精品福利| 中国把吊插入阴蒂的视频| 欧美国品一二三产区区别| 天天操夜夜骑日日摸| 免费大片在线观看视频网站| 国产性生活中老年人视频网站| 偷拍3456eee| 国产精品视频一区在线播放| chinese国产盗摄一区二区| 国产黄色片在线收看| 亚洲成人情色电影在线观看| 2022国产精品视频| 人人爱人人妻人人澡39| 人妻凌辱欧美丰满熟妇| 99婷婷在线观看视频| 精品国产午夜视频一区二区| 亚洲欧美色一区二区| 天天操天天射天天操天天天| 日韩精品中文字幕播放| 国产亚洲视频在线观看| 少妇一区二区三区久久久| 一区二区三区四区中文| 国产精品精品精品999| 午夜免费体验区在线观看| aaa久久久久久久久| 国产精品黄片免费在线观看| 日本一区精品视频在线观看| 日本精品美女在线观看| 初美沙希中文字幕在线| 日本一本午夜在线播放| 亚洲av日韩av网站| 欧美在线精品一区二区三区视频| 精产国品久久一二三产区区别 | 任你操任你干精品在线视频| 直接观看免费黄网站| 超污视频在线观看污污污| 日本高清撒尿pissing| 午夜大尺度无码福利视频| 夏目彩春在线中文字幕| 中文字幕欧美日韩射射一| 亚洲精品高清自拍av| 日本高清撒尿pissing| 粉嫩av懂色av蜜臀av| 大鸡吧插入女阴道黄色片| 亚洲熟女久久久36d| 快点插进来操我逼啊视频| 88成人免费av网站| 在线播放 日韩 av| 国产91久久精品一区二区字幕| 亚洲精品久久视频婷婷| 日本熟妇一区二区x x| 男人和女人激情视频| 热久久只有这里有精品| 亚洲欧美激情国产综合久久久| 亚洲 人妻 激情 中文| 国产大学生援交正在播放| 欧美男人大鸡吧插女人视频| 青青草人人妻人人妻| 五十路熟女人妻一区二| 国产妇女自拍区在线观看| 动漫黑丝美女的鸡巴| 成人av天堂丝袜在线观看| 国产黄色a级三级三级三级| 欧美日韩高清午夜蜜桃大香蕉| 国产欧美日韩第三页| 精品一区二区亚洲欧美| 在线观看av亚洲情色| 欧美激情精品在线观看| 亚洲精品精品国产综合| 99热这里只有国产精品6| 2022国产精品视频|