Simple DBMS 이영준 개발환경 플랫폼 : Windows 7 32bit 언어 : Java (JavaSE-1.6) 개발툴 : Eclipse Java EE IDE for Web Developers (Indigo Service Release 2) 32bit + Java

Similar documents
InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

강의 개요

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

DBMS & SQL Server Installation Database Laboratory

MySQL-.. 1

Microsoft PowerPoint - 10Àå.ppt

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

슬라이드 1

윈도우시스템프로그래밍

컴파일러

chap 5: Trees

윈도우시스템프로그래밍

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

PowerPoint Presentation

강의 개요

문서 템플릿

Spring Boot/JDBC JdbcTemplate/CRUD 예제

C 프로그램의 기본

Microsoft Word - FunctionCall

금오공대 컴퓨터공학전공 강의자료

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

Microsoft PowerPoint - C++ 5 .pptx

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

10.ppt

<C1A62038B0AD20B0ADC0C7B3EBC6AE2E687770>

Microsoft PowerPoint - additional01.ppt [호환 모드]

OCW_C언어 기초

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint Presentation

TITLE

6장. SQL

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

PowerPoint 프레젠테이션

Lec. 2: MySQL and RMySQL

PowerPoint 프레젠테이션

Lab 3. 실습문제 (Single linked list)_해답.hwp

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

PowerPoint Presentation

설계란 무엇인가?

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

PowerPoint Presentation

Microsoft PowerPoint - Chapter 6.ppt

쉽게 풀어쓴 C 프로그래밍

WINDOW FUNCTION 의이해와활용방법 엑셈컨설팅본부 / DB 컨설팅팀정동기 개요 Window Function 이란행과행간의관계를쉽게정의할수있도록만든함수이다. 윈도우함수를활용하면복잡한 SQL 들을하나의 SQL 문장으로변경할수있으며반복적으로 ACCESS 하는비효율역

untitled

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

PowerPoint Template

13주-14주proc.PDF

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

4S 1차년도 평가 발표자료

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp

JAVA PROGRAMMING 실습 08.다형성

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

쉽게 풀어쓴 C 프로그래밍

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

DocsPin_Korean.pages

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - CSharp-10-예외처리

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

Microsoft PowerPoint Python-DB

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

Microsoft PowerPoint - chap06-5 [호환 모드]

adfasdfasfdasfasfadf

untitled

빅데이터분산컴퓨팅-5-수정

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

구축환경 OS : Windows 7 그외 OS 의경우교재 p26-40 참조 Windows 의다른버전은조금다르게나타날수있음 Browser : Google Chrome 다른브라우저를사용해도별차이없으나추후수업의모든과정은크롬사용 한

Microsoft PowerPoint - [2009] 02.pptx

PowerPoint Presentation

Observational Determinism for Concurrent Program Security

슬라이드 1

Research & Technique Apache Tomcat RCE 취약점 (CVE ) 취약점개요 지난 4월 15일전세계적으로가장많이사용되는웹애플리케이션서버인 Apache Tomcat에서 RCE 취약점이공개되었다. CVE 취약점은 W

슬라이드 제목 없음

Microsoft PowerPoint - additional06.ppt [호환 모드]

Microsoft PowerPoint - QVIZMVUMWURI.pptx

gnu-lee-oop-kor-lec06-3-chap7

JUNIT 실습및발표

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

Data Sync Manager(DSM) Example Guide Data Sync Manager (DSM) Example Guide DSM Copyright 2003 Ari System, Inc. All Rights reserved. Data Sync Manager

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint 자바-기본문법(Ch2).pptx

JVM 메모리구조

쉽게

쉽게 풀어쓴 C 프로그래밍

표준프레임워크로 구성된 컨텐츠를 솔루션에 적용하는 것에 문제가 없는지 확인

Chapter 1

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

C++ Programming

PowerPoint Presentation

슬라이드 1

제목 레이아웃

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

C++ Programming

(Microsoft Word - \301\337\260\243\260\355\273\347.docx)

쉽게 풀어쓴 C 프로그래밊


Transcription:

Simple DBMS 이영준 개발환경 플랫폼 : Windows 7 32bit 언어 : Java (JavaSE-1.6) 개발툴 : Eclipse Java EE IDE for Web Developers (Indigo Service Release 2) 32bit + JavaCC Eclipse Plug-in 1.5.16 + Berkeley DB Java Edition 5.0.34 첨부된파일 실행파일 : DBMS.jar 소스파일 ( 이클립스프로젝트 ) : Eclipse_Project.zip 실행방법 실행파일 DBMS.jar에는버클리DB 라이브러리 (jar) 가함께패키징되어있으므로별도의버클리DB 라이브러리설치과정없이바로실행가능하다. Windows 콘솔에서아래와같이실행가능하다. JavaSE-1.6 기반으로빌드되었으므로 JRE 6 이상의버전에서만동작가능하다. 만약그이하버 전에서실행할경우아래와같은에러가발생한다. 빌드방법 첨부된 Eclipse_Project.zip을압축해제하면이클립스프로젝트폴더 (DBMSProject) 가있다. 이를 JavaCC Plug-in이설치된이클립스에서 Import하여빌드한다. - 1 -

프로그램사용법 SQL_2007-11603> command line에 query를입력한다. 단일 query를입력할수도있고, 여러 query를동시에입력할수도있다. 각 query는 semicolon(;) 으로구분한다. query의문법 / 의미가올바르다면성공메시지가출력된다. query의문법이잘못되었다면아래와같은에러가출력된다. query가 semantic error를갖고있다면각상황에알맞은에러메시지가출력된다. 여러오류를갖고있다면그중하나의에러메시지가출력된다. ( 주로가장먼저검출된에러가출력됨 ) 여러 query를동시에입력한경우순차적으로처리된다. 만약중간 query에서문법오류가발생한다면그앞에있던 query들까지만처리된다. 여러 query를입력한경우결과가아래와같이출력된다. 만약 2 번째 query 에서문법오류가발생한다면아래와같은결과가출력된다. Syntax Error 관련제약 query에사용되는모든키워드는소문자로입력해야한다. 즉, 아래와같은 query는문법에맞다. create table account ( number int, name char(15) ); 하지만아래와같은 query 등은문법에맞지않다. CREATE TABLE account ( number int, name char(15) ); desc account; select, from, where, create, table, is, not, and, or, insert, into, delete, null, desc, drop, show, tables, values, as, primary, foreign, key, into, int, char, date, references, exit는 id로사용될수없다. ( 편의상위문자열들을키워드라부르겠다.) 즉, 아래와같은쿼리는문법오류이다. desc select; select * from TaBle; id는대소문자를구분하지않으므로 TaBle과같은경우도 id가아닌키워드로인식된다. 위키워드들은다른토큰들과붙여서사용할수없다. 즉, 아래와같은 query는문법오류이다., \t, \n, \r 등이 1개이상들어가야한다. select * fromaccount; 혹은 create table account(numberint); - 2 -

그리고 create table 등과같이한토큰이두단어로이루어진키워드의경우단어사이는반드시 space 하나로구분된다. create와 table 사이에 \t, \n, \r이들어가면문법오류이다. deletefrom account where number=1; 여러 query를한번에입력할때마지막 query의끝에개행문자가포함되지않았다면 enter를입력해야마지막 query가처리된다. query의끝에개행문자가포함되었다면콘솔에붙여넣기를하는순간해당 query가수행된다. 즉, 위의경우 enter를입력해야마지막 show tables; 쿼리가처리된다. 괄호, 쉼표, 마침표, 세미콜론의앞뒤에는공백이들어가도되고들어가지않아도된다. a b c 는공백이 2개들어간길이 5인 char string으로인식한다. 1 2 3의경우올바른 int가아니다. int의범위는제한하지않는다. 즉충분히크거나작은정수값을가질수있다. 수식은 <VALUE> 로처리되지않는다. 1234-11-11은 <DATE VALUE> 로처리한다. 달 / 일의범위및윤년처리는하지않는다. <INT VALUE> 는 0으로시작할수있다. query의앞뒤에공백이포함된것은 trim된다. 즉, 아래와같은질의는올바른질의이다. (_ 는공백을뜻한다.) show tables; query는개행문자로구분하여쓸수있다. 즉, 아래와같은 query가가능하다. create table account ( name int, primary key(name) ); 하지만아래와같이 2개이상의단어로이루어진키워드를개행문자로구분해쓸수없다. 반드시 space 하나로구분되어야한다. insert into account values(1); 특히 is [not] null 키워드도한덩어리로인식한다. 즉, 아래와같은 query는문법에러이다. select * from account where name is not null; create table 질의의경우 primary key가반드시입력될필요는없다. 본 parser는 syntax error만을검출한다. semantic error에대해서는검사하지않는다. - 3 -

Semantic Error 관련제약 create table 퀴리 - column name이중복정의된경우 - primary key 절이여러번등장한경우 - foreign key 절에서참조의대상이되는두 column의 type이다른경우 - foreign key 절에서 non primary key를참조하도록설정된경우 - foreign key 절에서존재하지않는 column을참조하도록설정한경우 - foreign key 절에서존재하지않는테이블을참조하도록설정한경우 - foreign key 절에서참조하는 column이현재생성될테이블에정의되지않은경우 - primary key 절에서현재생성될테이블에정의되지않은 column을지정한경우 - char 타입의길이가 0 이하인경우 (1보다작은경우 ) - 이미존재하는테이블이름을사용한경우 - 이때, foreign key 절에서 non primary key를참조하는경우라함은아래와같은경우는예를들어다음과같다. 만약 student 테이블의 primary key가 {id, name} 인경우아래와같은 foreign key 절들은의미오류이다.... foreign key(id) references student(id),...... foreign key(name) references student(name),... 위두절을함께이어쓰더라도의미오류이다. 반드시아래와같이작성해야한다.... foreign key(id, name) references student(id, name)... - 또한존재하지않는테이블을참조하는것이불가능하다고함은, 현재생성되는테이블 ( 자기자신 ) 을참조할수없다는말을내포한다. 자기자신테이블은아직생성완료된것이아니므로참조하는것이불가능하다. 즉, 존재하지않는테이블이다. drop table 쿼리 - 존재하지않는테이블을지정한경우 - 다른테이블에의해참조를받고있는경우 desc 퀴리 : 존재하지않는테이블을지정한경우 show tables 쿼리 : DB에테이블이존재하지않은경우 insert into 쿼리 - column name list가입력되지않은경우반드시모든컬럼의값들을모두기입해줘야한다, 즉, 테이블 A가 id, name 컬럼을갖고있을때 insert into A values(1, LEE ) 는가능하지만 insert into A values(1) 은불가능하다. (InsertTypeMismatchError 에러발생 ) - column name list가입력된경우 column name list에명시되지않은컬럼에는 null 값이쓰여진다. 만약그컬럼이 non-nullable이라면 InsertColumnNonNullableError 에러가발생한다. - 존재하지않는테이블에대해삽입할때 NoSuchTable 에러가발생한다. - 삽입하려는값의타입이 table scheme에등록된해당컬럼의타입과다를때 InsertTypeMismatchError 에러가발생한다. - 존재하지않는컬럼에대해삽입할경우 InsertColumnExistenceError 에러가발생한다. - 4 -

- primary key constraint를어길경우 InsertDuplicatePrimaryKeyError가발생한다. ( 즉, 같은 primary key를갖는 tuple이이미삽입되어있는경우 ) - foreign key constraint를어길경우 InsertReferentialIntegrityError 에러가발생한다. delete from 쿼리 - 존재하지않는테이블에대해삭제할때 NoSuchTable 에러가발생한다. - where절이명시되지않은경우테이블내의모든 tuples에대해삭제를시도한다. - 삭제가완료된후에는삭제에성공한행의개수와실패한행의개수가출력된다. 삭제에실패한이유는 referential integrity 때문이다. 1개행을삭제하는데성공하고 1개행을삭제하는데실패한경우아래와같은메시지가뜬다. - 행이삭제될때에는 cascade update를한다. 즉, 삭제될행을참조하는값을 null로바꿔준다. 만약 non-nullable이라면 referential integrity를어기는것이므로삭제되지않는다 select 쿼리 - 만약해당테이블에 tuples가하나도존재하지않으면아래와같이출력된다. - column 이름을 alias 했다면 alias 된이름으로결과가출력된다. - table 이름을 alias 했다면출력결과역시 alias 된 table 이름으로표시된다. - from절에기입된테이블이름중존재하지않는테이블이있을경우 SelectTableExistenceError 에러가발생한다. - select 뒤에기입된컬럼이름중존재하지않는컬럼이거나, 모호한컬럼인경우 SelectColumnResolveError가발생한다. 모호한컬럼이라함은예를들어 id 컬럼을출력하고자하는데 from절에기입된두테이블이모두 id 컬럼을가질경우를뜻한다. - 5 -

- 두개의다른테이블이같은이름으로 alias 되면아래와같은오류가발생한다. - 두개의다른컬럼이같은이름으로 alias되어도위와같은오류가발생한다. - where절이없으면테이블의모든행이출력된다. create table 쿼리에서 column 정의이전에 primary key, foreign key 절이등장가능하다. 즉, 특정 column 정의이전에그 column에대한 primary key, foreign key 절사용이가능하다. 한 column에대해여러 foreign key 정의가가능하다. drop table 시참조를받고있는테이블은삭제가불가능하다. 그러므로그테이블을참조하는모든테이블을제거한후에는 drop table이가능하다. 예를들어테이블 a를테이블 b, c가참조하고있는경우아래와같은시나리오가가능하다. 특정 column 이 primary key 이면서 foreign key 인경우 desc 시 PRI 만출력된다. - 6 -

상세구현 1: Parser SQLParser 클래스정의 본 parser 의클래스이름은 SQLParser 이며아래와같이정의하였다. 19줄에서 SQLParser 클래스를생성한다. 이때입력을 standard input으로부터받아오도록지정한다. 20줄의 while문을돌며 query를읽어온다. 25줄의 one_line() 함수가한개의 query를읽어오는역할을한다. 유의미한문자열 ( 즉, query) 이들어올때까지 block 되며, 하나의완성된 query가들어온경우문법에맞는지체크한다. 문법체크후리턴된결과는 String 타입의변수 s에저장된다. s 변수값이 exit 라면 exit; 명령이입력된것이므로프로그램을종료한다. 만약그렇지않은경우올바른질의가들어온것이므로적절한메시지를출력한다. 문법체크도중에러가발생했을경우 try~catch 문에의해 32줄혹은 38줄로이동된다. Syntax error 라는메시지를출력하고다음입력을기다리게된다. 상세한에러내용을확인하고싶다면 35줄과 41줄을주석해제하여실행해본다. - 7 -

SKIP 선언 SKIP 절에선언된토큰들은기본적으로인터프리터가토큰을검사하는과정에서생략된다., \t, \r, \n 과같은공백들을무시하게된다. 그러므로 delete from account where name= Peter ; 와같이 query를여러줄에나눠쓰거나토큰사이를여러공백으로띄워쓰는것이가능해진다. <LEGAL_IDENTIFIERS> 토큰정의 본 parser에서가장빈번히쓰이는 token은 <LEGAL_IDENTIFIERS> 이다. <LEGAL_IDENTIFIERS> 는 case-insensitive하며, 미리예약된키워드는 <LEGAL_IDENTIFIERS> 로인식될수없다. 그러므로아래와같이 token을정의하였다. IGNORE_CASE 옵션을지역적으로주어해당 TOKEN 절에서선언된토큰들이대소문자를구분하지않도록지정한다. 139~141줄에는 <LEGAL_IDENTIFIERS> 와그에필요한토큰들이선언되어있다. IGNORE_CASE 옵션을주었으므로 <ALPHABET> 토큰에는소문자만정의해놓으면된다. 112~138줄에는 <LEGAL_IDENTIFIERS> 로인식되어선안되는키워드들이정의되어있다. 인터프리터가토큰들을검사할때 <LEGAL_IDENTIFIERS> 보다위의키워드들의우선순위가높기때문에키워드들을 <LEGAL_IDENTIFIERS> 로인식하지않게된다. 역시 IGNORE_CASE 옵션을주었기때문에해당키워드가대문자를포함하고있더라도 <LEGAL_IDENTIFIERS> 로인식하지않는다. - 8 -

query 를정의하는데쓰이는토큰들 이제 query 구문을정의하는데쓰이는토큰들을설명한다. query를정의하는데쓰이는토큰들이란 키워드 를의미한다. 즉, create table, select, where 등과같이반드시소문자로쓰여야하며이후나오는토큰들과공백으로구분되어야하는키워드토큰들을의미한다. 위에서 <LEGAL_IDENTIFIERS> 를정의할때 <IC_SELECT : select > 와같이키워드들을정의해놓았지만, IGNORE_CASE 옵션을주었기때문에 SELECT * from accout; 와같은 query가가능해진다. 또한키워드들은이후나오는토큰들과공백으로구분되어야하는데, 앞서 SKIP 절에서공백들을생략하겠다고선언했기때문에 selectname from account; 와같은 query가가능해진다. 이를해결하기위해앞서정의하였던 TOKEN 절위에새로운 TOKEN 절을정의해야한다. <#SPACES> 토큰은 SKIP 절에서지정하였던공백들이 1개이상이어진것을의미한다. local token으로지정하여 SKIP 절과중복정의되지않도록한다. <#SPACES_SOME> 토큰은공백들이 0개이상이어진것을의미한다. 63줄의 <DROP_TABLE> 토큰을보면 drop table 키워드를한덩어리로정의한것을볼수있다. 또한맨뒤에 <SPACES> 토큰을붙여 drop table 뒤에반드시 1개이상의공백이등장해야하도록처리하였다. null 과같은키워드는뒤에반드시공백이올필요가없다. 그러므로 <#SPACES_SOME> 토큰을붙였다. 키워드뒤에공백이올필요가없다고해서 <SPACES_SOME> 을생략할경우 129줄에정의하였던 <IC_NULL> 과중복정의된것으로인식된 - 9 -

다. 이미모든단일키워드들이 112~138 줄에정의되어있기때문에반드시위토큰들은 112 줄 위에정의해주어야한다. 그래야만인터프리터가 <IC_...> 꼴의토큰이아닌 query 를위한키워 드토큰으로인식할수있다. 기타토큰들 <NON_QUOTE_CHARACTER>, <NON_QUOTE_SPECIAL_CHARACTERS> 는편의상 <CHAR_STRING> 토큰내에정의하였다. <DATA_TYPE> 의경우 int, char, date 앞에 1개이상의공백이오도록했다. 공백을포함하지않을경우앞서정의한 <INT>, <CHAR> <DATE> 토큰에의해 <DATA_TYPE> 이 unreachable token이될뿐더러 create table account ( numberint ); 와같은 query가가능해지게된다. 그러므로 int, char, date 앞에 1개이상의공백이오도록정의하였다. Productions 앞서소개했던 one_line() Production 은위와같이정의되어있다. query() Production 의 return value (String 타입 ) 를그대로 return 한다. query() Production 뒤에 <SEMICOLON> 이붙은경우 만올바른하나의 query 로인식한다. 만약 <EXIT><SEMICOLON> 인경우 exit 라는문자열을 - 10 -

리턴한다. query() Production 은입력으로들어온문자열이어떤 query 인지를판단한다. 그리고 해당 query 에대한결과문자열을리턴한다. 위그림은 select 질의에대한 productions이다. 다른 query에대한 productions는자명하므로설명은생략한다. select 질의의경우 left-recursion이존재한다. 그러므로 boolean_value_expression(), boolean_term() 을위와같이정의하여 left-recursion을제거하였다. 또한 predicate() 은 LOOKAHEAD를 3으로지정해야한다. LOOKAHEAD를지정하지않은경우 comp_operand() 의정의에의해올바른 predicate() 이들어오더라도 <LEGAL_IDENTIFIERS> 로인식하게된다. 그러므로 LOOKAHEAD를 3으로지정해주어 <LEGAL_IDENTIFIERS> 뒤의토큰들을미리검사하게해야한다. 상세구현 2: Scheme Store and Access SQLParser.jj 에서 data parsing 프로젝트1-1에서구현한 SQLParser.jj를수정하여데이터를파싱할수있게하였다. 기본적으로왼쪽과같이특정토큰을 Token 객체로저장한후 image 멤버변수를읽어들여 String 값을추출한다. 각 Productions에서리턴되는타입은 String, DataType, Column 등으로다양하며 create_table_query() Production 은최종적으로 Table 객체를리턴한다. 이때 Table 객체의값들은 semantic check가완료되지않은상태이다. data parsing을하는동안에는 2가지 semantic error 만으로체크한다. - 11 -

한 foreign key 절에서참조하는 column과참조되는 column의개수가다르면 ReferenceTypeError를발생시키고 (273줄), 또참조되는 key가그테이블의 primary key인지검사한다 (276~278줄). DBManager 클래스관련설명은아래에소개된다. 쿼리처리 Main 클래스에서는 SQLParser 가파싱한쿼리를목적에맞게처리한다. 먼저저장될 DB의이름과 DB Environment의경로는 15~16줄과같다. 18~20줄에서는 Environment 경로가존재하지않으면그디렉토리를생성한다. DB와 Environment는실행파일과같은경로의 db 폴더에저장된다. 그후 while문을돌며 query를계속 standard input으로부터읽어오고각각에맞는처리를한다. - 12 -

위처럼 create table 퀴리를받은경우쿼리의결과로 Table 객체를받는다. 그후 DB를 open하고 (DBManager의생성자 ), DB에테이블을 create한후 DB를닫는다. 그후성공메시지를출력한다. 만약위의과정에서 semantic error가발생한경우 MyDBException이 throw되고, 이를 catch하여적절한에러메시지를출력한다. DB 를추상화하는객체 본프로그램에서는 DB 의각구성요소를쉽게추상화하여표현하고동작시킬수있도록클래스로 정의하였다. 위객체는테이블을추상화하는 Table 클래스이다. 먼저테이블의 name을갖고있고, columns를 HashMap의형태로갖고있다. key는 column name이고 value는 Column 객체이다. primary keys는 ArrayList<String> 으로관리된다. 여러 columns가 primary key를이룰수있기때문이다. referenced는이테이블이 참조받는 것에대한정보이다. 이테이블의특정 column이어떠한테이블의 column에의해참조받고있는지에대한정보가들어있다. 즉, referenced HashMap의 key는이테이블의특정 column name이고, value는 ArrayList<Reference> 이다. Reference 클래스는참조정보를담는클래스로서추후에설명된다. referenced는이테이블이참조를받는것에대한정보이므로이테이블이 create 되는시점에서는빈값을가진다. 이후다른테이블이 foreign key로서이테이블을참조할경우 DB에서이테이블에대한정보가 load된후 referenced에참조정보가기록된후다시 DB에저장된다. referencing은반대로이테이블이 참조하는 것에대한정보이다. 쉽게말해서 foreign keys에대한정보가들어있다. referenced와마친가지로이테이블의특정 column name이 Hash key이고 value는 ArrayList<Reference> 이다. 각 column이어떤테이블의어떤 column을참조하는지를저장해둔다. Reference 클래스의정의는아래와같다. 참조의대상이되는테이블의이름과그테이블의 column name을담고있다. 만약 Reference 객체가 referencing에쓰인다면이때 Reference.table_name은이테이블을 참조하는 테이블이되고, referenced에쓰인다면 참조받는 테이블이된다. 즉, 예를들어... foreign key(id, name) references student(id,name), foreign key(id) references instructor(id) 와같이입력한경우 referencing HashMap은아래와같은형태를띄게된다. - 13 -

Column 클래스는위와같다. column name 와 data type, 그리고 not null 인지여부를담고있다. DataType 클래스는아래와같다. type 은 int, char, date 중하나의문자열을가지며 length 는 char type 인경우 char 길이를 뜻한다. int, date 인경우 length 의값은무의미하다. ForeignKey 클래스의정의는위와같다. 이클래스는데이터파싱시데이터를캡슐화하여손쉽 게이동하는데에만쓰일뿐그이후에는사용되지않는다. Table 클래스의 referenced HashMap 에참조정보가저장되어있기때문이다. create table 매커니즘 우선테이블을생성하려면 DB 를 open 해야한다. 앞서소개된 main 함수에서 DBManager 클래 스의생성자를호출하면 DB 가열린다. 만약 DB 나 Environment 가존재하지않는다면새롭게생성될수있도록 23, 28 줄에서 setallowcreate(true) 하였다. - 14 -

테이블을생성하는것은 DBManager의 createtable() 을호출함으로써수행할수있다. 34줄에서 createtable_check() 는테이블생성시선행되어야할 semantic check를수행한다. 35줄의 setnotnullprimarykey() 는 Table 클래스내에정의된함수로서 primary key인 column은 not null 로설정해준다. semantic error가발생한다면 createtable_check() 함수는내부적으로 MyDBException을 throw하고테이블생성은수행되지않는다. semantic check가완료된후에는 Table 객체를직렬화하여 byte array로변형한후 DB에기록한다. 40줄의 TableToByteArray() 는 Table 객체를직렬화해준다. 42줄에서는테이블이름을 key로등록한다. 이때소문자로변형하여등록해야한다. table name, column name은 case insensitive하므로 key 값으로등록될때에는무조건소문자로변환하여등록하도록했다. 44줄의 putnooverwrite() 함수를이용해 DB에테이블을기록한다. putnooverwrite() 는중복 key가있을경우에러를발생시킨다. 하지만 createtable_check() 함수내에서그와같은 semantic error를검출하므로 putnooverwrite() 의리턴값에대해선고려하지않는다. createtable_check() 함수는코드가길기때문에 line number를이용하여설명한다. 앞서설명했듯이 createtable_check() 는 create table 시의거의대부분은 semantic check를수행한다. 52줄에서는현재 DB에저장된테이블중현재생성하려는테이블과이름이같은것이있는지확인한다. 56~63줄에서는 primary key 절이정의되지않은 column을지정하고있는지확인한다. Table 객체의 pri_keys 리스트는 primary keys의이름을갖고있으므로 Table.hasColumn() 을호출하여각 column이존재하는지검사한다. hascolumn() 함수는특정이름을가진 column이테이블내에존재하는지검사하는함수이다. 물론 case insensitive하게검사한다. 65~94줄에서는 foreign key에대한검사를한다. 즉, Table 객체의 referencing에대해서검사한다. referencing HashMap을순회하면서각 column이제대로정의된 column인지 (71줄), 참조하는테이블이존재하는지 (81~84줄), 참조하는테이블의 column이존재하는지 (88줄), 그테이블의 column과현재테이블의 column의 type이일치하는지 (91줄) 를검사한다. issametypecolumn() 함수는 Table 클래스의멤버함수로서두 column이같은 type인지검사한다. char type의경우 length까지같아야같은 data type으로취급된다. 96줄에서는 Table 객체의 getreferencinginfo() 를호출한다. 이함수는 key로참조되는테이블의이름을갖고 value로그테이블의 column name을갖는 HashMap을리턴한다. Table 객체의 - 15 -

referencing HashMap은자기자신테이블의특정 column name을 key로갖고있기때문에 foreign key constraint를체크하는데사용하기힘들다. 그러므로참조되는테이블의이름을 key 로갖는 HashMap을재생산한것이다. 이 refinfo를이용해참조받는 columns이그테이블의 primary key인지검사한다. 109줄의 isprimarykeys() 함수는 Table 클래스의멤버함수로서 column name의 list를인자로받아자신의테이블의 pri_keys 리스트와비교한다. 두리스트가일치한다면인자로들어온 column name list는 primary key인것이다. 이제모든 constraint 검사가완료되었다. 이제남은작업은 참조받는 테이블의 referenced 정보를업데이트하는것이다. 참조하는테이블에서만참조정보를기억하도록할수도있지만 drop table 시그테이블이참조받고있는지에대한정보를바로알수있게하기위해 referenced 정보를업데이트한다. drop table 시에는그테이블의 referenced HashMap의 size를확인하기만하면된다. 만약 size가 0이라면참조를받고있지않다는뜻이므로 drop table이가능하다. 현재테이블의 referencing 정보를다시읽어들여그테이블의 addreferencedkey() 를호출해 referenced 정보를업데이트한다. 정보를모두업데이트하고난후에는다시 DB에기록해주어야한다.(136줄) 이때는이미 DB에존재하는테이블을다시덮어쓰는것이므로 put 함수를호출한다. 기타쿼리에대한 semantic check에대한소개는위에소개한 create table에서쓰인함수들을이용하는것이므로생략한다. 다만 drop table 시에는그테이블이참조하는테이블의 referenced 정보를삭제해준다. 207~219줄에서는먼저삭제될테이블이참조하고있는테이블들의이름을 list로얻어온다. 그후 22~229줄에서는 list에저장된테이블이름에해당하는테이블들을하나씩 DB에서꺼내 referenced 정보를지운다. 이는 Table 객체의 removereferencedkey() 함수를이용해수행된다. 작업이완료되면그테이블을다시 DB에기록해준다 (229줄). 위작업이모두완료되고난후에야 drop table이수행된다 (233줄). 상세구현 3: Data Insert, Delete and Select where 절 Condition 클래스는조건하나에대한정보를가진다. 즉, 2개의 operand와 1개의 operator에대한정보를가진다. where 절의조건들은 Condition 객체하나를노드로가지는트리로서구성된다. 쿼리파싱을하면서 where 절에대한트리를구성해간다. 2개의 operand는모두 Condition 객체이다. 트리의리프노드는 Predicate 객체이다. Predicate 객체는 and, or, not이아닌단일조건절에대한정보를갖는다. 즉, 등호 / 부등호를이용하는조건절이나 is null / is not null을이용하는조건절이 Predicate이다. 특정 tuple이 where절에제시된조건에부합하는지를체크하기위해 Condition 객체의 eval() 를호출한다. eval() 은내부적으로 left/right operand에대해각각 eval() 을재귀적으로호출한다. eval() 의결과는 TRUE, FALSE, UNKNOWN이다. 두평가결과토대로 operator를통한최종평가 - 16 -

결과를리턴한다. 이렇게재귀적으로평가를수행함으로써구현을간단히할수있다. UNKNOWN으로평가된 tuples는 select 쿼리의결과로출력되지않는다. delete from 쿼리의경우 UNKNOWN으로평가된 tuples는삭제대상에포함되지않는다. Alias select문의 from절에기입된 table name은 alias 될수있다. AliasTable 클래스는 select문에기입된모든 table name에대한 alias 정보를담고있다. 이를이용해 where 절의조건평가시 alais 된 table name을사용할수있다. column name에대한 alais 정보는 AliasCol에저장된다. Cartesian product select문에서는 cartesian product를사용해야한다. 두테이블의 cartesian 결과는특별한이름을갖는테이블로서디스크에임시로저장된다.( 버클리DB 이용 ) 여러테이블을 cartesian 해야할경우앞의두테이블부터차례로 cartesian을수행한다. 중간결과로저장되는임시테이블들은계산과정을거치면서자동으로삭제된다. tuples 의저장 create table문은테이블스키마를디스크에저장하였다. 즉, Project 1-2에서생성된 DB는 table schemes만을담고있다. Project 1-3의 tuples는 table schemes와는독립적으로저장된다. 예를들어테이블 A에대한 tuples를저장할경우 MyDB라는 DB에는 A라는이름으로테이블스키마가저장되고, tuples는 tuples.a라는별도의 DB에저장된다. 테이블스키마만을확인해야하는작업의경우 MyDB에서스키마만을꺼내서확인할수있다. 만약 MyDB에스키마뿐만아니라 tuples가함께저장되어있을경우스키마만필요한작업에대해서도모든 tuples들이포함된테이블을메모리에올려야하므로오버해드가발생한다. 그러므로 tuples를별도에 DB에저장하였다. - 17 -