日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

oracle中orand使用,Postgres兼容Oracle研究——orafce调研

發布時間:2025/3/15 编程问答 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 oracle中orand使用,Postgres兼容Oracle研究——orafce调研 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、背景

PostgreSQL是和Oracle最接近的企業數據庫,包括數據類型,功能,架構和語法等幾個方面。甚至大多數的日常應用的性能也不會輸給Oracle。

但是Oracle有些函數或者包,默認PostgreSQL是沒有的,需要安裝orafce包來實現這些兼容性。

orafce是PostgreSQL的一個extension,主要是為PostgreSQL提供Oracle的部分語法、函數、字典表等兼容。

二、安裝orafce

版本:orafce 3.7 + PostgreSQL 10.5

注意,目前GitHub的主線版本是3.7版本,未發布。

編譯安裝:

解壓后進入源碼目錄執行 make & make install

進入postgresql執行 create extension orafce

【注意事項】

下載的源碼中,orafce--3.7.sql文件中下面這段sql,需要將 'BASE_TABLE' 改成 'BASE TABLE' 再編譯安裝

create view oracle.user_tables as

select table_name

from information_schema.tables

where table_type = 'BASE_TABLE';

三、orafce包含的內容

類型 date, varchar2 and nvarchar2

函數 concat, nvl, nvl2, lnnvl, decode, bitand, nanvl, sinh, cosh, tanh and oracle.substr

dual 表

package :

dbms_alert

dbms_assert

dbms_output

dbms_pipe

dbms_random

dbms_utility

plunit

plvchr

plvdate

plvlex

plvstr

plvsubst

utl_file

##Oracle兼容 包列表:

##在PostgreSQL里用 schema+函數 來實現。

atlas=# \dn

List of schemas

Name | Owner

--------------+--------

dbms_alert | appusr

dbms_assert | appusr

dbms_output | appusr

dbms_pipe | appusr

dbms_random | appusr

dbms_utility | appusr

oracle | appusr

plunit | appusr

plvchr | appusr

plvdate | appusr

plvlex | appusr

plvstr | appusr

plvsubst | appusr

public | appusr

utl_file | appusr

(15 rows)

## 查看包

例如dbms_output包:

atlas=# \df dbms_output.*

List of functions

Schema | Name | Result data type | Argument data types | Type

-------------+--------------+------------------+------------------------------------------+--------

dbms_output | disable | void | | normal

dbms_output | enable | void | | normal

dbms_output | enable | void | buffer_size integer | normal

dbms_output | get_line | record | OUT line text, OUT status integer | normal

dbms_output | get_lines | record | OUT lines text[], INOUT numlines integer | normal

dbms_output | new_line | void | | normal

dbms_output | put | void | a text | normal

dbms_output | put_line | void | a text | normal

dbms_output | serveroutput | void | boolean | normal

(9 rows)

##Oracle兼容 公共函數 列表:

atlas=# \df

List of functions

Schema | Name | Result data type | Argument data types | Type

--------+---------------------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------

public | bitand | bigint | bigint, bigint | normal

public | cosh | double precision | double precision | normal

public | decode | bigint | anyelement, anyelement, bigint | normal

public | decode | bigint | anyelement, anyelement, bigint, anyelement, bigint | normal

public | decode | bigint | anyelement, anyelement, bigint, anyelement, bigint, anyelement, bigint | normal

public | decode | bigint | anyelement, anyelement, bigint, anyelement, bigint, anyelement, bigint, bigint | normal

public | decode | bigint | anyelement, anyelement, bigint, anyelement, bigint, bigint | normal

public | decode | bigint | anyelement, anyelement, bigint, bigint | normal

public | decode | character | anyelement, anyelement, character | normal

public | decode | character | anyelement, anyelement, character, anyelement, character | normal

public | decode | character | anyelement, anyelement, character, anyelement, character, anyelement, character | normal

public | decode | character | anyelement, anyelement, character, anyelement, character, anyelement, character, character | normal

public | decode | character | anyelement, anyelement, character, anyelement, character, character | normal

public | decode | character | anyelement, anyelement, character, character | normal

public | decode | date | anyelement, anyelement, date | normal

public | decode | date | anyelement, anyelement, date, anyelement, date | normal

public | decode | date | anyelement, anyelement, date, anyelement, date, anyelement, date | normal

public | decode | date | anyelement, anyelement, date, anyelement, date, anyelement, date, date | normal

public | decode | date | anyelement, anyelement, date, anyelement, date, date | normal

public | decode | date | anyelement, anyelement, date, date | normal

public | decode | integer | anyelement, anyelement, integer | normal

public | decode | integer | anyelement, anyelement, integer, anyelement, integer | normal

public | decode | integer | anyelement, anyelement, integer, anyelement, integer, anyelement, integer | normal

public | decode | integer | anyelement, anyelement, integer, anyelement, integer, anyelement, integer, integer | normal

public | decode | integer | anyelement, anyelement, integer, anyelement, integer, integer | normal

public | decode | integer | anyelement, anyelement, integer, integer | normal

public | decode | numeric | anyelement, anyelement, numeric | normal

public | decode | numeric | anyelement, anyelement, numeric, anyelement, numeric | normal

public | decode | numeric | anyelement, anyelement, numeric, anyelement, numeric, anyelement, numeric | normal

public | decode | numeric | anyelement, anyelement, numeric, anyelement, numeric, anyelement, numeric, numeric | normal

public | decode | numeric | anyelement, anyelement, numeric, anyelement, numeric, numeric | normal

public | decode | numeric | anyelement, anyelement, numeric, numeric | normal

public | decode | text | anyelement, anyelement, text | normal

public | decode | text | anyelement, anyelement, text, anyelement, text | normal

public | decode | text | anyelement, anyelement, text, anyelement, text, anyelement, text | normal

public | decode | text | anyelement, anyelement, text, anyelement, text, anyelement, text, text | normal

public | decode | text | anyelement, anyelement, text, anyelement, text, text | normal

public | decode | text | anyelement, anyelement, text, text | normal

public | decode | timestamp without time zone | anyelement, anyelement, timestamp without time zone | normal

public | decode | timestamp without time zone | anyelement, anyelement, timestamp without time zone, anyelement, timestamp without time zone | normal

public | decode | timestamp without time zone | anyelement, anyelement, timestamp without time zone, anyelement, timestamp without time zone, anyelement, timestamp without time zone | normal

public | decode | timestamp without time zone | anyelement, anyelement, timestamp without time zone, anyelement, timestamp without time zone, anyelement, timestamp without time zone, timestamp without time zone | normal

public | decode | timestamp without time zone | anyelement, anyelement, timestamp without time zone, anyelement, timestamp without time zone, timestamp without time zone | normal

public | decode | timestamp without time zone | anyelement, anyelement, timestamp without time zone, timestamp without time zone | normal

public | decode | timestamp with time zone | anyelement, anyelement, timestamp with time zone | normal

public | decode | timestamp with time zone | anyelement, anyelement, timestamp with time zone, anyelement, timestamp with time zone | normal

public | decode | timestamp with time zone | anyelement, anyelement, timestamp with time zone, anyelement, timestamp with time zone, anyelement, timestamp with time zone | normal

public | decode | timestamp with time zone | anyelement, anyelement, timestamp with time zone, anyelement, timestamp with time zone, anyelement, timestamp with time zone, timestamp with time zone | normal

public | decode | timestamp with time zone | anyelement, anyelement, timestamp with time zone, anyelement, timestamp with time zone, timestamp with time zone | normal

public | decode | timestamp with time zone | anyelement, anyelement, timestamp with time zone, timestamp with time zone | normal

public | decode | time without time zone | anyelement, anyelement, time without time zone | normal

public | decode | time without time zone | anyelement, anyelement, time without time zone, anyelement, time without time zone | normal

public | decode | time without time zone | anyelement, anyelement, time without time zone, anyelement, time without time zone, anyelement, time without time zone | normal

public | decode | time without time zone | anyelement, anyelement, time without time zone, anyelement, time without time zone, anyelement, time without time zone, time without time zone | normal

public | decode | time without time zone | anyelement, anyelement, time without time zone, anyelement, time without time zone, time without time zone | normal

public | decode | time without time zone | anyelement, anyelement, time without time zone, time without time zone | normal

public | dump | character varying | "any" | normal

public | dump | character varying | "any", integer | normal

public | dump | character varying | text | normal

public | dump | character varying | text, integer | normal

public | nanvl | double precision | double precision, character varying | normal

public | nanvl | double precision | double precision, double precision | normal

public | nanvl | numeric | numeric, character varying | normal

public | nanvl | numeric | numeric, numeric | normal

public | nanvl | real | real, character varying | normal

public | nanvl | real | real, real | normal

public | nvarchar2 | nvarchar2 | nvarchar2, integer, boolean | normal

public | nvarchar2_transform | internal | internal | normal

public | nvarchar2in | nvarchar2 | cstring, oid, integer | normal

public | nvarchar2out | cstring | nvarchar2 | normal

public | nvarchar2recv | nvarchar2 | internal, oid, integer | normal

public | nvarchar2send | bytea | nvarchar2 | normal

public | nvarchar2typmodin | integer | cstring[] | normal

public | nvarchar2typmodout | cstring | integer | normal

public | nvl | anyelement | anyelement, anyelement | normal

public | nvl2 | anyelement | anyelement, anyelement, anyelement | normal

public | sinh | double precision | double precision | normal

public | tanh | double precision | double precision | normal

public | to_multi_byte | text | str text | normal

public | to_single_byte | text | str text | normal

public | varchar2 | varchar2 | varchar2, integer, boolean | normal

public | varchar2_transform | internal | internal | normal

public | varchar2in | varchar2 | cstring, oid, integer | normal

public | varchar2out | cstring | varchar2 | normal

public | varchar2recv | varchar2 | internal, oid, integer | normal

public | varchar2send | bytea | varchar2 | normal

public | varchar2typmodin | integer | cstring[] | normal

public | varchar2typmodout | cstring | integer | normal

(88 rows)

atlas=# \df oracle.*

List of functions

Schema | Name | Result data type | Argument data types | Type

--------+-----------------------+-----------------------------+----------------------------------------------------+--------

oracle | add_days_to_timestamp | timestamp without time zone | oracle.date, bigint | normal

oracle | add_days_to_timestamp | timestamp without time zone | oracle.date, integer | normal

oracle | add_days_to_timestamp | timestamp without time zone | oracle.date, numeric | normal

oracle | add_days_to_timestamp | timestamp without time zone | oracle.date, smallint | normal

oracle | add_months | timestamp without time zone | timestamp with time zone, integer | normal

oracle | btrim | text | character | normal

oracle | btrim | text | character, character | normal

oracle | btrim | text | character, nvarchar2 | normal

oracle | btrim | text | character, text | normal

oracle | btrim | text | character, varchar2 | normal

oracle | btrim | text | nvarchar2 | normal

oracle | btrim | text | nvarchar2, character | normal

oracle | btrim | text | nvarchar2, nvarchar2 | normal

oracle | btrim | text | nvarchar2, text | normal

oracle | btrim | text | nvarchar2, varchar2 | normal

oracle | btrim | text | text | normal

oracle | btrim | text | text, character | normal

oracle | btrim | text | text, nvarchar2 | normal

oracle | btrim | text | text, text | normal

oracle | btrim | text | text, varchar2 | normal

oracle | btrim | text | varchar2 | normal

oracle | btrim | text | varchar2, character | normal

oracle | btrim | text | varchar2, nvarchar2 | normal

oracle | btrim | text | varchar2, text | normal

oracle | btrim | text | varchar2, varchar2 | normal

oracle | dbtimezone | text | | normal

oracle | get_full_version_num | text | | normal

oracle | get_major_version | text | | normal

oracle | get_major_version_num | text | | normal

oracle | get_platform | text | | normal

oracle | get_status | text | | normal

oracle | last_day | timestamp without time zone | timestamp with time zone | normal

oracle | length | integer | character | normal

oracle | lpad | text | bigint, integer, integer | normal

oracle | lpad | text | character, integer | normal

oracle | lpad | text | character, integer, character | normal

oracle | lpad | text | character, integer, nvarchar2 | normal

oracle | lpad | text | character, integer, text | normal

oracle | lpad | text | character, integer, varchar2 | normal

oracle | lpad | text | integer, integer, integer | normal

oracle | lpad | text | numeric, integer, integer | normal

oracle | lpad | text | nvarchar2, integer | normal

oracle | lpad | text | nvarchar2, integer, character | normal

oracle | lpad | text | nvarchar2, integer, nvarchar2 | normal

oracle | lpad | text | nvarchar2, integer, text | normal

oracle | lpad | text | nvarchar2, integer, varchar2 | normal

oracle | lpad | text | smallint, integer, integer | normal

oracle | lpad | text | text, integer | normal

oracle | lpad | text | text, integer, character | normal

oracle | lpad | text | text, integer, nvarchar2 | normal

oracle | lpad | text | text, integer, text | normal

oracle | lpad | text | text, integer, varchar2 | normal

oracle | lpad | text | varchar2, integer | normal

oracle | lpad | text | varchar2, integer, character | normal

oracle | lpad | text | varchar2, integer, nvarchar2 | normal

oracle | lpad | text | varchar2, integer, text | normal

oracle | lpad | text | varchar2, integer, varchar2 | normal

oracle | ltrim | text | character | normal

oracle | ltrim | text | character, character | normal

oracle | ltrim | text | character, nvarchar2 | normal

oracle | ltrim | text | character, text | normal

oracle | ltrim | text | character, varchar2 | normal

oracle | ltrim | text | nvarchar2 | normal

oracle | ltrim | text | nvarchar2, character | normal

oracle | ltrim | text | nvarchar2, nvarchar2 | normal

oracle | ltrim | text | nvarchar2, text | normal

oracle | ltrim | text | nvarchar2, varchar2 | normal

oracle | ltrim | text | text | normal

oracle | ltrim | text | text, character | normal

oracle | ltrim | text | text, nvarchar2 | normal

oracle | ltrim | text | text, text | normal

oracle | ltrim | text | text, varchar2 | normal

oracle | ltrim | text | varchar2 | normal

oracle | ltrim | text | varchar2, character | normal

oracle | ltrim | text | varchar2, nvarchar2 | normal

oracle | ltrim | text | varchar2, text | normal

oracle | ltrim | text | varchar2, varchar2 | normal

oracle | months_between | numeric | timestamp with time zone, timestamp with time zone | normal

oracle | next_day | timestamp without time zone | timestamp with time zone, integer | normal

oracle | next_day | timestamp without time zone | timestamp with time zone, text | normal

oracle | numtodsinterval | interval | double precision, text | normal

oracle | nvl | bigint | bigint, integer | normal

oracle | nvl | numeric | numeric, integer | normal

oracle | round | numeric | double precision, integer | normal

oracle | round | numeric | real, integer | normal

oracle | rpad | text | character, integer | normal

oracle | rpad | text | character, integer, character | normal

oracle | rpad | text | character, integer, nvarchar2 | normal

oracle | rpad | text | character, integer, text | normal

oracle | rpad | text | character, integer, varchar2 | normal

oracle | rpad | text | nvarchar2, integer | normal

oracle | rpad | text | nvarchar2, integer, character | normal

oracle | rpad | text | nvarchar2, integer, nvarchar2 | normal

oracle | rpad | text | nvarchar2, integer, text | normal

oracle | rpad | text | nvarchar2, integer, varchar2 | normal

oracle | rpad | text | text, integer | normal

oracle | rpad | text | text, integer, character | normal

oracle | rpad | text | text, integer, nvarchar2 | normal

oracle | rpad | text | text, integer, text | normal

oracle | rpad | text | text, integer, varchar2 | normal

oracle | rpad | text | varchar2, integer | normal

oracle | rpad | text | varchar2, integer, character | normal

oracle | rpad | text | varchar2, integer, nvarchar2 | normal

oracle | rpad | text | varchar2, integer, text | normal

oracle | rpad | text | varchar2, integer, varchar2 | normal

oracle | rtrim | text | character | normal

oracle | rtrim | text | character, character | normal

oracle | rtrim | text | character, nvarchar2 | normal

oracle | rtrim | text | character, text | normal

oracle | rtrim | text | character, varchar2 | normal

oracle | rtrim | text | nvarchar2 | normal

oracle | rtrim | text | nvarchar2, character | normal

oracle | rtrim | text | nvarchar2, nvarchar2 | normal

oracle | rtrim | text | nvarchar2, text | normal

oracle | rtrim | text | nvarchar2, varchar2 | normal

oracle | rtrim | text | text | normal

oracle | rtrim | text | text, character | normal

oracle | rtrim | text | text, nvarchar2 | normal

oracle | rtrim | text | text, text | normal

oracle | rtrim | text | text, varchar2 | normal

oracle | rtrim | text | varchar2 | normal

oracle | rtrim | text | varchar2, character | normal

oracle | rtrim | text | varchar2, nvarchar2 | normal

oracle | rtrim | text | varchar2, text | normal

oracle | rtrim | text | varchar2, varchar2 | normal

oracle | sessiontimezone | text | | normal

oracle | substr | text | character varying, numeric | normal

oracle | substr | text | character varying, numeric, numeric | normal

oracle | substr | text | numeric, numeric | normal

oracle | substr | text | numeric, numeric, numeric | normal

oracle | substr | text | str text, start integer | normal

oracle | substr | text | str text, start integer, len integer | normal

oracle | subtract | timestamp without time zone | oracle.date, bigint | normal

oracle | subtract | timestamp without time zone | oracle.date, integer | normal

oracle | subtract | timestamp without time zone | oracle.date, numeric | normal

oracle | subtract | double precision | oracle.date, oracle.date | normal

oracle | subtract | timestamp without time zone | oracle.date, smallint | normal

oracle | sysdate | oracle.date | | normal

oracle | to_char | text | timestamp without time zone | normal

oracle | to_date | oracle.date | text | normal

oracle | to_date | oracle.date | text, text | normal

oracle | trunc | numeric | double precision, integer | normal

oracle | trunc | numeric | real, integer | normal

(143 rows)

## Oracle兼容 系統表 視圖:

atlas=# \dv oracle.*

List of relations

Schema | Name | Type | Owner

--------+---------------------------+------+--------

oracle | dba_segments | view | appusr

oracle | product_component_version | view | appusr

oracle | user_cons_columns | view | appusr

oracle | user_constraints | view | appusr

oracle | user_ind_columns | view | appusr

oracle | user_objects | view | appusr

oracle | user_procedures | view | appusr

oracle | user_source | view | appusr

oracle | user_tab_columns | view | appusr

oracle | user_tables | view | appusr

oracle | user_views | view | appusr

(11 rows)

## Oracle兼容 dual表,在PG里用了一個視圖來實現。

atlas=# \dv

List of relations

Schema | Name | Type | Owner

--------+------+------+--------

public | dual | view | appusr

(1 row)

atlas=# \d+ dual

View "public.dual"

Column | Type | Collation | Nullable | Default | Storage | Description

--------+-------------------+-----------+----------+---------+----------+-------------

dummy | character varying | | | | extended |

View definition:

SELECT 'X'::character varying AS dummy;

atlas=# select * from dual;

dummy

-------

X

(1 row)

atlas=# select 1 from dual;

?column?

----------

1

(1 row)

四、實現過程

1.添加自定義類型

orafce添加了varchar2 和nvarchar2兩種類型,varchar2的實現過程如下:

## 自定義類型

/* CREATE TYPE */

CREATE TYPE varchar2 (

internallength = VARIABLE,

input = varchar2in,

output = varchar2out,

receive = varchar2recv,

send = varchar2send,

category = 'S',

typmod_in = varchar2typmodin,

typmod_out = varchar2typmodout,

collatable = true

);

## 創建轉換函數

/* CREATE CAST */

CREATE CAST (varchar2 AS text)

WITHOUT FUNCTION

AS IMPLICIT;

CREATE CAST (text AS varchar2)

WITHOUT FUNCTION

AS IMPLICIT;

CREATE CAST (varchar2 AS char)

WITHOUT FUNCTION

AS IMPLICIT;

...

## 其他varchar2的操作函數:

## 此函數使用pg內核提供的C函數,部分函數會采用orafce動態庫自定義的C函數

CREATE OR REPLACE FUNCTION pg_catalog.substrb(varchar2, integer, integer) RETURNS varchar2

AS 'bytea_substr'

LANGUAGE internal

STRICT IMMUTABLE;

...

2.對date類型增加oracle相關的特性

orafce為postgres的date類型做了增強,盡量減少oracle遷移至postgres的代碼修改量

## 創建oracle對應的date類型:

CREATE DOMAIN oracle.date AS timestamp(0);

## 對oracle.date類型增強操作符支持

CREATE OPERATOR oracle.+ (

LEFTARG = oracle.date,

RIGHTARG = INTEGER,

PROCEDURE = oracle.add_days_to_timestamp

);

CREATE OPERATOR oracle.- (

LEFTARG = oracle.date,

RIGHTARG = INTEGER,

PROCEDURE = oracle.subtract

);

CREATE OPERATOR oracle.+ (

LEFTARG = oracle.date,

RIGHTARG = bigint,

PROCEDURE = oracle.add_days_to_timestamp

);

CREATE OPERATOR oracle.- (

LEFTARG = oracle.date,

RIGHTARG = bigint,

PROCEDURE = oracle.subtract

);

CREATE OPERATOR oracle.+ (

LEFTARG = oracle.date,

RIGHTARG = smallint,

PROCEDURE = oracle.add_days_to_timestamp

);

CREATE OPERATOR oracle.- (

LEFTARG = oracle.date,

RIGHTARG = smallint,

PROCEDURE = oracle.subtract

);

CREATE OPERATOR oracle.+ (

LEFTARG = oracle.date,

RIGHTARG = numeric,

PROCEDURE = oracle.add_days_to_timestamp

);

CREATE OPERATOR oracle.- (

LEFTARG = oracle.date,

RIGHTARG = numeric,

PROCEDURE = oracle.subtract

);

CREATE OPERATOR oracle.- (

LEFTARG = oracle.date,

RIGHTARG = oracle.date,

PROCEDURE = oracle.subtract

);

## 操作符實現(以 date + int 為例):

CREATE OR REPLACE FUNCTION oracle.add_days_to_timestamp(oracle.date,integer)

RETURNS timestamp AS $$

SELECT $1 + interval '1 day' * $2;

$$ LANGUAGE SQL IMMUTABLE;

...

3.用視圖代替oracle的dual虛表

在oracle中,查詢系統變量或者函數返回值時,經常會用到虛表dual。

例如:

select 1 from dual

但是在postgres中,對應的sql為:

select 1

orafce為了兼容oracle的dual用法,添加了一個名為dual的視圖,并授權給public:

CREATE VIEW public.dual AS SELECT 'X'::varchar AS dummy;

REVOKE ALL ON public.dual FROM PUBLIC;

GRANT SELECT, REFERENCES ON public.dual TO PUBLIC;

4.oracle的sysdate實現

在oracle中,提供了部分系統變量,可以通過select獲取其中值。例如oracle的sysdate

## Oracle 數據庫使用

select sysdate from dual

在postgres中,沒有sysdate,為了實現此功能,提供一個oracle.sysdate()函數。實現思路:

CREATE FUNCTION oracle.sysdate()

RETURNS oracle.date

AS 'MODULE_PATHNAME','orafce_sysdate'

LANGUAGE C STABLE STRICT;

COMMENT ON FUNCTION oracle.sysdate() IS 'Ruturns statement timestamp at server time zone';

注意,這個函數是C語言函數,由動態庫實現過程,代碼如下:

/* src:datefce.c */

/********************************************************************

*

* ora_sysdate - sysdate

*

* Syntax:

*

* timestamp sysdate()

*

* Purpose:

*

* Returns statement_timestamp in server time zone

* Note - server time zone doesn't exists on PostgreSQL - emulated

* by orafce_timezone

*

********************************************************************/

Datum

orafce_sysdate(PG_FUNCTION_ARGS)

{

Datum sysdate;

Datum sysdate_scaled;

sysdate = DirectFunctionCall2(timestamptz_zone,

CStringGetTextDatum(orafce_timezone),

TimestampTzGetDatum(GetCurrentStatementStartTimestamp()));

/* necessary to cast to timestamp(0) to emulate Oracle's date */

sysdate_scaled = DirectFunctionCall2(timestamp_scale,

sysdate,

Int32GetDatum(0));

PG_RETURN_DATUM(sysdate_scaled);

}

postgres+orafce的用法:

select oracle.sysdate() from dual

5.語法解析

整個orafce都沒有實現hook的切入。使用extension的用意,估計是為了初始化和掛載so文件。

因為在“create extension orafce”,就會創建所有的自定義類型、函數、字典表等對象。

但是在orafce的源碼中,卻發現了詞法分析和語法分析兩個文件:

image.png

經過代碼分析,語法分析時作為函數調用的,對應的函數為 plvlex.tokens。

其實現過程:

## 創建函數plvlex.tokens,為C語言函數

CREATE SCHEMA plvlex;

CREATE FUNCTION plvlex.tokens(IN str text, IN skip_spaces bool, IN qualified_names bool,

OUT pos int, OUT token text, OUT code int, OUT class text, OUT separator text, OUT mod text)

RETURNS SETOF RECORD

AS 'MODULE_PATHNAME','plvlex_tokens'

LANGUAGE C IMMUTABLE STRICT;

COMMENT ON FUNCTION plvlex.tokens(text,bool,bool) IS 'Parse SQL string';

## C語言實現代碼

Datum

plvlex_tokens(PG_FUNCTION_ARGS)

{

#ifdef _MSC_VER

ereport(ERROR,

(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),

errmsg("plvlex.tokens is not available in the built")));

PG_RETURN_VOID();

#else

FuncCallContext *funcctx;

TupleDesc tupdesc;

TupleTableSlot *slot;

AttInMetadata *attinmeta;

tokensFctx *fctx;

if (SRF_IS_FIRSTCALL ())

{

MemoryContext oldcontext;

List *lexems;

text *src = PG_GETARG_TEXT_P(0);

bool skip_spaces = PG_GETARG_BOOL(1);

bool qnames = PG_GETARG_BOOL(2);

/* 此處調用了語法分析器 */

orafce_sql_scanner_init(CSTRING(src));

if (orafce_sql_yyparse(&lexems) != 0)

orafce_sql_yyerror(NULL, "bogus input");

orafce_sql_scanner_finish();

funcctx = SRF_FIRSTCALL_INIT ();

oldcontext = MemoryContextSwitchTo (funcctx->multi_call_memory_ctx);

fctx = (tokensFctx*) palloc (sizeof (tokensFctx));

funcctx->user_fctx = (void *)fctx;

fctx->nodes = filterList(lexems, skip_spaces, qnames);

fctx->nnodes = list_length(fctx->nodes);

fctx->cnode = 0;

fctx->values = (char **) palloc (6 * sizeof (char *));

fctx->values [0] = (char*) palloc (16 * sizeof (char));

fctx->values [1] = (char*) palloc (1024 * sizeof (char));

fctx->values [2] = (char*) palloc (16 * sizeof (char));

fctx->values [3] = (char*) palloc (16 * sizeof (char));

fctx->values [4] = (char*) palloc (255 * sizeof (char));

fctx->values [5] = (char*) palloc (255 * sizeof (char));

tupdesc = CreateTemplateTupleDesc (6 , false);

TupleDescInitEntry (tupdesc, 1, "start_pos", INT4OID, -1, 0);

TupleDescInitEntry (tupdesc, 2, "token", TEXTOID, -1, 0);

TupleDescInitEntry (tupdesc, 3, "keycode", INT4OID, -1, 0);

TupleDescInitEntry (tupdesc, 4, "class", TEXTOID, -1, 0);

TupleDescInitEntry (tupdesc, 5, "separator", TEXTOID, -1, 0);

TupleDescInitEntry (tupdesc, 6, "mod", TEXTOID, -1, 0);

slot = TupleDescGetSlot (tupdesc);

funcctx -> slot = slot;

attinmeta = TupleDescGetAttInMetadata (tupdesc);

funcctx -> attinmeta = attinmeta;

MemoryContextSwitchTo (oldcontext);

}

funcctx = SRF_PERCALL_SETUP ();

fctx = (tokensFctx*) funcctx->user_fctx;

while (fctx->cnode < fctx->nnodes)

{

char **values;

Datum result;

HeapTuple tuple;

char *back_vals[6];

orafce_lexnode *nd = (orafce_lexnode*) list_nth(fctx->nodes, fctx->cnode++);

values = fctx->values;

back_vals[2] = values[2];

back_vals[4] = values[4];

back_vals[5] = values[5];

snprintf(values[0], 16, "%d", nd->lloc);

snprintf(values[1], 10000, "%s", SF(nd->str));

snprintf(values[2], 16, "%d", nd->keycode);

snprintf(values[3], 16, "%s", nd->classname);

snprintf(values[4], 255, "%s", SF(nd->sep));

snprintf(values[5], 48, "%s", SF(nd->modificator));

if (nd->keycode == -1)

values[2] = NULL;

if (!nd->sep)

values[4] = NULL;

if (!nd->modificator)

values[5] = NULL;

tuple = BuildTupleFromCStrings (funcctx -> attinmeta,

fctx -> values);

result = TupleGetDatum (funcctx -> slot, tuple);

values[2] = back_vals[2];

values[4] = back_vals[4];

values[5] = back_vals[5];

SRF_RETURN_NEXT (funcctx, result);

}

SRF_RETURN_DONE (funcctx);

#endif

}

orafce的函數plvlex.tokens的用法:

atlas=# select * from plvlex.tokens('select * from a.b.c join d ON x=y', true, true);

pos | token | code | class | separator | mod

-----+--------+------+---------+-----------+------

0 | select | 597 | KEYWORD | |

7 | * | 42 | OTHERS | | self

9 | from | 417 | KEYWORD | |

14 | a.b.c | | IDENT | |

20 | join | 464 | KEYWORD | |

25 | d | | IDENT | |

27 | on | 521 | KEYWORD | |

30 | x | | IDENT | |

31 | = | 61 | OTHERS | | self

32 | y | | IDENT | |

(10 rows)

對plvlex.tokens的官方說明:

Package PLVlex

This package isn’t compatible with original PLVlex.

Warning: Keyword’s codes can be changed between PostgreSQL versions! o plvlex.tokens(str text, skip_spaces bool, qualified_names bool) - Returns table of lexical elements in str.

總結

orafce的實現都是基于函數、視圖來實現的。所以如果要做語法兼容,orafce的做法是無法實現的。因為postgres的語法分析在調用視圖和函數之前。必須要在語法分析之前切入hook才能使用extension的實現做語法兼容性。未來postgres也許會提供相應的hook切入點,orafce實現更加完美的oracle兼容性。

總結

以上是生活随笔為你收集整理的oracle中orand使用,Postgres兼容Oracle研究——orafce调研的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

www.成人精品| 99久久精品费精品 | 91在线国内视频 | 久久久久福利视频 | 999国内精品永久免费视频 | 亚洲视频在线视频 | 亚洲资源在线网 | 91亚洲精品久久久 | 欧美另类xxx | 成人在线视频你懂的 | 日韩欧美电影在线 | 国产拍揄自揄精品视频麻豆 | va视频在线| 久久精品电影 | av在线电影网站 | 91亚洲精品国产 | 美女网站在线观看 | 91精品视频免费看 | 久久久亚洲精华液 | 国产高清久久久 | 国产黄色精品 | 狠狠躁夜夜av | 在线免费黄网站 | 国产福利91精品张津瑜 | 欧美日韩国产在线一区 | 欧美另类性 | av片中文| 91九色性视频 | 色婷婷一区 | 国产精品网红直播 | av成人黄色| 亚洲精品乱码久久久久久蜜桃不爽 | 日韩电影中文字幕在线 | 色a网 | 久久爱资源网 | 国产一区视频免费在线观看 | 日韩精品视频一二三 | 丁香久久综合 | 久草精品免费 | 国产在线精品一区 | 精品视频成人 | 欧美日韩在线免费观看 | 91大神精品视频 | 午夜资源站 | www在线观看国产 | 伊人国产在线播放 | 久草视频视频在线播放 | 亚洲国产视频a | 91成人免费在线视频 | 国产精品中文字幕av | 91麻豆国产福利在线观看 | 日韩三级免费观看 | 日韩动漫免费观看高清完整版在线观看 | 3d黄动漫免费看 | 久久99久久99精品免费看小说 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 精品91在线 | 欧美精品久久久久久 | 国产五码一区 | 91成人免费视频 | 欧美在线视频一区二区 | 亚洲影院色 | 91精品啪 | 国产999视频 | 成人午夜电影免费在线观看 | 久久中文字幕在线视频 | 夜夜夜精品 | 久草精品资源 | 国产欧美三级 | 66av99精品福利视频在线 | av三级在线播放 | 激情婷婷丁香 | 51精品国自产在线 | 男女啪啪网站 | 国产麻豆精品久久 | 色综合久久精品 | 悠悠av资源片 | 在线精品视频在线观看高清 | 天天婷婷 | 中文字幕在线视频精品 | 久久短视频 | 日韩特级黄色片 | 日韩美女高潮 | 91久久久久久久一区二区 | 国产又粗又猛又色又黄视频 | 黄色官网在线观看 | 免费观看久久 | 久久久在线免费观看 | 日韩精品无码一区二区三区 | 久久精品亚洲精品国产欧美 | 国产成人一区二区三区免费看 | 成人免费视频播放 | 久久精品国产免费观看 | 91色视频 | 久久96国产精品久久99漫画 | 亚洲国产美女久久久久 | 国产v亚洲v| 日本午夜在线观看 | 黄网在线免费观看 | 97精品国产91久久久久久久 | 国产1级视频 | 国产精品6 | 蜜桃av观看 | 亚洲经典视频 | 69精品人人人人 | 亚洲专区 国产精品 | 日韩视| 中文字幕在线观看网站 | 日日夜夜操操操操 | 久久99久久久久久 | 国产在线探花 | 午夜电影av | 97爱| 日韩福利在线观看 | 日本丶国产丶欧美色综合 | 国产午夜精品一区二区三区欧美 | 黄色av成人在线 | 天天爽天天碰狠狠添 | 欧美日韩国产精品一区二区亚洲 | 99久久精品国产一区二区成人 | 99在线国产 | 高清av网 | 欧美精品xx | 91精品国自产在线观看欧美 | av色网站| 国产群p视频 | 99婷婷 | 日韩在线观看中文字幕 | 五月天丁香综合 | 丝袜美女视频网站 | 国产精品午夜免费福利视频 | 久久视讯 | 992tv在线成人免费观看 | 综合色天天 | 99热国产在线中文 | 麻豆久久久久久久 | 欧美特一级 | 日韩三级视频在线看 | 国产资源免费 | 久久久久免费网 | 日韩三区在线观看 | 久久久精品免费观看 | 国产精品女人久久久 | 视频成人 | 最近的中文字幕大全免费版 | 久久国产成人午夜av影院潦草 | 丁香午夜 | 日韩深夜在线观看 | 欧美精品国产综合久久 | 久久国产高清视频 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 热久久视久久精品18亚洲精品 | 精品成人网 | 麻豆91精品91久久久 | 黄色免费观看 | 精品视频区 | 免费一级日韩欧美性大片 | 日日干天天爽 | 国产精品免费在线播放 | 免费在线观看日韩视频 | 国内精品在线看 | 永久免费的啪啪网站免费观看浪潮 | 99精品免费久久久久久久久日本 | 久久精品99国产精品日本 | 热99在线视频 | 国产精品99免视看9 国产精品毛片一区视频 | 久久不色 | 亚洲精品网页 | 黄色毛片一级 | 超碰免费av | 国产无套精品久久久久久 | 久久伦理影院 | 美女在线观看网站 | 国产一级二级在线观看 | 亚洲午夜精品在线观看 | 日韩在线观看你懂的 | 久久久亚洲网站 | 欧美视频18 | 国产精品1区2区在线观看 | 四虎在线免费视频 | 黄色日本片 | 91新人在线观看 | 久久69精品久久久久久久电影好 | 亚洲精品电影在线 | 97超碰资源站 | 亚洲在线高清 | 国产一级精品绿帽视频 | 深夜国产福利 | 99久久久国产精品 | 久久精品视频一 | www.久久视频 | 久草在线免费资源站 | 人人干人人上 | 一区二区不卡高清 | 蜜桃视频精品 | 在线观看国产福利片 | 成人片在线播放 | 亚洲一级片在线观看 | 国产99久久 | 91麻豆产精品久久久久久 | 人人澡人人爱 | 波多野结衣在线观看一区二区三区 | 精品91视频 | 国产色女 | 91在线视频免费播放 | 国产一区黄色 | 免费福利视频网站 | 黄色国产高清 | 日本黄色免费电影网站 | 密桃av在线 | 久久视频这里有久久精品视频11 | 国产一区二区三区免费视频 | 亚洲综合色婷婷 | 色综合久久88色综合天天6 | 国产精品女主播一区二区三区 | 日韩av不卡在线播放 | 正在播放五月婷婷狠狠干 | 日日干日日操 | 最新av中文字幕 | 国产高清视频免费最新在线 | 日本精品免费看 | 91亚洲国产成人 | 免费在线a| 日韩免费观看一区二区 | 国产精品久久久久久久久久久免费 | 日日干天天操 | 中文字幕精品一区二区三区电影 | 天天色天天射天天综合网 | 中文永久字幕 | 国产精品一区二区在线观看免费 | 亚洲日本va在线观看 | 91精品久久久久 | 又黄又爽免费视频 | 国产精品免费观看网站 | 一区二区精品在线 | 国产美女精品视频 | 色婷婷福利 | 毛片网站在线 | 欧美午夜精品久久久久 | 国产精品视频地址 | 人人揉人人揉人人揉人人揉97 | 狠狠干在线 | 91免费在线播放 | 久久99在线观看 | 久久高清毛片 | 久久在线免费观看 | 在线天堂v | 中文字幕日韩电影 | 成av在线 | 999热视频 | 激情五月看片 | 日日干激情五月 | 久久精品国产亚洲精品2020 | 久久久久久久久免费视频 | 亚洲精品视频在线观看网站 | 国产人免费人成免费视频 | 悠悠av资源片| 成人久久毛片 | 精品视频一区在线观看 | av一区在线播放 | 精品国产一区二区三区四 | 欧美日韩国产mv | 九九精品毛片 | 美州a亚洲一视本频v色道 | 日韩欧美一区二区在线播放 | 欧美片一区二区三区 | av在线收看 | 成人一区影院 | 韩日精品视频 | 久久精品5 | 久久99国产精品久久99 | 99免在线观看免费视频高清 | 日韩av在线免费播放 | 国产伦理一区二区 | 久久久久国产精品免费 | av黄色影院 | 欧美日韩精品电影 | 亚洲蜜桃av | 成人av在线一区二区 | 天天综合网久久综合网 | 欧美巨大 | 天天狠狠 | 国产一级久久久 | 9在线观看免费高清完整版在线观看明 | 手机在线观看国产精品 | 操久久网| 中文字幕久久久精品 | 久草视频在线看 | 国产精品视频app | 日韩中字在线 | 欧美一级电影在线观看 | 久久网页| 四虎国产精品成人免费4hu | 亚洲激情视频在线 | www操操| 亚洲精品视频在线观看免费视频 | 在线观看日韩一区 | 亚洲永久字幕 | 天天干天天上 | 中文字幕在线看视频 | 国产精品 中文在线 | 欧美精品一区二区免费 | 国产成人三级一区二区在线观看一 | 天天想夜夜操 | 色在线中文字幕 | 日p视频在线观看 | 欧美成人猛片 | 国产亚洲人成网站在线观看 | 色五月成人 | 天天射天天操天天干 | 日韩高清在线不卡 | 91精品视频在线观看免费 | 五月天天色 | 国产手机av | 五月婷婷亚洲 | 日韩av看片| 日韩专区一区二区 | 美女黄网久久 | 人人爱人人添 | 九九视频在线 | 深爱激情丁香 | 亚洲国产精彩中文乱码av | 九九免费精品视频 | 亚洲影院天堂 | 久久免费成人网 | 亚洲国产一区在线观看 | 亚洲五月花 | 色视频网址 | 国产精品一二 | 在线免费高清视频 | 天天色婷婷 | av在线影片 | 日韩久久精品一区二区三区 | 免费黄色网止 | 在线免费观看国产黄色 | 五月婷婷综合在线视频 | 精品国产一区二区三区久久 | 国产精品永久 | 午夜精品视频一区 | 五月婷婷色丁香 | 国产免费区 | avove黑丝 | 中文字幕专区高清在线观看 | 国产亚洲视频系列 | 亚洲精品视 | 99re久久精品国产 | 国产在线播放不卡 | 六月丁香激情综合色啪小说 | 国产精品一区二区久久久 | 中文字幕久久亚洲 | 久精品视频 | 欧美一级片免费观看 | 最近中文字幕在线中文高清版 | 超碰97人人在线 | 丁香花在线观看免费完整版视频 | 日韩中文字幕免费在线观看 | 在线观看完整版 | 日韩三级视频在线看 | 亚洲观看黄色网 | 成人高清在线观看 | 91久久精品日日躁夜夜躁国产 | 成人一级| 免费精品国产va自在自线 | 人人看看人人 | 四虎国产精品成人免费影视 | 激情五月婷婷综合 | 中文字幕视频 | 91丨九色丨91啦蝌蚪老版 | 人人干人人爽 | 久草视频免费看 | 日韩电影一区二区三区在线观看 | 99热这里有精品 | 激情久久综合 | 国产99免费视频 | 欧美日韩中文在线视频 | 久久久在线免费观看 | 中文字幕日韩无 | 欧美激情视频在线观看免费 | 在线视频欧美日韩 | 午夜一级免费电影 | 国内99视频| 国产视频资源在线观看 | 婷婷丁香综合 | 国产热re99久久6国产精品 | 欧美一级片免费在线观看 | 国产 精品 资源 | 国产精品普通话 | 999国产| 亚洲日日夜夜 | 精品久久一 | 国产精品理论片 | 欧美一级特黄高清视频 | 在线观看中文字幕2021 | 日韩av黄 | 中文字幕视频网 | av综合网址 | 亚洲成av人片在线观看香蕉 | av午夜电影 | 成年人看片 | 亚洲一区av | 首页国产精品 | 91av成人 | 97在线成人| 日韩免费在线 | 国产免费av一区二区三区 | 国产视频一区在线 | 狠狠干夜夜操天天爽 | 欧美精品一区在线发布 | 色噜噜在线观看 | www夜夜操com | 四虎国产精品成人免费影视 | 美国三级黄色大片 | 国产精品一区二区无线 | 手机看片99 | 日韩av一区二区三区 | 91亚洲在线 | 久草观看视频 | 成年人电影毛片 | 干干干操操操 | 97色视频在线 | 日韩三级精品 | 五月开心色 | 久久人人艹 | 91热爆视频 | 久久综合偷偷噜噜噜色 | 久久精品资源 | 国产在线观看你懂得 | 91禁在线看 | 精品久久久一区二区 | 一区二区三区免费在线观看视频 | 久久96 | 国产精品免费一区二区 | 久久天天躁狠狠躁亚洲综合公司 | 成人黄色小说在线观看 | 在线免费中文字幕 | 永久免费视频国产 | 色瓜 | 亚洲精品动漫成人3d无尽在线 | 99免费在线观看视频 | 国产人在线成免费视频 | 亚洲精品在线资源 | 日韩一级网站 | 久久激五月天综合精品 | 亚洲视频中文 | 亚洲黄色激情小说 | 97久久精品午夜一区二区 | 一区二区视| 久久久黄色| 国产又黄又硬又爽 | 青青河边草免费观看完整版高清 | 色诱亚洲精品久久久久久 | 99精品视频在线观看 | 制服丝袜在线91 | 日韩欧美国产精品 | 在线亚洲成人 | 999电影免费在线观看2020 | 色婷婷久久久 | 国产高清专区 | 久久久久国产精品视频 | 这里只有精品视频在线观看 | 久久午夜色播影院免费高清 | 久久久黄色免费网站 | 天天爽天天做 | 色多多视频在线观看 | 久久第四色 | 99视屏 | 91成人精品一区在线播放 | 久久视讯| 天天操夜夜操夜夜操 | 国产无套精品久久久久久 | 精品一区 在线 | 成人免费网站视频 | 午夜精品一区二区三区在线观看 | 在线播放一区二区三区 | 超碰人人舔 | 免费在线色 | 久久久久亚洲精品中文字幕 | 欧美另类网站 | 草久热 | 国产精品男女啪啪 | 国产麻豆电影 | 911亚洲精品第一 | 久久不卡国产精品一区二区 | 91在线你懂的 | 色婷婷视频 | 国产精品久久久久久久久久新婚 | 人人插人人草 | av看片在线 | 色综合久久88色综合天天 | 欧美日韩不卡一区二区 | 国产在线精品播放 | 日韩精品免费专区 | 国产91aaa | 干干日日| 日韩在线精品视频 | 91精品视频在线观看免费 | 亚洲视频免费在线观看 | 欧美日韩亚洲在线观看 | 成人在线视频论坛 | 在线观看一区视频 | 国产高清无av久久 | 欧美福利视频一区 | 成人一级 | 久久字幕| 四虎在线视频免费观看 | 特级xxxxx欧美| www.看片网站 | 一区二区精品在线观看 | 国产99久 | 天天干天天射天天爽 | 日韩性xxxx| 激情六月婷婷久久 | 91精品国产91久久久久久三级 | 欧美性做爰猛烈叫床潮 | 欧美最猛性xxxxx免费 | 国产精品k频道 | 国产成人三级三级三级97 | 中文在线√天堂 | 久久久99久久 | 国产成人三级三级三级97 | 国产精品国内免费一区二区三区 | 精品在线观看视频 | 玖草影院 | 久久久久久久久久久综合 | 亚洲午夜精品久久久久久久久久久久 | 97超碰资源 | 久久综合狠狠综合久久狠狠色综合 | 中文超碰字幕 | 一区二区三区在线不卡 | 国产亚洲激情视频在线 | 欧美另类xxx | 黄网站色 | 国产在线视频资源 | 日韩免费播放 | 99热在| 国产精品毛片 | 婷色在线 | 亚洲最新在线 | 超碰人人91| 美女啪啪图片 | 91在线视频网址 | 日韩高清 一区 | 欧美日韩亚洲精品在线 | 伊人黄| 久久精品首页 | 久久伊人爱 | 丁香视频免费观看 | 一区二区三区四区五区在线视频 | av在线精品 | 九九九在线观看视频 | 日韩中文在线字幕 | 国产婷婷色 | 中日韩免费视频 | 狠狠色丁香婷婷综合视频 | 色狠狠操 | 五月天久久久久 | 91女神的呻吟细腰翘臀美女 | 国产精品一区二区三区在线 | 精品福利视频在线 | 亚洲免费av电影 | 粉嫩一区二区三区粉嫩91 | 精品亚洲网 | av福利在线导航 | 日日干天天爽 | 狠狠做深爱婷婷综合一区 | 国内精自线一二区永久 | 一区二区三区观看 | 国产黄色片免费观看 | 亚洲精品av中文字幕在线在线 | 麻豆视频免费在线播放 | 91精品在线视频观看 | 国产成人久 | 日本精品一区二区三区在线播放视频 | 日本韩国在线不卡 | 国产在线理论片 | 久草免费在线观看 | 欧美精品久久久久久久久久白贞 | a黄色一级 | 人人射人人 | 久久99亚洲精品 | 国产大片免费久久 | 天天干 天天摸 天天操 | 奇米影视8888 | 免费大片av | 国产成人精品一区二区三区在线 | 97成人在线免费视频 | 免费在线国产 | 一区二区三区免费 | 天天操夜夜拍 | 日韩精选在线观看 | 91亚洲国产成人 | 日韩特黄一级欧美毛片特黄 | 国产成人精品国内自产拍免费看 | 又黄又刺激的网站 | 丰满少妇对白在线偷拍 | 国产一区久久久 | 深爱激情开心 | 激情av五月婷婷 | 国产精品久久二区 | 国产麻豆剧传媒免费观看 | 最近中文字幕国语免费高清6 | 欧美日韩国产网站 | 久久五月情影视 | 日韩成人高清在线 | 中文字幕资源网 | 久热免费| 2019免费中文字幕 | 97碰碰视频| 精品av在线播放 | 综合国产在线 | 亚洲色图激情文学 | 456成人精品影院 | 久久艹免费| 国产成人亚洲精品自产在线 | 国产亚洲精品无 | 日韩精品在线一区 | 波多野结衣一区二区 | 亚洲影视九九影院在线观看 | 亚洲黄色a| 久青草视频在线观看 | 国产字幕在线看 | 久久精彩视频 | 日韩免费在线观看网站 | 在线国产高清 | 亚洲人成网站精品片在线观看 | 日日弄天天弄美女bbbb | 999久久久 | 免费精品视频在线 | 国产精品毛片久久久久久 | 日韩精品在线视频 | 五月天激情开心 | 99精品久久久久久久 | 国产伦精品一区二区三区在线 | 在线看成人片 | 成人av电影免费在线播放 | 国产在线精品二区 | 99久久精品国产欧美主题曲 | 亚洲国产成人av网 | 久久久久网址 | 视频在线一区二区三区 | 久久久久久久久久久国产精品 | 欧美日韩高清一区二区 国产亚洲免费看 | www好男人 | 欧美激情综合五月 | 国产一区视频在线播放 | 狠狠躁日日躁狂躁夜夜躁av | 91视频免费国产 | 国产高清在线不卡 | 国产成人精品在线 | 在线超碰av | 在线精品视频在线观看高清 | 黄色av三级在线 | 中文永久字幕 | 日韩欧美高清 | 女人18精品一区二区三区 | 三级黄色在线 | 国产免费av一区二区三区 | 波多野结衣在线播放视频 | www.色午夜.com| 国产精品成人一区二区 | 色小说在线 | 天天插天天狠 | 成人va在线观看 | 四虎国产精品成人免费影视 | 国产精品久久婷婷六月丁香 | 午夜影院先 | 亚洲国产欧洲综合997久久, | 91精品爽啪蜜夜国产在线播放 | 亚洲欧美在线综合 | 中文一区二区三区在线观看 | 亚洲高清不卡av | www91在线观看 | 日韩黄色一区 | 国产麻豆视频网站 | 日韩欧美一区二区三区在线 | 99精品免费久久久久久久久日本 | 少妇搡bbbb搡bbb搡aa | 亚洲激情av | 色婷婷综合久久久久中文字幕1 | 欧美一级久久久 | 爱色av.com| 中文字幕丝袜 | 精品久久久久久久久久国产 | 黄色精品一区二区 | 99精品国产99久久久久久福利 | 91丨九色丨91啦蝌蚪老版 | 国产成人精品一区二区三区福利 | 国产精品毛片一区视频 | 久久激情综合网 | 在线 国产 日韩 | 精品一区av | 精品成人在线 | 一区二区三区四区免费视频 | 超碰97在线看 | 婷婷久久网站 | 在线观看91| 午夜男人影院 | 在线不卡的av | 一区二区三区日韩视频在线观看 | 亚洲网站在线看 | 国产精品久久久久影视 | 中文字幕日韩伦理 | 久久久久久久久久久久国产精品 | 久久久久成人精品免费播放动漫 | 丰满少妇对白在线偷拍 | 精品免费视频 | 欧美精品免费在线 | 97色噜噜| 国内久久视频 | 亚洲精品在线视频 | 狠狠色伊人亚洲综合网站色 | 欧美激情精品久久久久久免费 | 五月天婷婷在线观看视频 | 91av视频在线观看 | 精品国产99 | 久久这里只有精品视频99 | 色是在线视频 | 最近高清中文字幕 | 国产综合91 | 最近最新最好看中文视频 | 五月导航 | 91精品国产综合久久福利不卡 | 亚洲免费观看在线视频 | 亚洲欧美激情精品一区二区 | 天天综合精品 | 国产伦精品一区二区三区… | 天天色天天操综合网 | 天天射天天射 | 色就是色综合 | 日日操操操| www黄色软件 | 欧美一级专区免费大片 | 成人av电影免费在线播放 | 国产午夜三级 | 亚洲japanese制服美女 | 88av色 | 色干干| 天天色天天干天天 | 日本动漫做毛片一区二区 | 亚洲成人高清在线 | 国产五月| 中文字幕日本在线观看 | 国产护士av| 国产亚洲午夜高清国产拍精品 | 国产午夜精品一区二区三区 | 黄色在线观看免费网站 | 一区二区三高清 | 999久久久久 | 开心色停停 | 中文字幕精品一区二区三区电影 | av在线播放中文字幕 | 亚洲国产69 | 亚洲91精品在线观看 | 国产成人久久久77777 | 亚洲国产精品免费 | 午夜久久福利影院 | 在线国产欧美 | 久久精品国产v日韩v亚洲 | 亚洲香蕉在线观看 | 色国产视频 | 91桃花视频 | 欧美成人在线免费 | 国产又粗又猛又黄又爽的视频 | 天天操天天摸天天射 | 亚洲国产精品一区二区久久,亚洲午夜 | 韩日电影在线免费看 | 日本久久影视 | 成年人av在线播放 | 亚洲1级片| 国产精品毛片一区视频播 | 国产第页| 香蕉在线播放 | 国产精品精 | 天堂网一区 | 香蕉视频啪啪 | 一区二区三区不卡在线 | 五月婷婷导航 | 在线视频国产区 | 人人藻人人澡人人爽 | 亚洲精品九九 | 色视频网页 | 国产成人精品日本亚洲999 | 91九色视频国产 | 人人草在线视频 | 亚洲黑丝少妇 | 国内成人精品2018免费看 | 国产最新精品视频 | 一二区av| 久久 国产一区 | 99久久99久国产黄毛片 | 二区三区在线视频 | 美女国内精品自产拍在线播放 | 伊人视频 | 麻豆91视频 | 国产精品免费在线视频 | 中文字幕日本在线观看 | 狠狠色综合网站久久久久久久 | 国产亚洲精品久久久久久久久久久久 | 免费男女羞羞的视频网站中文字幕 | 中文av在线免费观看 | 伊人伊成久久人综合网小说 | 91网在线 | 天堂av在线免费 | 日韩在线视频播放 | 国产精品久久久久久久久久久久午夜 | 五月婷婷综合激情网 | 中文字幕影片免费在线观看 | 91av在线不卡 | 久久视| av免费网页 | 欧美日本啪啪无遮挡网站 | 在线观看免费色 | 久久伦理电影网 | www.久久久.com | 午夜精品一区二区三区在线 | 综合精品久久久 | 国产免费精彩视频 | 久久精品国产v日韩v亚洲 | 国产精品婷婷午夜在线观看 | 久久久91精品国产 | 一级a毛片高清视频 | 国产精品资源网 | 天天拍天天色 | 午夜性生活片 | 99电影456麻豆| 欧美男男激情videos | 99欧美| 在线国产一区二区 | 国产高清福利在线 | 免费看色视频 | 天天天综合网 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 中文在线www| 欧美日韩在线播放一区 | 麻豆系列在线观看 | 九月婷婷人人澡人人添人人爽 | 人人爽人人爽人人爽 | 国产精品久久久久久久av大片 | 在线观看岛国 | 中文字幕在线日本 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 国产精品久久久久久69 | 天天看天天操 | 久久国产精品一区二区 | 青青五月天 | 最近中文字幕高清字幕免费mv | 亚洲高清网站 | 成人av免费在线 | 亚洲精品大全 | 成人在线播放免费观看 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 国产精品18久久久久久vr | 国产91精品一区二区麻豆网站 | 制服丝袜在线91 | 又黄又色又爽 | 欧美人zozo | 久99久久| 天天曰夜夜操 | 成人av网站在线观看 | 一区二区三区日韩在线观看 | 奇米影视777四色米奇影院 | 日韩在线观看网址 | 国产成人精品区 | 欧美日韩精品区 | 成年人在线视频观看 | 国产综合小视频 | 久久久999免费视频 日韩网站在线 | 久久99久国产精品黄毛片入口 | www色网站 | 播五月婷婷 | 亚洲影院色 | 在线播放亚洲激情 | 超碰在线97免费 | 久久久免费精品 | 国产午夜av | 综合在线观看色 | 香蕉影视app | 亚洲伊人婷婷 | 日韩色中色| 在线观看黄污 | 色鬼综合网 | 成人蜜桃| 97电影院在线观看 | 免费高清在线观看成人 | 91中文视频 | 天天干天天射天天爽 | 五月婷婷操| 国产一级黄 | 日日婷婷夜日日天干 | av电影在线不卡 | 狠狠综合 | 色www.| 久久精品视频观看 | 久久综合中文色婷婷 | 五月婷婷视频在线 | 国产女人40精品一区毛片视频 | 日韩美女免费线视频 | 国产乱对白刺激视频不卡 | 97国产精品久久 | 日本在线视频网址 | 日日夜夜精品视频天天综合网 | 97视频资源 | 视频一区二区三区视频 | 蜜臀aⅴ国产精品久久久国产 | 色欧美88888久久久久久影院 | 亚洲精品女人 | 欧美另类网站 | 91在线播放综合 | 人人澡人人添人人爽一区二区 | 午夜免费久久看 | 国产一级在线免费观看 | 日韩免费在线观看视频 | 91亚洲激情| 三级av在线 | 久久久久久久久久亚洲精品 | www久久 | 国产人在线成免费视频 | 中文字幕精品三级久久久 | 欧美日韩中文视频 | 亚洲国产片色 | 国产精品一区二 | 日韩二区三区在线观看 | 狠狠色噜噜狠狠狠狠 | 久久视频在线视频 | 国产黄色在线观看 | 高清不卡免费视频 | 91精品久久久久久久久久久久久 | www激情com | 天天干天天做天天爱 | 黄色视屏av | 国产精品福利一区 | 亚洲综合视频在线观看 | 欧美一级片免费在线观看 | 国内精品视频久久 | 色七七亚洲影院 | ,午夜性刺激免费看视频 | 国产精品久久久久永久免费 | 国产高清在线看 | 欧美一级专区免费大片 | av在线网站大全 | 欧美日韩国产一区 | 九九在线高清精品视频 | 96av在线视频 | 99久久久国产免费 | 激情久久久久久久久久久久久久久久 | 久久综合9988久久爱 | 日本久草电影 | 日本黄色免费看 | 成人黄色毛片 | 亚洲天堂网在线视频观看 | 亚洲免费av一区二区 | 国产精品v欧美精品v日韩 | 成人黄色一级视频 | 国产一级大片在线观看 | 激情五月亚洲 | 国产精品区免费视频 | 天天爱av导航 | 99视频国产精品 | 999国产在线 | 人人舔人人舔 | 亚洲精色 | 日韩系列| 国产伦理剧 | 欧美专区亚洲专区 | 午夜三级大片 | 久久成人国产 | 日韩欧美高清一区二区 | 中文在线中文资源 | 91精品国产自产91精品 | 久久久久久久久久久影视 | 在线观看av大片 | 日韩在线视频精品 | 国产亚州精品视频 | 最近乱久中文字幕 | 久久免费福利视频 | 精品久久网站 | 亚洲电影自拍 | 国产99久久久久久免费看 | 日本激情动作片免费看 | 摸bbb搡bbb搡bbbb | 国产三级视频在线 | 欧美另类美少妇69xxxx | 久久99在线视频 | 欧美精品国产综合久久 | 国产中文 | 国产福利专区 | 中文字幕在线播放日韩 | 韩日精品在线观看 | 欧美久草视频 | 丰满少妇久久久 | 高潮久久久 | 丁香花在线视频观看免费 | 国产va精品免费观看 | 国产亚洲精品精品精品 | 亚洲 欧洲 国产 日本 综合 | 国产麻豆视频在线观看 | 97超在线视频 | 色综合天天综合网国产成人网 |